Contents
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 を使います。
以下のコマンドを実行してクローンしてください。
1 2 |
(venv) $ git clone https://github.com/sky-joker/ansible-vmware-windows-winrm-setup.git |
クローンしたディレクトリへ移動します。
1 2 |
(venv) $ cd ansible-vmware-windows-winrm-setup/ |
変数ファイルの修正
変数ファイルは以下のように2つあります。
1 2 3 4 |
vars/ |-- certificate_parameters.yml `-- vmware_parameters.yml |
ファイル名 | 説明 |
---|---|
certificate_parameters | サーバ証明書関連のパラメーターを定義する変数ファイル |
vmware_parameters | VMware関連のパラメーターを定義する変数ファイル |
それぞれのファイルを次のように修正します。
vmware_parameters修正
vmware_parameters.yml
を環境に合わせて修正します。
1 2 |
(venv) $ vi vars/vmware_parameters.yml |
構造は以下のようになっています。
1 2 3 4 5 6 |
--- hostname: vCenter IP username: administrator@vsphere.local password: secret datacenter: DC |
パラメーター | 説明 |
---|---|
hostname | vCenterのIPまたはホスト名 |
username | vCenterにログインするためのユーザー名 |
password | vCenterにログインするユーザーのパスワード |
datacenter | WinRMを有効化したいWindows VMが存在するデータセンター名 |
certificate_parameters修正
certificate_parameters.yml
を環境に合わせて修正します。
1 2 |
(venv) $ vi vars/certificate_parameters.yml |
構造は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# certificate directory. root_dir: certificate # windows windows_save_path: C:\Users\Administrator\Desktop powershell_absolute_path: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe # Parameters to sign a certificate. certificate_term: +365d ca_certificate_term: +365d # Parameters to csr files. server_certificate_parameters: - common_name: WINDOWS01 private_key_password: password private_key_chipher: des3 private_key_size: 2048 friendly_name: ansible pfx_password: password vm_name: Windows01 vm_username: Administrator vm_password: secret |
パラメーター | 説明 |
---|---|
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
(snip) # Parameters to csr files. server_certificate_parameters: - common_name: WINDOWS01 private_key_password: password private_key_chipher: des3 private_key_size: 2048 friendly_name: ansible pfx_password: password vm_name: Windows01 vm_username: Administrator vm_password: secret - common_name: WINDOWS02 private_key_password: password private_key_chipher: des3 private_key_size: 2048 friendly_name: ansible pfx_password: password vm_name: Windows02 vm_username: Administrator vm_password: secret |
ここでは、1年のみ有効な自己証明書をWindows01/Windows02のそれぞれで作成します。
inventory修正
inventory
を環境に合わせて修正します。
1 2 |
(venv) $ vi inventory |
構造は以下のようになっています。
基本的に ansible_host
と ansible_password
を変更すれば問題ないと思います。
1 2 3 4 5 6 7 8 9 10 |
[windows] windows01 ansible_host=192.168.0.155 ansible_user=Administrator ansible_password=secret windows02 ansible_host=192.168.0.156 ansible_user=Administrator ansible_password=secret [windows:vars] ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5986 ansible_winrm_server_cert_validation=ignore |
inventoryは疎通確認で使用します。
vmware-guest-file-operationの取得
次に ansible-vmware-windows-winrm-setup をクローンします。
AnsibleのVMwareモジュールで vmware_guest_file_operation があるのですが、バイナリを送ろうとするとエラーが発生したので以前私が作ったものをここでは使います。(おそらくバグかも、後で確認する->バグでPR出てた #57614)
1 2 |
(venv) $ git clone https://github.com/sky-joker/vmware-guest-file-operation.git |
以下のコマンドを実行してvmware-guest-file-operationに実行権限をつけます。
1 2 3 4 |
(venv) $ pip install -r vmware-guest-file-operation/requirements.txt (venv) $ mv vmware-guest-file-operation/vmware-guest-file-operation.py . (venv) $ chmod +x vmware-guest-file-operation.py |
これで、準備が整いました 🙂
必要なモジュールのインストール
次にPlaybookを実行するためのモジュールをインストールします。
1 2 |
(venv) $ pip install pyOpenSSL pyvmomi pywinrm |
WinRMを有効化する
それでは、Playbookを実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(venv) $ ansible-playbook main.yml -i inventory (snip) TASK [Wait for listening on 5986 port.] ********************************************************************************************************************************************************* ok: [windows02 -> localhost] ok: [windows01 -> localhost] TASK [Win Ping.] ******************************************************************************************************************************************************************************** ok: [windows02] ok: [windows01] PLAY RECAP ************************************************************************************************************************************************************************************** localhost : ok=13 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 windows01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 windows02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
問題なく実行できれば上のように表示されます。
作成されたファイルを確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(venv) $ tree certificate/ certificate/ |-- WINDOWS01 | |-- WINDOWS01.crt | |-- WINDOWS01.csr | |-- WINDOWS01.key | `-- WINDOWS01.pfx |-- WINDOWS02 | |-- WINDOWS02.crt | |-- WINDOWS02.csr | |-- WINDOWS02.key | `-- WINDOWS02.pfx `-- powershell |-- WINDOWS01.ps1 `-- WINDOWS02.ps1 |
コモンネームで設定した名前のディレクトリが作成されて、その中に秘密鍵・CSR・サーバ証明書・PKCS12があることが確認できました。
また、powershellディレクトリには実際にホストで起動したpowershellが保存されます。(デバッグ用とか)
以下は実際にコマンドを実行したものになります。
色々見えてしまう都合上、ここでは loop_control
の label
で表示する項目を制御しています。
最後に
このようにVMwareの環境では、WindowsでAnsibleを使うためにAnsibleでWinRMのHTTPSを有効化の自動化ができました。
例えば、VMware基盤上に数百台から数千台のWindowsサーバがあってAnsibleで自動化するためにWinRMのHTTPSを有効化してほしいと依頼されても、こういうやり方をすれば自動で出来ますね 🙂
ハッピーオートメーション!