【無料ツール】画像をPDFに変換するPhotoPDF Appを公開しました!

【Ansible応用講座 第6回】Windowsも支配する。WinRM接続とPowerShell操作の完全ガイド

「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章: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」で自分専用環境

おすすめVPSを見る

マルチプラットフォーム対応へ
「ITエンジニア転職」

転職エージェントを見る

コメント