VMware ESXi上で稼働しているWindowsのWinRM(HTTPS)の有効化をAnsibleで自動化する方法


WindowsをAnsibleから操作するには、現段階だとWinRM経由からとなります。
WinRM(Windows Server 2016/2012)は標準でHTTPSが有効になっていません。
そこで、ansibleのリポジトリで ConfigureRemotingForAnsible.ps1 というスクリプトが用意されています。
これを使えば簡単にHTTP/HTTPSでの接続が有効化できますが、スクリプトの内容通りの証明書しかできなかったりBasic認証が有効化されたりします。
また、以下のような 注意書 きがあります。

The ConfigureRemotingForAnsible.ps1 script is intended for training and development purposes only and should not be used in a production environment, since it enables settings (like Basic authentication) that can be inherently insecure.

要件次第では、自己証明書でも、それぞれ秘密鍵を分けたいとかファイルを管理しておきたいなど出てくるかもしれません。
また、一つ一つWindowsのWinRMを有効化するのも大変です。自動化したいと思ってる人は多いと思います。
そこでここでは、証明書の作成からWinRMのHTTPS有効化までAnsibleを使って自動化する例を書いてみようと思います。
※Ansibleを使うためにAnsibleで自動化するというのも面白いですね 🙂

環境

バージョン情報

項目 バージョン
Ansible 2.8.2
Windows Server 2016
vCenter 6.7.0
ESXi 6.7.0
CentOS 7.6
Python 3.6

登場人物

ホスト名 IP 説明
Windows01 192.168.0.155 WinRMのHTTPSを有効化するホスト
Windows02 192.168.0.156 WinRMのHTTPSを有効化するホスト

処理の流れ

今回やる処理の流れは以下のようになっています。

  • それぞれのサーバの証明書(秘密鍵、CSR、サーバ証明書、PKCS12)を作成
  • PKCS12のインポートおよびWinRMのHTTPSを有効化するpowershellを自動で作成
  • vSphere API経由でWindows Serverにファイル(PKCS12, powershell)を転送
  • vSphere API経由でpowershellを実行
  • Windows Serverに保存したPKCS12とpowershellを削除
  • ネットワーク経由でWinRMを有効化したWindowsの5986ポートリッスンをチェック
  • 最後に win_ping モジュールを使って疎通確認

それでは、実際にやってみましょう 🙂

準備

ansible-vmware-windows-winrm-setupの取得

今回は事前に作ってある ansible-vmware-windows-winrm-setup を使います。
以下のコマンドを実行してクローンしてください。

クローンしたディレクトリへ移動します。

変数ファイルの修正

変数ファイルは以下のように2つあります。

ファイル名 説明
certificate_parameters サーバ証明書関連のパラメーターを定義する変数ファイル
vmware_parameters VMware関連のパラメーターを定義する変数ファイル

それぞれのファイルを次のように修正します。

vmware_parameters修正

vmware_parameters.yml を環境に合わせて修正します。

構造は以下のようになっています。

パラメーター 説明
hostname vCenterのIPまたはホスト名
username vCenterにログインするためのユーザー名
password vCenterにログインするユーザーのパスワード
datacenter WinRMを有効化したいWindows VMが存在するデータセンター名

certificate_parameters修正

certificate_parameters.yml を環境に合わせて修正します。

構造は以下のようになっています。

パラメーター 説明
root_dir 証明書関連ファイルを保存するためのルートディレクトリパス
windows_save_path サーバ証明書やpowershellスクリプトを保存するパス
powershell_absolute_path powershell.exeの絶対パス
certificate_term 自己サーバ証明書の有効期限
ca_certificate_term 自己サーバ証明書にサインするCAの有効期限
server_certificate_parameters 作成するサーバ証明書関連のパラメータをリストで定義
common_name サーバ証明書のコモンネーム($ENV:COMPUTERNAME で表示されるWindowsホスト名)
private_key_password 秘密鍵のパスワード
private_key_chipher 秘密鍵のサイファー
private_key_size 秘密鍵のビット数
friendly_name フレンドリー名(PKCS12)
pfx_password PKCS12のインポートする時のパスワード
vm_name VMware上で認識できる対象のVM名
vm_username ゲストOSにログインするユーザー名
vm_password ゲストOSにログインするユーザーのパスワード

複数作る場合は以下のようにリストを増やします。

ここでは、1年のみ有効な自己証明書をWindows01/Windows02のそれぞれで作成します。

inventory修正

inventory を環境に合わせて修正します。

構造は以下のようになっています。
基本的に ansible_hostansible_password を変更すれば問題ないと思います。

inventoryは疎通確認で使用します。

vmware-guest-file-operationの取得

次に ansible-vmware-windows-winrm-setup をクローンします。
AnsibleのVMwareモジュールで vmware_guest_file_operation があるのですが、バイナリを送ろうとするとエラーが発生したので以前私が作ったものをここでは使います。(おそらくバグかも、後で確認する->バグでPR出てた #57614)

以下のコマンドを実行してvmware-guest-file-operationに実行権限をつけます。

これで、準備が整いました 🙂

必要なモジュールのインストール

次にPlaybookを実行するためのモジュールをインストールします。

WinRMを有効化する

それでは、Playbookを実行してみましょう。

問題なく実行できれば上のように表示されます。
作成されたファイルを確認してみましょう。

コモンネームで設定した名前のディレクトリが作成されて、その中に秘密鍵・CSR・サーバ証明書・PKCS12があることが確認できました。
また、powershellディレクトリには実際にホストで起動したpowershellが保存されます。(デバッグ用とか)

以下は実際にコマンドを実行したものになります。
色々見えてしまう都合上、ここでは loop_controllabel で表示する項目を制御しています。

asciicast

最後に

このようにVMwareの環境では、WindowsでAnsibleを使うためにAnsibleでWinRMのHTTPSを有効化の自動化ができました。
例えば、VMware基盤上に数百台から数千台のWindowsサーバがあってAnsibleで自動化するためにWinRMのHTTPSを有効化してほしいと依頼されても、こういうやり方をすれば自動で出来ますね 🙂

ハッピーオートメーション!

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください