こんにちは!
BFT名古屋支店の、佐野です。
以前の記事でAnsibleにてWindowsの構成管理を行なう内容をお送りしたと思います。
Ansibleにおいては、その記事に記載の手順を行なえばWindowsの構成管理ができるようになりますが、もう一手間が必要になります。
筆者が初めてAnsibleでWindowsの構成管理をしようとした時、それを行なっていなかったことが原因で解決に悩むことになりました。
おそらくAnsibleでWindows構成管理を初めて行う時に少なからずひっかかるポイントかと思いますので、そのポイントと原因、解決手順をこの記事にてお送りいたします。
はじめに:AnsibleでWindowsに接続できない
例えば以前の記事で紹介したWindowsUpdateの実行を行なうPlaybookを作成し、インベントリもぽちぽちと作った上で実行したとします。
すると「管理対象にSSH接続できないよ!」というエラーが出てくるかと思います。
実際筆者はこれを行ない、同じようにエラーを突き付けられました。
いやいや、対象はWindowsだし、SSH接続じゃなくてWinRM接続じゃないとだし、WinRM接続を行なうための設定も全部したじゃないか…
という感じでぐぬぬとなりましたが、ここが落とし穴だったのです。
AnsibleはとりあえずSSH接続しようとする
AnsibleはWinRM接続が許可されていようと、管理対象に接続する時はとりあえずSSH接続をしようとします。
当然と言えば当然ではありますが、Ansibleは「接続する管理対象がLinuxかWindowsか」ないし「管理対象にはSSH接続すべきかWinRMに接続すべきか」を判断する事ができません。
AnsibleはSSH接続による構成管理を想定しており、WinRMによる管理はどちらかといえば(サポートこそされていますが)例外と言えます。
ので、Windowsに向けてPlaybookを実行する場合は、Ansibleに「管理対象はWindowsだよ」「WinRMを使って接続するよ」ということを教えてあげなくてはいけません。
またSSH接続を行なう場合で設定したような鍵認証もWinRMを行なうための設定では行っていませんので、WinRMを行なうための認証情報についてもPlaybookを実行する際にAnsibleへ与えなくてはいけません。
そしてそういった管理対象の情報をAnsibleに指示するには、インベントリにその内容を記述する必要があります。
WindowsにWinRMで接続するための変数と認証情報を入れる
インベントリでは管理対象となるホスト(ターゲットノード)を特定するためにIPやホスト名を記入しますが、その他に「管理対象に接続する際に使用する変数」を設定することもできます。
例えば以下のように記述することで、clientserversグループとして指定されたターゲットノードに対しては記述された認証情報を使ってWinRM接続が行なわれるようになります。
[clientservers] 192.168.10.200 [clientservers:vars] ansible_user=Administrator ansible_password=bft1234 ansible_connection=winrm ansible_port=5986
また、以上のように接続のための情報だけを設定した場合、今度はPythonのSSL証明書検証でひっかかる為、これを回避するために「ここで使用する証明書は有効なCAから発行されないので、検証しないで」ということを宣言する必要があります。
それを記述した状態が以下となります。
[clientservers] 192.168.10.200 [clientservers:vars] ansible_user=Administrator ansible_password=bft1234 ansible_connection=winrm ansible_port=5986 ansible_winrm_server_cert_validation=ignore
さいごに:AnibleTowerでWinRM接続を指定する
以上がAnsibeでWindowsの管理対象へWinRM接続を行なうためのインベントリの設定になります。
Windowsの構成管理を行なう場合は、インベントリにこれらの設定を忘れずに記入するようにしてください。
うっかり忘れてしまうと、Playbookが悪いのか、設定をし忘れたのか、など切り分けで引っ掛かることもなくはないです。
またAnsibleTowerやAWXを使う場合、このWinRMで接続するための変数は“インベントリ”の変数部分で指定します。
Windowsへ接続する際の認証情報は、そのまま接続情報に記述することになるため、この違いを留意しておくとよいかと思います。
実際にAnsibleTowerのインベントリにWinRM接続用の変数を記述した例は以下となります。
(Ansible単体の場合と違い、portは5986を使うのであれば指定しなくてもOKです)