アフィリエイト広告を利用しています
この記事でわかること
- AnsibleでWindowsをリモート管理するためのWinRM設定
- VMware環境をAnsibleで自動構築する方法
vmware_guestモジュールの限界とPowerCLI併用パターン- 実運用でハマりやすいエラーと回避策
このブログ記事について
AnsibleとVMwareを組み合わせると、Windowsサーバーの構築・設定・VM作成までを一括で自動化できます。
しかし、Linuxと比べてWindows環境やvCenter APIにはいくつか落とし穴があります。
この記事では、筆者が実際の運用現場で試行錯誤した「Ansible × Windows × VMware」の自動化構成と、その際に遭遇した問題・回避策を実例付きで解説します。
AnsibleでWindowsを操作するための準備
✅ 必要な環境
WindowsホストをAnsibleで制御するためには、事前に以下を整備する必要があります:
・WinRM(Windows Remote Management)の有効化
・PowerShell 3.0 以上
・.NET Framework 4.0 以上
・pywinrm のインストール(Ansibleコントロールノード側)
✅ WinRMの設定手順(Windows側)
Windows側では、Ansibleからの接続を許可するためにWinRMを構成します。
# PowerShell(管理者権限)
winrm quickconfig
winrm set winrm/config/service/Auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
💡 セキュリティのため、本番環境ではHTTPS(5986)ポートを使い、
自己署名証明書を発行して暗号化通信を行いましょう。
✅ Ansibleから疎通確認
Ansibleの接続確認は win_ping モジュールで行います。
- name: WinRM connection test
hosts: windows
tasks:
- name: Ping Windows host
win_ping:
接続が成功すれば、AnsibleでWindowsコマンドを実行できる状態です。
以下は、Ansible側のインベントリです。
[windows]
<Windowsの解決可能なホスト名かIPアドレス>
ansible_user=<Windows側のユーザ名>
ansible_password=<Windows側ユーザのパスワード>
ansible_port=5986 #HTTPなら5985
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
Windowsモジュール使用時の注意
2024年7月時点でのWindowsモジュール一覧は以下になります。
Community.Windows — Ansible Community Documentation
(私の場合は、当時のPJでこれらのモジュールを使うことがほとんど無く、win_shellモジュールでひたすらPowershellコマンドや、後述のPowerCLIを書いてました。。。
コマンドを書いている際には、複数行で記載しないと分かりづらい場面もあるので
win_shell : |
と始めるのが吉です。)
⚙️ 管理者権限が必要な操作の回避策
Windowsでは、一部のPowerShellコマンド(例:Set-NetAdapterChecksumOffload)が
リモートからの実行では権限エラーになります。
その回避策として、「スケジュールタスクを作成して実行後に削除」する手法が有効です。
https://docs.ansible.com/ansible/2.9_ja/user_guide/windows_usage.html
– name: Disable checksum offload via scheduled task win_scheduled_task: name: DisableChecksum actions: – path: powershell.exe arguments: Set-NetAdapterChecksumOffload -Name “Ethernet” -TxChecksumOffload Disabled state: present run_level: highest register: result – name: Run and delete the task win_shell: | Start-ScheduledTask -TaskName DisableChecksum Start-Sleep -Seconds 5 Unregister-ScheduledTask -TaskName DisableChecksum -Confirm:$false
VMwareをAnsibleで自動構築する
✅ 基本:vmware_guest モジュール
VMwareの仮想マシンをAnsibleで扱うには、vCenter APIを利用します。
そのため、コントロールノードに pyvmomi を導入しましょう。
pip install pyvmomi
モジュールの基本例:
- name: Create a virtual machine on given ESXi hostname
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
~~~
delegate_to: localhost
⚠️ vmware_guest の限界とPowerCLIの併用
vmware_guest では、細かな操作(再起動優先順位、データストアのアンマウント、DRS設定など)が行えない場合があります。
そのようなケースでは、PowerCLIをAnsible経由で呼び出すのが現実的です。
- name: Change VM startup priority using PowerCLI
delegate_to: localhost
shell: |
pwsh -Command "
Connect-VIServer -Server {{ vcenter_host }} -User {{ vcenter_user }} -Password {{ vcenter_pass }}
Get-VM 'win-server-01' | Set-VM -StartPolicy High
Disconnect-VIServer -Confirm:$false
"
💬 注意:PowerCLI使用時は TLS 接続エラーを防ぐため、
Set-PowerCLIConfiguration -InvalidCertificateAction Ignoreを事前に設定します。
https://it-study.info/powershell-ssl-tls-error/
🧠 よくあるエラーと回避策
| エラー内容 | 原因 | 対応策 |
|---|---|---|
winrm connection refused | WinRMが無効 or ポート開放されていない | winrm quickconfig で再設定 |
Server certificate verification failed | vCenter証明書未登録 | validate_certs: no を一時的に使用 |
Unauthorized (401) | 資格情報誤り or 権限不足 | vCenterロールの確認(仮想マシン作成権限が必要) |
Cannot complete login due to an incorrect user name or password | AD連携環境での認証形式不一致 | domain\\user 形式でログイン |
🧩 Ansible × VMware 自動化のベストプラクティス
ログとモニタリング設計
タスクの失敗ログを明確に出力し、再実行に備える。
foreachを使ってループさせることも可。
https://tech-mmmm.blogspot.com/2020/05/powercliesxi.html
Ansibleモジュールを優先的に利用
可能な限り vmware_guest, win_service, win_package などで冪等性を保つ。
PowerCLIは補助的に
APIでできない領域のみPowerCLIに委ねる。
証明書・認証の管理を安全に
機密情報は ansible-vault で暗号化。
役割(roles)で分離
Windows操作とVMware操作を別roleに分けて再利用性を高める。
参考文献
AnsibleでWindows Serverを操作するには
https://qiita.com/yrs8/items/a536ebaca082d2ea9bba
Exastro IT AutomationでWindows Serverの自動設定をやってみた
https://qiita.com/ooif/items/4598d005483ef24bf5af
Windows ホストのセットアップ
https://docs.ansible.com/ansible/2.9_ja/user_guide/windows_setup.html
データストアのアンマウント
community.vmware.vmware_host_datastore module – Manage a datastore on ESXi host — Ansible Community Documentation
仮想マシン監視や再起動の優先順位等を仮想マシンごとに設定
https://developer.vmware.com/docs/powercli/latest/vmware.vimautomation.core/commands/set-vm/#DefaultSet
仮想マシン設定に使用できるオブジェクト VirtualMachineConfigSpec を作成して設定も可能。
https://communities.vmware.com/t5/VMware-PowerCLI-Discussions/Set-CDDrive-IDE-Mode/td-p/2005941
おわりに
少しニッチな設定箇所を触っているなあと、自身でも思いながら経験談を書かせていただきました。。
インフラ系のエンジニアも、自動化のためのコーディングやスクリプティングの機会が多くなり
こんな設定どうやって自動化するの??と悩んでいるエンジニアの方の助けになればと思います。

コメント