Windowsに対してAnsibleを実行してみる

概要

  • Windowsに対してAnsibleを実行する方法について記載します

Table of Contents

環境

  • OS
  • Ansible
    • 2.15.9

Windowsへの接続要件を確認する

サポート対象のWindowsバージョン確認

PowerShellのバージョン確認

  • PowerShellのバージョンはPowerShellで下記のコマンドを実行することで確認できます
    • エラーが出る場合はWinRMサービスが起動していないことが想定されるため、Windows Remote Managementを起動しているかご確認ください
PS C:\Users\Administrator> winrm enumerate winrm/config/Listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 127.0.0.1, 192.168.48.138, ::1, fe80::902f:4d50:638f:38e%14

.Net Frameworkのバージョン確認

PS C:\Users\Administrator> $release = Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release
PS C:\Users\Administrator> switch ($release) {
>>     { $_ -ge 533320 } { $version = '4.8.1 or later'; break }
>>     { $_ -ge 528040 } { $version = '4.8'; break }
>>     { $_ -ge 461808 } { $version = '4.7.2'; break }
>>     { $_ -ge 461308 } { $version = '4.7.1'; break }
>>     { $_ -ge 460798 } { $version = '4.7'; break }
>>     { $_ -ge 394802 } { $version = '4.6.2'; break }
>>     { $_ -ge 394254 } { $version = '4.6.1'; break }
>>     { $_ -ge 393295 } { $version = '4.6'; break }
>>     { $_ -ge 379893 } { $version = '4.5.2'; break }
>>     { $_ -ge 378675 } { $version = '4.5.1'; break }
>>     { $_ -ge 378389 } { $version = '4.5'; break }
>>     default { $version = $null; break }
>> }
PS C:\Users\Administrator>
PS C:\Users\Administrator> if ($version) {
>>     Write-Host -Object ".NET Framework Version: $version"
>> } else {
>>     Write-Host -Object '.NET Framework Version 4.5 or later is not detected.'
>> }
.NET Framework Version: 4.8

AnsibleでWindowsに接続

winrmモジュールのインストール

  • Windowsへ接続するためにAnsibleサーバにpywinrmモジュールが必要のためインストールします
pip install pywinrm

インベントリの準備

  • Windowsに接続するための情報を記載したインベントリを作成
---
all:
  hosts:
    Win2022:
      ansible_host: 192.168.48.138
      ansible_user: Administrator
      ansible_password: P@ssword
      ansible_connection: winrm
      ansible_port: 5985
      ansible_winrm_transport: ntlm
    win10:
      ansible_host: 192.168.48.139
      ansible_user: hii
      ansible_password: hii
      ansible_connection: winrm
      ansible_port: 5985
      ansible_winrm_transport: ntlm

Playbookの準備

  • Windowsへの接続を確認するためのPlaybookを作成
---
- name: Windows connection test
  hosts: all
  gather_facts: false
  tasks:
    - name: Ping
      win_ping:

Playbook実行

ansible-playbook -i inventory.yml main.yml

PLAY [Windows connection test] ***********************************************************************************************************************************************************************

TASK [Ping] ******************************************************************************************************************************************************************************************
ok: [Win2022]
ok: [win10]

PLAY RECAP *******************************************************************************************************************************************************************************************
Win2022                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
win10                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Windows 10へ実行した際のエラー

  • Windows 10に対して実行した際に下記のエラーが出力されました
fatal: [win10]: UNREACHABLE! => {
    "changed": false,
    "msg": "ntlm: the specified credentials were rejected by the server",
    "unreachable": true
}
  • 結果としてWindows 10のネットワーク接続の種類がPublicになっているとNGらしく、Privateに変更することで解消できました

さいごに

  • httpでの接続ですが無事接続することができました。
  • httpsで接続する場合は証明書を準備したりと手間はかかりますがより安全に接続することができるので要件に合わせて実施してみてください