WindowsをAnsibleで操作する
- 2025/03/15
概要
Ansibleを使用して、Windowsマシンを操作するための最低限必要な設定と操作手順
使用した環境
操作したいマシン(Windows)
- Windows Server 2019
- OSを新規インストールした状態
Ansibleを実行するマシン(Linux)
- 操作対象ごとにAnsible実行環境を作成したいので、Ansible Navigator を使用する
Installing ansible-navigator with execution environment support
https://ansible.readthedocs.io/projects/navigator/installation/
- Dockerをインストールしておく
Windowsの設定
穴開け用スクリプトを作成
AnsibleからWindowsにアクセスするための設定を行う。
https://docs.ansible.com/ansible/latest/os_guide/windows_winrm.html#winrm-setup
を参考に、穴開け用のPowerShellスクリプトを作成する。
HTTPSでのみアクセスするため、穴開けはHTTPS用のみ実施する。
- ¥path¥to¥HTTPS_listener.ps1
# Create self signed certificate
$certParams = @{
CertStoreLocation = 'Cert:\LocalMachine\My'
DnsName = $env:COMPUTERNAME
NotAfter = (Get-Date).AddYears(1)
Provider = 'Microsoft Software Key Storage Provider'
Subject = "CN=$env:COMPUTERNAME"
}
$cert = New-SelfSignedCertificate @certParams
# Create HTTPS listener
$httpsParams = @{
ResourceURI = 'winrm/config/listener'
SelectorSet = @{
Transport = "HTTPS"
Address = "*"
}
ValueSet = @{
CertificateThumbprint = $cert.Thumbprint
Enabled = $true
}
}
New-WSManInstance @httpsParams
# Opens port 5986 for all profiles
$firewallParams = @{
Action = 'Allow'
Description = 'Inbound rule for Windows Remote Management via WS-Management. [TCP 5986]'
Direction = 'Inbound'
DisplayName = 'Windows Remote Management (HTTPS-In)'
LocalPort = 5986
Profile = 'Any'
Protocol = 'TCP'
}
New-NetFirewallRule @firewallParams
Windows上でスクリプトを実行
作成したPowerShellスクリプトを、操作したいWindowsマシンで実行する
PS C:\Users\Administrator\path\to> .\HTTPS_listener.ps1
wxf : http://schemas.xmlsoap.org/ws/2004/09/transfer
a : http://schemas.xmlsoap.org/ws/2004/08/addressing
w : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
lang : ja-JP
Address : http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters : ReferenceParameters
Caption :
Description : Inbound rule for Windows Remote Management via WS-Management. [TCP 5986]
ElementName : Windows Remote Management (HTTPS-In)
InstanceID : {f7c8f0c5-9b6e-4ffc-9264-74fcf9db2d4e}
CommonName :
PolicyKeywords :
Enabled : True
PolicyDecisionStrategy : 2
PolicyRoles :
ConditionListType : 3
CreationClassName : MSFT|FW|FirewallRule|{f7c8f0c5-9b6e-4ffc-9264-74fcf9db2d4e}
ExecutionStrategy : 2
Mandatory :
PolicyRuleName :
Priority :
RuleUsage :
SequencedActions : 3
SystemCreationClassName :
SystemName :
Action : Allow
Direction : Inbound
DisplayGroup :
DisplayName : Windows Remote Management (HTTPS-In)
EdgeTraversalPolicy : Block
EnforcementStatus : NotApplicable
LocalOnlyMapping : False
LooseSourceMapping : False
Owner :
Platforms : {}
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
PrimaryStatus : OK
Profiles : 0
RuleGroup :
Status : 規則は、ストアから正常に解析されました。 (65536)
StatusCode : 65536
PSComputerName :
Name : {f7c8f0c5-9b6e-4ffc-9264-74fcf9db2d4e}
ID : {f7c8f0c5-9b6e-4ffc-9264-74fcf9db2d4e}
Group :
Profile : Any
Platform : {}
LSM : False
Ansibleの設定
Ansible実行環境の設定
Ansible Navigatorを使用してAnsibleを実行する環境の設定を行う。
winrm
とpsrp
の両方でWindowsへ接続可能なことを確認するため、
Pythonパッケージのpywinrm
とpypsrp
をインストールする。
collectionは、Windowsの操作に使用するものをインストールする。
- /path/to/execution-environment.yml
version: 3
images:
base_image:
name: ghcr.io/ansible-community/community-ee-base:2.18.1-1
dependencies:
ansible_core:
package_pip: ansible-core
ansible_runner:
package_pip: ansible-runner
system:
- unzip
python:
- pywinrm
- pypsrp
galaxy:
collections:
- name: ansible.windows
- name: community.windows
-
使用するcollectionの仕様
Ansible実行環境を作成
以下のコマンドで、Ansible実行環境のコンテナイメージを作成する
cd /path/to
ansible-builder build --tag local/ansible4win:2.18.1-1
inventoryを作成
操作したいWindowsマシンのIPアドレス、認証情報の設定を行う。
winrm
を使用する場合とpsrp
を使用する場合で設定が異なる。
(winrm用)
- /path/to/inventories/hosts
[win]
114.51.48.10
[win:vars]
ansible_user=administrator
ansible_password=nandemo
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore
winrmの各種パラメータの仕様
https://ansible.fontein.de/collections/ansible/builtin/winrm_connection.html
(psrp用)
- /path/to/inventories/hosts
[win]
114.51.48.10
[win:vars]
ansible_user=administrator
ansible_password=nandemo
ansible_connection=psrp
ansible_psrp_auth=ntlm
ansible_psrp_cert_validation=ignore
psrpの各種パラメータの仕様
https://ansible.fontein.de/collections/ansible/builtin/psrp_connection.html
playbookを作成
Windows Serverを新規インストールした状態ではpingは通らないため、
動作確認用playbookは、whoami
コマンドを実行させ、その出力を表示する定義で作成した。
- /path/to/playbooks/cmd.yml
---
- hosts: all
gather_facts: false
tasks:
- name: Exec command
win_command: whoami
register: return_whoami
- name: Debug output
debug:
msg: "{{ return_whoami }}"
Ansible Navigatorの設定
使用するAnsible実行環境の各種設定を行う。
Ansible Navigator実行時に、毎回inventoryを指定するのが面倒なので、使用するinventoryを指定しておく。
- /path/to/ansible-navigator.yml
# # cspell:ignore cmdline, workdir
---
ansible-navigator:
ansible:
inventory:
help: False
entries:
- ./inventories/hosts
execution-environment:
image: local/ansible4win:2.18.1-1
logging:
level: critical
mode: stdout
time-zone: Japan
Ansible Navigatorでplaybookを実行
以下のコマンドでAnsibleを実行
ansible-navigator run --ep playbooks/cmd.yml
PLAY [all] *************************************************************************************************************
TASK [Exec command] ****************************************************************************************************
changed: [114.51.48.10]
TASK [Debug output] ****************************************************************************************************
ok: [114.51.48.10] => {
"msg": {
"changed": true,
"cmd": "whoami",
"delta": "0:00:00.093775",
"end": "2025-02-19 08:06:18.816572",
"failed": false,
"rc": 0,
"start": "2025-02-19 08:06:18.722797",
"stderr": "",
"stderr_lines": [],
"stdout": "win-24gakusei\\administrator\r\n",
"stdout_lines": [
"win-24gakusei\\administrator"
]
}
}
PLAY RECAP *************************************************************************************************************
114.51.48.10 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
参考
AnsibleでWindowsサーバーを設定してみた-環境準備編-
https://blog.jbs.co.jp/entry/2023/05/30/135558