読者です 読者をやめる 読者になる 読者になる

Azure上に複数仮想マシンを展開してドメイン参加させるPowerShellスクリプト

検証で何台も新規のサーバを構築して削除してを繰り返す必要があったので、Azure上に複数VMを一気に展開してAD(ドメイン)参加させるスクリプト作りました。

仕様

Windows 2008R2をAzureのデフォルトイメージから該当のネットワーク内に展開。展開後にWinRMのリモートセッションを利用し、ネットワーク内にあるADに参加まで行う。

前提

  1. ADはネットワーク内に存在していて起動している必要があります
  2. Windows 2008R2でしか試してないです。もしかしたらWindows 2012だとAdd-Computerのコマンドレットは仕様変わっているかも

実行時間

手元の環境では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参加以外の処理もできます。