AnsibleがWindows Serverと通信するための設定

ITのブログ

説明

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となり、リモート制限を無効になります。この記事では設定しないまま進めています。

コメント

タイトルとURLをコピーしました