AnsibleとHyper-VでInfrastructure as Codeを実現する

この記事の内容

  • Hyper-V上でAnsibleを使ったInfrastructure as Code(IaC)の実現方法を解説します
  • WindowsホストでAnsibleを動かすためにWSL(Windows Subsystem for Linux)を活用します
  • YAMLファイルに仮想マシンの設定を記述するだけで、コマンド一発で自動展開できる仕組みを構築します
  • Ansibleのべき等性により、同じプレイブックを複数回実行しても安全に運用できます
  • 本シリーズのPart1〜3で作成したゴールデンイメージと組み合わせることで、完全自動のVM展開環境が完成します

はじめに

本記事は「企業でよくあるWindows・M365環境を構築してみるシリーズ」のPart4です。前回までのPart1〜3では、ネステッドHyper-Vの基盤構築、Windows Server 2022のSysprep済みゴールデンイメージ作成、そして自動応答ファイルによるゼロタッチ展開の仕組みを整えました。

今回はその仕組みをさらに発展させ、Infrastructure as Code(IaC) を実現します。テキストファイルにVMの名前やIPアドレスなどの設定を書いておくだけで、コマンド一発で全自動的に環境が出来上がるという仕組みです。

自動化ツールには Ansible を使用します。Hyper-VでIaCを実現するための情報はインターネット上に非常に少なく、本記事の情報は希少性が高いものとなっています。


前提条件

本記事の手順を実施するにあたって、以下が完了していることを前提とします。

  • ネステッドHyper-Vの基盤構築済み
  • Windows Server 2022のSysprep実行済みゴールデンイメージ作成済み
  • 自動応答ファイルによるゼロタッチ展開の設定済み

WSLのインストール

AnsibleはWindows上では直接実行できないため、WSL(Windows Subsystem for Linux) を使用します。WSLを使うことで、Windows上でLinuxのコマンドが使えるようになります。

管理者権限でPowerShellを起動し、まずインストール可能なディストリビューション一覧を確認します。

wsl --list --online

Ubuntuをインストールします。

wsl --install -d Ubuntu

インストール後、再起動を求められますので再起動します。再起動後にログインすると、インストールが自動的に再開されます。UNIXユーザー名とパスワードを設定すれば完了です。


WSL(Ubuntu)環境のセットアップ

WSLのUbuntu環境を最新の状態にします。

sudo apt update
sudo apt upgrade -y

続いてAnsibleをインストールします。

sudo apt install ansible -y

次に、AnsibleからWindowsホストを管理するために必要な pywinrm もインストールします。

pip install pywinrm

最後にAnsible本体をインストールします。インストールが完了するとバージョン(例:2.9.6)が表示されます。


HyperーVホスト側のWinRM設定

AnsibleはWinRM(Windows Remote Management)を通じてWindowsホストを管理します。HyperーVホスト自体をAnsibleで管理できるようにするため、Microsoftが公式で提供しているスクリプトを使ってWinRMを有効化します。

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

このスクリプトを実行すると、証明書の作成なども自動的に行われ、AnsibleによるWindows管理が有効になります。

設定完了後、WSLからHyperーVホストに対してpingを打って疎通確認をします。

ansible winhost -m win_ping

SUCCESS が返ってくれば、AnsibleでWindowsホストが管理できる状態になっています。


Git・VS Codeのインストール

継続的にconfigファイルを管理するために、GitとVS Codeもインストールしておきます。Boxstarterというツールを使ったスクリプトで自動化することができます。スクリプトを取得してPowerShellで実行することで、GitとVS Codeが一括でインストールされます。


プレイブックリポジトリのクローン

リポジトリ用のディレクトリを作成し、GitHubで公開されているAnsibleプレイブックリポジトリをクローンします。

mkdir repos
cd repos
git clone https://github.com/<リポジトリURL>

YAMLファイルで仮想マシンを定義する

クローンしたリポジトリ内には、VMの設定を記述するYAMLファイルがあります。このファイルに仮想マシンの定義を書いていくことで、IaCが実現されます。

以下は設定ファイルの記述例です。

vms:
  - name: windows-game1
    cpu: 2
    memory: 4096
    network_adapter: NestedExtSwitch
    ip: 10.1.1.1
    netmask: 255.255.255.0
    gateway: 10.1.1.254
    dns: 192.168.1.1
    source_vhd: C:\HyperV\GoldenImages\WS2022.vhdx
    dest_vhd: C:\HyperV\VMs\windows-game1\windows-game1.vhdx

このファイルに記述した設定通りに仮想マシンが作成されます。VMの名前、CPU数、メモリ量、ネットワーク設定、ソースVHDのパスなどを定義できます。


Ansibleプレイブックの実行

設定ファイルを記述したら、プレイブックを実行します。WSL上のLinuxからはWindowsのファイルシステムが /mnt 配下にマウントされているため、そこに移動してプレイブックを実行します。

cd /mnt/c/repos/ansible-hyperv
ansible-playbook create_vm.yml

実行すると、Ansibleは以下の処理を自動的に行います。

  1. VHDXファイルが既に存在するかを確認
  2. ゴールデンイメージのVHDXをコピー
  3. 仮想マシンを作成してコピーしたVHDXをアタッチ
  4. VMを起動
  5. Sysprep済みゴールデンイメージの初回起動処理(自動応答ファイルによる自動構成)
  6. WinRM接続が確立できるまで待機
  7. コンピューター名の変更
  8. 再起動

完了後、HyperーVマネージャーで確認すると、設定ファイルに記述した通りの仮想マシンが作成されており、IPアドレスやコンピューター名、ネットワーク設定がすべて自動で構成されていることが確認できます。


べき等性について

Ansibleには べき等性 という特性があります。同じプレイブックを複数回実行しても、すでに設定ファイルの内容通りになっている場合は何も変更されません。

一度作成したVMに対して再度プレイブックを実行した場合、VMそのものへの変更はスキップされます(一部のモジュール実装によってはCHANGEDと表示されることがありますが、実際の変更は行われません)。

この特性により、設定ファイルを「あるべき姿」として記述しておけば、何度実行しても安全に運用できます。


VMの追加と削除

VMを追加する

新しいVMを追加したい場合は、設定ファイルに定義を追記するだけです。

vms:
  - name: windows-game1
    # (省略)
  - name: windows-game3
    cpu: 2
    memory: 4096
    # (以下同様に設定)

ファイルを保存してプレイブックを再実行すると、既存のVMはスキップされ、新しく追加したVMだけが作成されます。

ansible-playbook create_vm.yml

VMを削除する

VMを削除したい場合は、削除用プレイブックを実行します。

ansible-playbook delete_vm.yml

対象のVMが自動的に削除されます。一度削除して再度作成したい場合も、create_vm.yml を実行するだけで同じ設定のVMが再作成されます。


まとめ

今回は、Hyper-V上でAnsibleを使ったInfrastructure as Codeの実現方法を解説しました。

  • AnsibleはWindows上では直接動作しないため、WSLを活用してLinux環境を用意します
  • HyperーVホスト側はWinRMの設定をすることでAnsibleから管理できるようになります
  • YAMLファイルに仮想マシンの設定を記述しておくことで、コマンド一発で複数台のVMを全自動構築できます
  • Ansibleのべき等性により、同じプレイブックを繰り返し実行しても安全です
  • VMの追加・削除も設定ファイルの変更とプレイブックの実行だけで完結します

これまでのシリーズで構築したSysprep済みゴールデンイメージ・自動応答ファイルの仕組みと組み合わせることで、テキストを書いてコマンドを実行するだけで完全自動のWindows環境構築が実現できます。

次回は、ID基盤として Active Directory の構築を行っていく予定です。