小規模VDI環境を構築する Part3 VM構築自動化編

Hyper-V

他パートはVDI環境構築カテゴリをご覧ください

今回はVMのイメージ作成やVMの設定自動化等をしていきたいと思います。

マスターイメージの作成

APIからpowershellを呼び出してVMを作成する流れなのですが、OSインストールが問題になってきます。そこで、マスターイメージを利用する差分ディスクの方式でVMを作成するとOSインストールの必要がないのでこれを利用したいと思います。

まずはホストでマスターイメージとなるVMを1台作成します。

そのままOSをインストールします

OSをインストールしたらファイアウォールでファイルのプリンター共有とリモートデスクトップを許可しておきます。

そしてsysprepをそのまま実行、、、しません!

今回は初期セットアップも省きたいので、応答ファイルを利用します。
こちらの素晴らしい参考記事をご覧になり、xmlの作成を行ってください。
sysprep の自動応答ファイルの作り方

xmlファイルができたらVM内のお好みの場所に置いておきます。僕はとりあえずsysprepと同じ場所に置いておきました。
そしてpowershellでsysprepを動かします。

C:\Windows\system32\sysprep\sysprep.exe /oobe /generalize /shutdown /unattend:C:\Windows\system32\sysprep\unattend.xml

実行して接続が切れたらVMがシャットダウンするので起動させずに削除しておきます。

マスターイメージからVMを作成したあとにマスターイメージを変えてしまうと
親仮想ハードディスクと差分ディスクの識別子が一致しないと言われ起動できなくなります。

マスターイメージのVMのフォルダから、適当な位置に設置しておきます。
そして、読み取り専用にしておきます。

これでマスターイメージは完成です。

差分ディスクの動作確認

早速差分ディスクを使ったVMを作成していきます。
VM作成スクリプトを作成しましたのでこれを使います。

$VMName = "VM名"
$RAM = 4GB
$CPUCore = 4
$VHD = New-VHD -Path  "お好みのパス\$VMName\$VMName.vhdx" -Differencing -ParentPath "お好みのパス/マスターイメージ.vhdx"
New-VM -Name $VMName -Generation 2 -MemoryStartupByte $RAM -VHDPath $VHD.Path -Path "お好みのパス\$VMName" -SwitchName VirtualSwitch
Set-VM -Name $VMName -ProcessorCount $CPUCore
Start-VM -Name $VMName

起動すると初期セットアップは応答ファイルにより完了しているのでログイン画面が出てきます。

マスターイメージの作成と動作確認が完了しました。

VMのネットワーク設定・リモートデスクトップ設定とAD参加の自動化

出来たVMにVMのネットワーク設定とADに参加させます。
これらを全て自動化させて提供したいのでPowershellでスクリプトを作成します。

ネットワーク設定

まずネットワークですが、以前書いた 「Hyper-V ホストからVMにPowershellでネットワーク設定をしよう」という記事にSet-VMIPConfigというのを作っていますのでこれを使ってネットワーク設定をしていきます。

IPは現在は直接入力ですが、DBにIPアドレスカラムを作っているので次のパートあたりでDBからVM情報を取得して自動設定させる形にしたいと思います。

リモートデスクトップ設定・AD参加設定

リモートデスクトップ設定とAD参加設定は以下のスクリプトにより実施します。

#パスワードはunattend.xmlで設定したものです。
$Password = ConvertTo-SecureString -AsPlainText 'パスワード' -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'Administrator', $Password
New-PSSession -VMName VM名 -Credential $Credential
$pss = Get-PSSession
$Command = @'
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value "0"
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value "0"
$Domain = "hypervdi.win"
#ドメイン管理者のアカウント
$DomainAdmin = "Administrator@hypervdi.win"
#ドメイン管理者のパスワード
$Password = ConvertTo-SecureString "パスワード" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($DomainAdmin, $Password)
Add-Computer -DomainName $Domain -Credential $Credential
Restart-Computer -Force
'@
$ScriptBlock = [ScriptBlock]::Create($Command)
Invoke-Command -Session $pss -ScriptBlock $ScriptBlock


実行後この表示が出ればAD設定は成功しています。
これでリモートデスクトップ許可とAD参加の設定が入ったので再起動させています。

再起動後、ドメインアカウントでリモートデスクトップできるようになります。

このパートは以上です!
次はDBを活用したりAPI設定などを行いたいと思っています。
次のパートもよろしくお願いします。

タイトルとURLをコピーしました