AnsibleでWindowsServer初期セットアップをする

お世話になります。

仮想環境ではテンプレートを使ってVMをクローンしますが、Windowsの場合SIDの重複という問題があるため、Sysprepした状態でテンプレートを作成します。

これによりクローンしたVMは設定が初期化されているため、各マシンごとにIPアドレス設定やローカル管理者の削除、といった手作業が毎回必要になってしまいます。
今回、こうしたGUIによる操作を自動化するため、Ansibleを利用してみます。流れとしては以下のようになります。

・Win2019のテンプレートイメージにてWinRM機能を有効化
・Ansibleサーバ（イニシエータというべき？）でhostsを更新
・Playbookの実行

今回、Turnkey Ansibleで以下のスペックでVMを作成してみました。
https://www.turnkeylinux.org/ansible
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/8f98ecdd-1f4f-863c-e986-460ea7e41af0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7e0cff0f-3676-02a6-b2b9-04c3d362096a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2e6dd3ee-e976-63d3-fadf-fb4eb7ecd6a3.png)

インストールが終わったら、対象となるWindowsServerで以下のコマンドを実行します。以下のサイトを参考にさせて頂きました。
https://qiita.com/yunano/items/f9d5652a296931a09a70

```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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1b07efeb-7493-f2c6-219f-264121386232.png)

受付状態を確認します。ポート5985と5986がリッスンしていればOKです。この状態でSysprepをして、Proxmoxのテンプレートとして格納しておきます。

```
winrm enumerate winrm/config/listener
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/a03e4f5e-ed4a-b1e2-d403-5e2abf8acce6.png)

Ansibleサーバにログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b495ff46-202f-b762-530b-4d9d04062984.png)

適宜スナップショットを取っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2ff96840-8be1-97f7-b748-48faca508356.png)

以下のコマンドで、hosts一覧にWindowsServerを追加しておきます。IPは実際のものに変更します。

```
[windows]
<Windowsの解決可能なホスト名かIPアドレス>

[windows:vars]
ansible_ssh_user=<Windows側のユーザ名>
ansible_ssh_pass=<Windows側ユーザのパスワード>
ansible_ssh_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c872d4b9-b73e-35b8-782e-56fb448f1141.png)

Ping疎通コマンドで確認します。SUCCESSとなればOKです。

```
ansible windows -i hosts -m win_ping
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b7709884-64b0-9326-ed71-2277702ef760.png)

以下の名前でansible/test.ymlの名前で保存します。今回はC:\ansible_testというフォルダを作り、ローカル管理者を無効化するというシンプルな検証となります。

```yaml
- hosts: windows
  tasks:
    - win_file:
        path: C:\ansible_test
        state: directory
    - win_user:
        name: Administrator
        account_disabled : yes
```

準備が整いましたので、対象Windows Serverの現状を表示しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b8833125-7763-04f6-db44-dcba5ea300e0.png)

プレイブックを実行します。

```
ansible-playbook -i hosts test.yml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1f881ba1-8f00-2fb7-dab2-2f79e6866fab.png)

win_userでエラーが出ていますが、これはWinRMイニシエータユーザが、今回無効化したいユーザと同一（ビルトインAdministrator）のためと思われます。

フォルダが作成され、Administratorが無効化されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/ff936a09-20c4-0b4c-36c2-0e54226cdbe3.png)

Ansibleを使えば、たとえば以下のようなよくある展開で効率化ができそうです。

・テンプレートから5台のWindowsをクローン
・DHCPで取得したIPを確認し、hostsに追記
・各マシンに静的IPとDNSサーバの追加
・コンピュータ名の割り当て
・ドメインへの参加
・ローカルAdminの削除

Ansibleの特徴として、べき等性というものがあるそうです。まだ完全に理解していませんが、運用の上で注意する点かと思います。こちらのサイトが分かりやすかったです。
https://blog.adachin.me/archives/4739

また、Ansibleサーバはスペックはほとんど必要なさそうで、512MB/1コアでも十分動きそうです。SCCMやジョブフローといった巨大なサーバを立てずに済む、こうした点も良いと思います。