説明
AnsibleがWindows Serverと通信するために、Windows Remote Management(WinRM)を使用します。WinRMはHTTPSを使用した通信が可能となりますが、本記事ではHTTPを使用した通信について記載します。なお、Ansible Documentationで開発環境用としてWinRMを自動で設定するスクリプトが用意されていますので、そちらを使う方が楽に設定できると思います。HTTPSを使用した通信については、手順が確認できたら記事にしたいと思います。
前提
・WindowsのバージョンはWindows Server 2022とする。
Windows Server側の手順
IPアドレスとホスト名の設定
以下のコマンドでAnsibleと通信するIPアドレスとホスト名を設定します。Windowsのホスト名とインベントリのホスト名が合っていないとwin_pingでエラーが出力されるため、事前にWindowsホスト名設定します。
1.Powershellを起動する。 2.IPアドレスを設定する。 Get-NetAdapter | New-NetIPAddress -AddressFamily IPv4 -IPAddress <IPアドレス> -PrefixLength <Prefix> -DefaultGateway <ゲートウェイ> 3.ホスト名を設定(強制的に再起動する) Rename-Computer -NewName "<ホスト名>" -Force -Restart
WinRMサービスのHTTP通信を許可
Windows Server 2022では、デフォルトでWinRMの通信許可(リスナー)が設定されています。Windows Server 2016では設定されていませんので、winrm quickconfigコマンドを実行する必要があります。以下コマンドでWinRMサービスの平文認証と暗号化無し通信を許可します。
1.WinRMの暗号化無し通信を許可する。 winrm set winrm/config/service '@{AllowUnencrypted="true"}' 2.平文の認証を許可する。 winrm set winrm/config/service/auth '@{Basic="true"}' 3.以下コマンドでAllowUnencryptedとBasicがTrueであること確認する。 winrm get winrm/config/service -----実行結果----- Service RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD) MaxConcurrentOperations = 4294967295 MaxConcurrentOperationsPerUser = 1500 EnumerationTimeoutms = 240000 MaxConnections = 300 MaxPacketRetrievalTimeSeconds = 120 AllowUnencrypted = true Auth Basic = true Kerberos = true Negotiate = true Certificate = false CredSSP = false CbtHardeningLevel = Relaxed DefaultPorts HTTP = 5985 HTTPS = 5986 IPv4Filter = * IPv6Filter = * EnableCompatibilityHttpListener = false EnableCompatibilityHttpsListener = false CertificateThumbprint AllowRemoteAccess = true -----実行結果-----
Ansible側の手順
AnsibleがWinRMで通信するためのパッケージのインストールと設定をする必要があります。手順を以下に記載します。
1.pywinrmをインストールします。 pip3 install pyrinrm ※オフライン環境の場合は、pypi.orgからパッケージをダウンロードし、上から順にインストールします。 ・ntlm_auth-1.5.0-py2.py3-none-any.whl ・charset_normalizer-2.0.7-py3-none-any.whl ・urllib3-1.26.7-py2.py3-none-any.whl ・idna-3.3-py3-none-any.whl ・certifi-2021.10.8-py2.py3-none-any.whl ・requests-2.26.0-py2.py3-none-any.whl ・requests_ntlm-1.1.0-py2.py3-none-any.whl ・six-1.16.0-py2.py3-none-any.whl ・xmltodict-0.12.0-py2.py3-none-any.whl ・pywinrm-0.4.2-py2.py3-none-any.whl 2.以下コマンドを実行します。 vi /etc/ansible/hosts 3.以下のパラメータを追記します。 [Windows] <Windowsのホスト名> ansible_hosts=<IPアドレス> [windows:vars] ansible_ssh_user=administrator ansible_ssh_pass=<パスワード> ansible_ssh_port=5985 ansible_connection=winrm ansible_winrm_server_cert_validation=ignore 4.以下コマンドを実行します。 vi /etc/hosts ※通信したいサーバのホスト名を名前解決できるようにします。
動作確認
Ansibleのwin_pingモジュールで通信の確認をします。
1.以下のコマンドで通信を確認する。 ansible <ホスト名> -i hosts -m win_ping -----実行結果----- win | SUCCESS => { "changed": false, "invocation": { "module_args": { "data": "pong" } }, "ping": "pong" } -----実行結果-----
その他
winrm quickconfigを実行について
Windows Remote Managementを構成するためにwinrm quickconfigコマンドがありますが、本記事では実行せず進めています。本コマンドで変更される内容で確認できた点は以下の通りとなります。
- WinRMサービスの起動
サービス画面 の「Windows Remote Management (WS-Management)」 が実行中となり、サービスの種類が自動起動となります。なお、Windows Server 2022は規定で自動起動となっています。
- WinRMのリスナーの設定
WinRMと通信するためのリスナー設定がされます。なお、Windows Server 2022は規定で設定されています。Windows Server 2016では、設定されていないことが確認できています。
- ファイアウォールの設定
WindowsファイアウォールにWinRMのデフォルトのポート(5985)を許可する設定がされます。 なお、Windows Server 2022は規定で設定されています。
- LocalAccountTokenFilterPolicy の設定
レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System」にREG_DWARDでLocalAccountTokenFilterPolicyが設定されます。値は1となり、リモート制限を無効になります。この記事では設定しないまま進めています。
コメント