以前、TerraformでのLinux OS設定についてまとめましたが、今回はWindows OSの設定手順です。Windowsの場合も、いくつかやり方はあるようですが、VM拡張機能(Custom Script Extension)を使うのが分かりやすいと思います。
1) インストーラとPowershellスクリプトの準備
インストールするアプリケーション(msiやexe)と、実際のインストールを行うPowershellをストレージアカウントに準備しておきます。ストレージアカウントの「ファイアーウォールと仮想ネットワーク」設定で、VM展開先のサブネットを設定しておきます。
ストレージに適当なコンテナを作成し、インストーラとPowershellスクリプトを配置しておきます。インストーラはWebから直接取得しても構いませんが、ここでは例として、全てストレージアカウントに置いておきます。
Powershellスクリプトには、アプリケーションをサイレントインストールする処理を並べておきます。
msiexec.exe /i /passive node-v12.13.0-x64.msi
msiexec.exe /i /passive azure-cli-2.0.76.msi
.\WinMerge-2.16.4-x64-Setup.exe /VERYSILENT /ALLUSERS
サイレントインストールするためのオプションは、アプリケーションによって違う場合もあるのでそれぞれ調べる必要があります。ここで例にしているWinMergeの場合は WinMerge-2.16.4-x64-Setup.exe /?
を実行すると表示されました。
2) terraformファイル(tfファイル)準備
VM拡張機能は、単独のリソースとして記載します。settings にファイル(準備したファイルのフルパス)と実行するPowershellを設定します。
resource "azurerm_virtual_machine_extension" "tf_win_vm_extension" {
name = "myWindowsVmExtension" # 拡張機能名(好きに付けてよい)
location = "Japan East" # リージョン(VMと同じにする)
resource_group_name = "${azurerm_resource_group.tf_name_resource_group.name}" # リソースグループ(名前で参照)
virtual_machine_name = "${azurerm_virtual_machine.tf_name_vm1.name}" # 仮想マシン(名前で参照)
type = "CustomScriptExtension" # 拡張機能の種類(Custom Script Extension)
publisher = "Microsoft.Compute" # 拡張機能提供者(Microsoft)
type_handler_version = "1.9" # 拡張機能バージョン(実際にインストールしてみて最新バージョンを確認)
# settings:VMにダウンロードするファイル(準備したファイルのフルパス)と実行するPowershellを設定
settings = <<SETTINGS
{
"fileUris": [
"https://xxxxxxdemo001.blob.core.windows.net/pstest1/init_test.ps1",
"https://xxxxxxdemo001.blob.core.windows.net/pstest1/node-v12.13.0-x64.msi",
"https://xxxxxxdemo001.blob.core.windows.net/pstest1/WinMerge-2.16.4-x64-Setup.exe",
"https://xxxxxxdemo001.blob.core.windows.net/pstest1/azure-cli-2.0.76.msi"
],
"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File \"init_test.ps1\""
}
SETTINGS
}
3) 実行結果確認
terraform実行後、VMにログインし、インストールされていることを確認します。
azコマンドはスタートメニューに出てこないのでコマンドで確認します。
拡張機能で実行されたファイルは C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.9.5\Downloads\<数字>
に置かれているので、異常があった場合の確認で使えます。