パソコン練習日記

やってみたことを記録しています。Bloggerからこちらに引っ越して来ました。一部、画像がリンク切れしていますがひとつひとつ直すのは心が折れたのでそのままにします。

AnsibleからWindowsへ接続できるまでの記録

ActiveDirectoryたてたり、言語が英語のを日本語化したり、Ansibleで自動化してみたいのはいろいろありまして、

Ansibleを学習することに。

しかし、最初の段階、接続するまででそこそこしんどかった

 

ちなみにWinRM設定は何もしていない状態。

OSインストールしてからそのまま。

WindowsServerの2016も2019も、WinRMは最初から有効だった。

公式のWindows ホストのセットアップのページとかあるけど

そんなのやってない。

githubにあるConfigureRemotingForAnsible.ps1を実行とか紹介されているけど、

そんなファイル無いし。404 Not Foundなんだし。

 

ということでWinRM設定はそのままで行く感じ。

まずは、インベントリファイルを作成。

よくわからんので、まずはこんな感じにして

192.168.10.122

[windows:vars]
ansible_user=Administrator
ansible_password=
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_server_cert_validation=ignore

 

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

[windows:vars]
ansible_user=Administrator
ansible_password=
ansible_connection=winrm
ansible_winrm_transport=http
ansible_winrm_server_cert_validation=ignore

 

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

[windows:vars]
ansible_user=Administrator
ansible_password=
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_scheme=http
ansible_winrm_server_cert_validation=ignore

 

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

[windows:vars]
ansible_user=Administrator
ansible_password=
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_scheme=http
ansible_port=5985
ansible_winrm_server_cert_validation=ignore

 

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認証に

192.168.10.122

[windows:vars]
ansible_user=Administrator
ansible_password=
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_scheme=http
ansible_port=5985
ansible_winrm_server_cert_validation=ignore

 

うまくいった。

winrmの設定を変更するのではなく、

こっちが正解かな。