浅草橋青空市場

Microsoft Azure のニュースや情報を中心にあれこれと

Azure PowerShellで仮想マシンV2を作成する (SysprepしたVHDから)

qiita.com

という記事を読みましたので、Sysprepした方のVHDからv2仮想マシンを生成するPowerShellスクリプトも置いておきます。

VM本体を構成するだけのスクリプトなので、各種コンポーネントはあらかじめ作っておいて下さい。 以下のものがあらかじめ用意されている前提のスクリプトになっています。 * リソースグループ * ストレージアカウント * 仮想ネットワークとサブネット * NIC * 可用性セット * (必要に応じて)ロードバランサーとパブリックIPアドレス * Sysprep されたVHDファイル

特殊化VHD(Sysprepしていない)との大きく違うところは、置いてあるVHDをそのまま仮想マシンに接続するのではないというところでしょうか。 「-VhdUri」で指定したところに新たなVHDファイルが作られます。

# Azureアカウントへログイン
Login-AzureRmAccount

# サブスクリプションの指定
$SubscriptionId = '[Subscription ID]'
Get-AzureRmSubscription -SubscriptionId $SubscriptionId | Select-AzureRmSubscription

# リソースグループの指定
$ResourceGroupName = '[Resource Group Name]'

# OSディスク情報の指定(Syspreped / Generalized VHDから生成する場合)
$StorageAccountName = '[Storage Account Name]'
$Caching = '[Disk Cache Mode]'
$CreateOption = 'fromimage'
$osDiskSourceImageUri = '[Source VHD Uri]'
$vhdUri = "[OS Disk VHD Uri]"

# 仮想マシンの構成情報
$vmName = '[VM Name]'
$vmSize = '[VM Size]'
$cred = Get-Credential
$Location = (Get-AzureRmStorageAccount -Name $StorageAccountName -ResourceGroupName $ResourceGroupName).Location

# 可用性セットの構成情報
$AvailabilitySetName = '[Availability Set Name]'
$vmAs = Get-AzureRmAvailabilitySet -ResourceGroupName $ResourceGroupName -Name $AvailabilitySetName

# NICの指定
$NicName = '[NIC Name]'
$nic = Get-AzureRmNetworkInterface -Name $NicName -ResourceGroupName $ResourceGroupName

# VM構成情報の組立
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $vmAs.Id
$vm = Set-AzureRmVMOperatingSystem -ComputerName $vmName -Credential $cred -VM $vm -Windows
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.id
$vm = Set-AzureRmVMOSDisk -VM $vm -SourceImageUri $osDiskSourceImageUri -VhdUri $vhdUri -Name $vmName -CreateOption $CreateOption -Caching $Caching -Windows

# VMのデプロイ
New-AzureRmVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $vm

ちなみに、Sysprepしてない手順でSysprepしたVHDから仮想マシンを作ると、「国または地域」などを指定する画面で止まってしまって悲しいことになります。

おまけで、仮想マシンのキャプチャを行うPowerShellスクリプトはこちらです。Sysprepだったり、Linuxの場合は sudo waagent -deprovision+user だったりは事前に各自で行って下さい。

$ResourceGroupName = '[Resource Group name]'
$vmName = '[VM Name]'
$DestinationContainerName = '[Destination Blob Container Name]'
$VHDNamePrefix = '[Vhd Prefix]'

# 仮想マシンの汎用化
Set-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $vmName -Generalized

# キャプチャの実行
Save-AzureRmVMImage -DestinationContainerName $DestinationContainerName -Name $vmName -ResourceGroupName $ResourceGroupName -VHDNamePrefix $VHDNamePrefix

JSONテンプレートを触った方が楽なケースが多いとは思いますが、用途によってはということで。