WindowsをAnsibleで操作する - 初心者向けセットアップガイド

## 概要
このガイドでは、Ansibleを使用してWindowsマシンを自動化するための基本的な設定と手順を解説します。インフラストラクチャ・アズ・コード（IaC）の実践的な導入例として、Windows Serverの自動化設定方法を詳しく説明します。

## 前提条件

### 操作対象マシン（Windows）
- Windows Server 2019
- 新規インストール状態
- 管理者権限

### Ansible実行環境（Linux）
- Ansible Navigatorを使用（実行環境ごとに独立した環境を作成）
- Dockerがインストール済み
- Python 3.x

## セットアップ手順

### 1. Windows側の設定

#### WinRMの設定スクリプト
HTTPS経由でのセキュアなアクセスを実現するため、以下のPowerShellスクリプトを作成します。

```powershell
# 自己署名証明書の作成
$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

# HTTPSリスナーの設定
$httpsParams = @{
    ResourceURI = 'winrm/config/listener'
    SelectorSet = @{
        Transport = "HTTPS"
        Address   = "*"
    }
    ValueSet = @{
        CertificateThumbprint = $cert.Thumbprint
        Enabled               = $true
    }
}
New-WSManInstance @httpsParams

# ファイアウォールルールの設定（ポート5986を開放）
$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
```

### 2. Ansible環境の構築

#### 実行環境の設定
以下のパッケージとコレクションをインストールします：

```yaml
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
```

#### インベントリの設定

##### WinRM接続用
```ini
[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
```

##### PSRP接続用
```ini
[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
```

#### 動作確認用Playbook
```yaml
---
- hosts: all
  gather_facts: false

  tasks:
    - name: コマンド実行
      win_command: whoami
      register: return_whoami
    - name: 結果表示
      debug:
        msg: "{{ return_whoami }}"
```

#### Ansible Navigator設定
```yaml
---
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
```

## 実行手順

1. 実行環境のビルド
```bash
ansible-builder build --tag local/ansible4win:2.18.1-1
```

2. Playbookの実行
```bash
ansible-navigator run --ep playbooks/cmd.yml
```

## よくある質問（FAQ）

### Q1: WinRMとPSRPの違いは何ですか？
A1: WinRMは従来のWindows Remote Managementプロトコルで、PSRPはPowerShell Remoting Protocolの略称です。PSRPはより新しいプロトコルで、PowerShellの機能をより効果的に活用できます。

### Q2: セキュリティ上の注意点はありますか？
A2: 本番環境では、自己署名証明書ではなく、信頼できる認証局の証明書を使用することを推奨します。また、強力なパスワードポリシーと適切なアクセス制御を設定してください。

## 参考リンク
- [AnsibleでWindowsサーバーを設定してみた-環境準備編-](https://blog.jbs.co.jp/entry/2023/05/30/135558)
- [Ansible Windows Collection](https://docs.ansible.com/ansible/latest/collections/ansible/windows/index.html)
- [Community Windows Collection](https://docs.ansible.com/ansible/latest/collections/community/windows/index.html)
- [Windows Automation with Ansible](https://docs.ansible.com/ansible/latest/os_guide/windows_setup.html)

## 本記事について

https://www.tssol.net/blog/2025/03/15/controlling_windows_with_ansible/  

上記リンクの記事に対して、Cursorで以下の指示を出してリライトしてもらいました。
```text
You are an editor. Improve clarity, tone, and structure.
```
```text
You are an SEO expert. Add relevant keywords and optimize structure for SEO.
```