検証で何台も新規のサーバを構築して削除してを繰り返す必要があったので、Azure上に複数のVMを一気に展開してAD(ドメイン)参加させるスクリプト作りました。
仕様
Windows 2008R2をAzureのデフォルトイメージから該当のネットワーク内に展開。展開後にWinRMのリモートセッションを利用し、ネットワーク内にあるADに参加まで行う。
前提
実行時間
手元の環境では4台のVMを指定して実行すると50分くらいかかります。
#作成するVMをカンマ区切りで指定 $VMList = "SERV01","SERV02","SERV03","SERV04" #Azureサブスクリプション $Subscription = "subscriptionname" #Azure Service $ServiceName = "servicename" #VM設定 $ImageName = "a699494373c04fc0bc8f2bb1389d6106__Win2K8R2SP1-Datacenter-201412.01-en.us-127GB.vhd" # 「Get-AzureVMImage | Out-GridView」とかで確認してください $InstanceSize = "Large" #インスタンスサイズ $TimeZone = "Tokyo Standard Time" #アカウント設定 $AdminUser = "localadmin" #VM展開時に指定する管理ユーザ $AdminPassword = "p@ssword" #管理ユーザのパスワード $DomainName = "sample.local" #ドメイン名。DNSで名前解決できる必要あり。 $ADSettingUser = "domain\username" #ドメインユーザ。ドメイン参加で利用。 $ADSettingUserPassword = "p@ssword" #ドメインユーザのパスワード #VM設定(Network) $AzureVNSubnet = "Subnet-1" #VM設定(OS Disk) $StorageAccountName = "storageaccountname" #モジュールインポート・サブスクリプション選択 Import-Module azure Add-AzureAccount Select-AzureSubscription $Subscription $SecPassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential($AdminUser,$secPassword) foreach($VMName in $VMList) { $OSDiskName = "{0}-OS" -F $VMName $OSStoragePath = "http://{0}.blob.core.windows.net/vhds/{1}.VHD" -F $StorageAccountName , $OSDiskName $OSDiskCache = "ReadWrite" #VM設定オブジェクト生成 $VMConfig = New-AzureVMConfig -Name $VMName -InstanceSize $InstanceSize -ImageName $ImageName -MediaLocation $OSStoragePath -HostCaching $OSDiskCache | Set-AzureSubnet -SubnetNames $AzureVNSubnet | Set-AzureVMBGInfoExtension | Add-AzureProvisioningConfig -Windows -AdminUsername $AdminUser -Password $AdminPassword -TimeZone $TimeZone -EnableWinRMHttp #VM作成 New-AzureVM -ServiceName $ServiceName -VMs $VMConfig -Verbose -WaitForBoot #WinRMのUri情報を取得 $winRmUri = Get-AzureWinRMUri -ServiceName $ServiceName -Name $VMName #WinRM経由でPSSessionを張りADにコンピュータを追加 $Session = New-PSSession -ConnectionUri $winRmUri -Credential $Cred -SessionOption (New-PSSessionOption -SkipCACheck) Invoke-Command -Session $Session -Argumentlist $DomainName,$ADSettingUser,$ADSettingUserPassword -ScriptBlock{ param($DomainName,$ADSettingUser,$ADSettingUserPassword) $secPassword = ConvertTo-SecureString $ADSettingUserPassword -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential($ADSettingUser,$secPassword) Add-Computer -DomainName $DomainName -Credential $Cred -Verbose } Remove-PSSession $Session #ドメイン追加後の再起動 Restart-AzureVM -ServiceName $ServiceName -Name $VMName -Verbose }
Invoke-Commandのスクリプトブロック内に処理書けば、AD参加以外の処理もできます。