ActiveDirectoryたてたり、言語が英語のを日本語化したり、Ansibleで自動化してみたいのはいろいろありまして、
Ansibleを学習することに。
しかし、最初の段階、接続するまででそこそこしんどかった
ちなみにWinRM設定は何もしていない状態。
OSインストールしてからそのまま。
WindowsServerの2016も2019も、WinRMは最初から有効だった。
公式のWindows ホストのセットアップのページとかあるけど
そんなのやってない。
githubにあるConfigureRemotingForAnsible.ps1を実行とか紹介されているけど、
そんなファイル無いし。404 Not Foundなんだし。
ということでWinRM設定はそのままで行く感じ。
まずは、インベントリファイルを作成。
よくわからんので、まずはこんな感じにして
win_pingを実行
192.168.10.122 | UNREACHABLE! => {
"changed": false,
"msg": "basic: HTTPSConnectionPool(host='192.168.10.122', port=5986): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f64caba0f40>, 'Connection to 192.168.10.122 timed out. (connect timeout=30)'))",
"unreachable": true
}
なんかHTTPSで接続しにいっているっぽい。
WinRMにHTTPS使うのって、証明書必要じゃなかったっけ?
とりあえずWindows側を確認。
winrm enumerate winrm/config/Listener
HTTPで受付している。
HTTPSにするのは、証明書作ったりめんどくさそうなので、とりあえずHTTPでいいや。
なんやかんや調べて、ansible_winrm_transportをhttpにしてみる。
192.168.10.122 | FAILED! => {
"msg": "The installed version of WinRM does not support transport(s) ['http']"
}
とりあえずhttpにはなったっぽい。
が、WinRMがHttpをサポートしていないって言っている。
はぁ?さっき、Httpで受け付けているの確認したんだけど?
念のため、ほかのWindowsServerからwinrsでhttp接続し、ipconfig
winrs -r:http://192.168.10.150:5985/wsman -u:Administrator -p:パスワード ipconfig
ふつうに返ってくる。
つまりhttpで問題ない。おかしいのはAnsible側。
でも、"The installed version of WinRM does not support transport(s) ['http']"を検索してもそんなにヒットしない。
みんなこんなところで躓いていないってこと?
ansible_winrm_transportをbasicに
ansible_winrm_scheme=httpを追加。
192.168.10.122 | UNREACHABLE! => {
"changed": false,
"msg": "basic: HTTPConnectionPool(host='192.168.10.122', port=5986): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fa624b84f40>, 'Connection to 192.168.10.122 timed out. (connect timeout=30)'))",
"unreachable": true
}
まぁ、ダメか。くらいに思っていたけど、よく見てみるとhttpで、httpsの5986番ポートに接続に行ってる。httpは5985番ポート。
5985番ポートへ行ってもらうためにansible_port=5985を追加。
192.168.10.122 | UNREACHABLE! => {
"changed": false,
"msg": "basic: the specified credentials were rejected by the server",
"unreachable": true
}
エラーが変わった。basicはダメっぽい。
basicって何や、って調べたらそのまんまbasic認証( ユーザー名とパスワードがBase64で送信するやつ)だった。
WindowsServer側でwinrmの設定を確認
winrm get winrm/config/service
Basicはfalseですね。いちおう、試しにBasic有効にしてみる。
winrm set winrm/config/service/auth '@{Basic="true"}'
で、再実行。
192.168.10.122 | UNREACHABLE! => {
"changed": false,
"msg": "basic: the specified credentials were rejected by the server",
"unreachable": true
}
なんでだよ。
よくよく調べてみると、AllowUnencryptedがfalseだからダメっぽい。
AllowUnencryptedをtrueに変更。
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
いったー
でも、もう少しだけセキュアに。
もう一度、AllowUnencryptedとAuthのBasicをfalseに戻す。
念のため、失敗するか確認
OK。戻った。
そして、インベントリを変更。
ansible_winrm_transportをntlm認証に
うまくいった。
winrmの設定を変更するのではなく、
こっちが正解かな。