「WindowsはGUIで管理するもの」という常識を疑え。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、Moleculeを使った自動テストとCI/CD連携について解説しました。
さて、ここまではLinuxサーバー(AlmaLinux)を対象にしてきましたが、企業のインフラには必ずと言っていいほど「Windows Server」が存在します。
Active Directory、ファイルサーバー、WSUS、レガシーな業務アプリ…。
これらを管理するために、わざわざリモートデスクトップ(RDP)で接続し、マウスでポチポチ設定していませんか?
先生、まさに今、それで泣きそうです。
Windows Server 2022を10台セットアップしてるんですけど、RDPは重いし、アップデートの再起動待ちで一晩中監視しなきゃいけないし…。
「AnsibleってLinux専用でしょ?」って先輩に言われたんですけど、Windowsは無理なんですか?
その先輩の知識は5年前で止まってるわね。
現在のAnsibleはWindowsの管理機能が非常に強力よ。
WinRM という仕組みを使えば、LinuxからWindowsを裏側から自由に操作できるの。
マウスを捨てて、WindowsもPlaybookで管理する時代へ行きましょう!
本記事では、Linux上のAnsibleからWindows Serverを操作するための接続設定、Windows専用モジュールの使い方、そしてPowerShellスクリプトとの高度な連携テクニックまでを徹底解説します。
🚀 Ansible応用講座(全8回)
現在地:【第6回】Windowsも支配する。WinRM接続とPowerShell操作の完全ガイド
- 【第1回】静的ファイルは捨てろ。Dynamic InventoryによるAWS/クラウド環境の自動追従
- 【第2回】ロジックを極める。Loop制御、Block例外処理、Jinja2フィルタの魔術
- 【第3回】爆速化チューニング。Forks、Pipelining、Mitogenによるパフォーマンス改善
- 【第4回】標準機能で足りないなら。PythonによるCustom Module開発入門
- 【第5回】品質を保証する。MoleculeによるRoleの自動テストとCI連携
- 【第6回】Windowsも支配する。WinRM接続とPowerShell操作の完全ガイド
- 【第7回】ネットワーク機器の自動化。Cisco/Juniperスイッチの設定管理
- 【第8回】新時代の実行環境。Ansible Builder/RunnerによるExecution Environment (EE)
第1章:Windows操作の仕組み「WinRM」とは?
Linux同士ならSSHで接続しますが、Windowsには標準でSSHサーバーが入っていません(最近はOpenSSHも入りますが、Ansibleではまだ一般的ではありません)。
代わりに使われるのが WinRM (Windows Remote Management) です。
WinRMの特徴
- プロトコル: HTTP (5985) または HTTPS (5986) を使用するSOAPベースのプロトコル。
- エージェントレス: Windowsに標準搭載されている機能なので、専用エージェントのインストールは不要。
- PowerShell: AnsibleはWinRM経由でPowerShellコマンドを送り込み、実行させます。
コントロールノード側の準備
Linux側のAnsibleがWinRMを話せるように、Pythonライブラリ pywinrm をインストールする必要があります。
pip install pywinrm
第2章:ターゲットノード(Windows)の準備
ここが最初の難関です。
Windowsはデフォルトでは「外部からのWinRM接続」を受け付けていません。
以下のPowerShellスクリプトを実行して、WinRMを有効化(リスナー作成、Firewall許可)する必要があります。
設定スクリプトの実行
Ansible公式が提供している ConfigureRemotingForAnsible.ps1 を使うのが最も確実です。
Windows上のPowerShell(管理者権限)で以下を実行します。
$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1" $file = "$env:temp\ConfigureRemotingForAnsible.ps1" (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) powershell.exe -ExecutionPolicy ByPass -File $file
これで、HTTPポート(5985)とHTTPSポート(5986)が開放され、Basic認証などが有効化されます。
⚠️ セキュリティの注意点
上記のスクリプトは開発・検証用として「Basic認証」を許可する設定を含んでいます。
本番環境では、HTTPS (5986) のみを許可し、適切な証明書を使用するか、Active Directory環境下であればKerberos認証を使用することを強く推奨します。
第3章:インベントリ設定と疎通確認
Windowsへの接続情報は、Linuxとは大きく異なります。group_vars/windows.yml などに以下のように記述します。
接続変数の設定
# group_vars/windows.yml ansible_user: Administrator ansible_password: "YourStrongPassword123!" ansible_connection: winrm ansible_port: 5986 ansible_winrm_server_cert_validation: ignore # オレオレ証明書を許可 ansible_winrm_transport: ntlm # または basic, credssp, kerberos
疎通確認 (win_ping)
Linux用の ping モジュールではなく、Windows専用の win_ping を使います。
ansible windows -i inventory.yml -m win_ping
成功時の出力:
192.168.1.100 | SUCCESS => {
"changed": false,
"ping": "pong"
}
これが返ってくれば、勝利したも同然です。
第4章:Windows専用モジュール(win_*)の活用
AnsibleにはWindows操作専用の win_ プレフィックスがついたモジュールが多数用意されています。
これらはLinux用モジュールとは使い勝手が異なるため、主要なものを押さえておきましょう。
1. 機能の追加 (win_feature)
「サーバーマネージャー」で役割や機能を追加する操作です。
IIS(Webサーバー)をインストールする例です。
- name: Install IIS (Web-Server)
ansible.windows.win_feature:
name: Web-Server
state: present
include_management_tools: yes
register: iis_install
- name: Reboot if needed
ansible.windows.win_reboot:
when: iis_install.reboot_required
プロの技: Windowsはインストール後に再起動が必要なケースが多いです。戻り値の reboot_required をチェックして、win_reboot モジュールを呼ぶのが定石です。
2. ファイル操作 (win_copy / win_template)
ファイルの配置はLinuxと同じ感覚で使えますが、パスの区切り文字に注意が必要です。
- name: Deploy index.html
ansible.windows.win_copy:
src: files/index.html
dest: C:\inetpub\wwwroot\index.html
※AnsibleのYAML内では、バックスラッシュ \ はエスケープが必要な場合があるため、スラッシュ / を使っても多くの場合は動きますが、Windowsらしさを保つなら \\ と書くか、シングルクォートで囲みましょう。
3. サービス管理 (win_service)
サービスの起動・停止です。
- name: Start IIS Service
ansible.windows.win_service:
name: W3SVC
state: started
start_mode: auto
4. パッケージ管理 (win_package / win_chocolatey)
MSIやEXEインストーラーを実行する場合は win_package を使いますが、IDの指定などが面倒です。
おすすめは、Windows版のyum/aptである Chocolatey を使う方法です。
- name: Install Google Chrome via Chocolatey
chocolatey.chocolatey.win_chocolatey:
name: googlechrome
state: present
第5章:PowerShellスクリプトとの連携
標準モジュールで足りない場合、LinuxならShellスクリプトを使いますが、Windowsでは当然 PowerShell です。win_shell モジュールを使います。
基本的な実行
- name: Get Network Info
ansible.windows.win_shell: Get-NetAdapter | Select-Object Name, InterfaceDescription
register: net_info
- name: Show Info
debug:
var: net_info.stdout_lines
【重要】冪等性の担保
PowerShellを実行すると、常に Changed になってしまいます。
「特定のファイルが存在しない時だけ実行する」などの制御が必要です。
- name: Run custom script
ansible.windows.win_shell: C:\Scripts\SetupApp.ps1
args:
creates: C:\App\installed.flag # このファイルがあれば実行しない
💡 プロのノウハウ:Double Hop 問題 (CredSSP)
AnsibleからPowerShellを実行し、そのスクリプトの中で「別のファイルサーバー」へアクセスしようとすると、「アクセス拒否」で失敗することがあります。
これはWindowsの認証仕様による “Double Hop” 問題です。
これを回避するには、認証方式を credssp に変更し、委任設定を行う必要があります。
初心者が最もハマるポイントなので、外部リソースへのアクセスが必要な場合は「CredSSP」で検索してください。
第6章:【実践】IIS Webサーバー構築 Playbook
それでは、これらを組み合わせて「IISをインストールし、Webサイトを公開する」Playbookを作成しましょう。
site.yml
---
- name: Setup IIS Web Server
hosts: windows
gather_facts: yes
tasks:
- name: Install IIS Web-Server
ansible.windows.win_feature:
name: Web-Server
state: present
include_management_tools: yes
register: iis_install
- name: Reboot if required
ansible.windows.win_reboot:
when: iis_install.reboot_required
- name: Remove default IIS files
ansible.windows.win_file:
path: C:\inetpub\wwwroot\iisstart.htm
state: absent
- name: Deploy Custom Index Page
ansible.windows.win_copy:
content: "Hello from Ansible on Windows!
"
dest: C:\inetpub\wwwroot\index.html
- name: Ensure W3SVC is running
ansible.windows.win_service:
name: W3SVC
state: started
start_mode: auto
- name: Open Firewall Port 80
community.windows.win_firewall_rule:
name: HTTP
localport: 80
action: allow
direction: in
protocol: tcp
profiles: domain,private,public
state: present
これを実行すれば、RDPを開くことなく、ブラウザからアクセス可能なWebサーバーが完成します。
第7章:Windows Updateの自動化という悪夢からの解放
Windows管理者にとって最大の苦行、それが「Windows Update」です。
「ダウンロードして、インストールして、再起動して、また確認して…」という作業を、Ansibleは win_updates モジュール1つで全自動化してくれます。
完全自動アップデートのタスク
- name: Install all security updates
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
state: installed
reboot: yes # 必要なら勝手に再起動してくれる!
reboot_timeout: 3600 # 再起動の待機時間(秒)
register: update_result
- name: Show update details
debug:
var: update_result
reboot: yes を指定すると、Ansibleはアップデート適用後に再起動が必要なら再起動を行い、OSが立ち上がってWinRMが応答するまで待機し、残りのアップデートがあれば続行します。
これを使えば、週末のアップデート作業はコマンドを叩いて寝るだけになります。
第8章:Active Directory (AD) の管理
企業利用では外せないAD管理も、microsoft.ad コレクションを使えばコード化できます。
ユーザー作成の例
- name: Create AD User
microsoft.ad.user:
name: t_yamada
firstname: Taro
surname: Yamada
password: "Password123!"
state: present
groups:
- Domain Admins
「新入社員100人のアカウント作成」も、CSVを読み込んでループさせれば一瞬です。
まとめ:Windowsも「コード」になる
お疲れ様でした!
これで、LinuxもWindowsも、同じAnsibleというツールで統一的に管理できるようになりました。
今回の重要ポイント:
- Windows操作には WinRM を使う。ターゲット側の準備(スクリプト実行)が必須。
- パスの区切り文字や認証方式(Basic/NTLM/CredSSP)に注意する。
win_feature,win_service,win_copyなどの専用モジュールを覚える。win_updatesは管理者の時間を救う神モジュール。
Windowsの自動化は、Linuxに比べると初期設定のハードルが少し高いですが、一度構築してしまえばその効果は絶大です。
GUIでの作業ミスを撲滅し、再現性のあるWindowsインフラを手に入れましょう。
さて、サーバーの設定は完璧になりましたが、インフラには「ネットワーク機器(スイッチ、ルーター)」も存在します。
「Ciscoのスイッチ設定もAnsibleでやりたい」…そんな野望はありませんか?
次回、応用講座 第7回は「ネットワーク機器の自動化。Cisco/Juniperスイッチの設定管理」です。
SSHが使えるネットワーク機器に対して、エージェントレスのAnsibleがどうアプローチするのか。cisco.ios コレクションを使ったVLAN設定やコンフィグバックアップの手法を解説します。
インフラ全領域制覇まであと少しです。お楽しみに!
▼ Windows自動化を体感する ▼
Windows Serverで実験
「VPS」で自分専用環境
マルチプラットフォーム対応へ
「ITエンジニア転職」

コメント