MENU

AnsibleでWindowsとVMwareを自動構築する方法【WinRM & PowerCLI対応】

アフィリエイト広告を利用しています

この記事でわかること

  • 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 refusedWinRMが無効 or ポート開放されていないwinrm quickconfig で再設定
Server certificate verification failedvCenter証明書未登録validate_certs: no を一時的に使用
Unauthorized (401)資格情報誤り or 権限不足vCenterロールの確認(仮想マシン作成権限が必要)
Cannot complete login due to an incorrect user name or passwordAD連携環境での認証形式不一致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

おわりに

少しニッチな設定箇所を触っているなあと、自身でも思いながら経験談を書かせていただきました。。
インフラ系のエンジニアも、自動化のためのコーディングやスクリプティングの機会が多くなり
こんな設定どうやって自動化するの??と悩んでいるエンジニアの方の助けになればと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

社会人10年目、IT業界6年目のインフラエンジニア
大学では数学系を専攻し、新卒で鉄道会社の電気技術職に従事
もっと自身が活躍できるところへと思い転職、現在に至る
Ansible、AWS CDK、TerraformとIaC案件の経験が多め

コメント

コメントする

読みたい場所へジャンプ