如何在使用Powershell从捕获的映像创建ARM VM时包含"计划信息"?

g.p*_*dou 5 azure-powershell azure-resource-manager azureportal

我有一个从市场创建的ARM VM:bitnami LAMP(Ubuntu)我已经成功捕获了一个图像.在捕获过程中,我保存了json模板.

使用基于该模板的模板,我可以通过门户网站的模板部署工具以交互方式成功创建新VM.(所以拍摄的图像没问题).请注意:该json模板确实包含计划信息,请参阅下文

但是,我最初的目标是使用Powershell基于捕获的映像创建新的ARM VM

所有似乎都工作,但在最后一个命令New-AzureRmVM返回和错误说明:

从Marketplace图像创建虚拟机需要请求中的计划信息.

显然缺少这些信息,但我无法找到如何添加它.

这是我尝试过的:

  • 我检查了$ vm变量(New-AzureRmVM命令的参数是什么),其Plan属性为空.(如预期的那样)
  • 我搜索了适当的Add-AzureRmVm ...命令但没有成功
  • 我试图在所有情况组合中手动设置Plan属性及其子属性:所有的错误.(比如$ vm.Plan.Publisher ="bitnami")

实际上,原始捕获的json模板包含该计划:

  },
  "name": "[parameters('vmName')]",
  "type": "Microsoft.Compute/virtualMachines",
  "location": "westeurope",
  "plan": {
    "name": "5-6",
    "publisher": "bitnami",
    "product": "lampstack"
  } 
Run Code Online (Sandbox Code Playgroud)

同样,此脚本尝试使用的捕获图像(.vhd)已确认正常,因为使用完全相同的捕获图像,我可以通过门户的模板部署工具创建新的ARM VM.


我认为这个案例的来源并不是太重要(它没有错误,只是遗漏了一些东西,但是问题中明确说明了这个缺失的东西)但是无论如何我附加了源代码...... 可选阅读.

# Existing resource parameters
$subscriptionName =  'Visual Studio Premium with MSDN'
$rgName = "rg-wp"
$location = "westeurope"
$stName = 'mystorage' 
$sourceImageUri = 'https://mystorage.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/template-osDisk.be7b0cf4-a28b-47f9-89c7-43887f1570ab.vhd' 

# Creation settings:
$vmSize = 'Standard_DS2'
$vmSuffix = 'wp-11'

#Login-AzureRmAccount
Select-AzureRmSubscription -SubscriptionName $subscriptionName

# Get the storage account
#$storageAccount = Get-AzureRmStorageAccount | ? StorageAccountName -EQ $stName
$storageAccount = Get-AzureRmStorageAccount -AccountName $stName -ResourceGroupName $rgName 

# Enable verbose output and stop on error
$VerbosePreference = 'Continue'
#$ErrorActionPreference = 'Stop'

$adminUsername = 'myusername'
$adminPassword = 'mypassword'

$vmName = '{0}-vm' -f $vmSuffix
$nicName = '{0}-nic' -f $vmSuffix
$ipName = '{0}-pip' -f $vmSuffix
$domName = '{0}-mzpx' -f $vmSuffix
$vnetName = '{0}-vn' -f $vmSuffix
$nsgName= '{0}-nsg' -f $vmSuffix


# Networking:
Write-Verbose 'Creating Virtual Network'  
$vnetDef = New-AzureRmVirtualNetwork -ResourceGroupName $rgName -Location $location -Name $vnetName -AddressPrefix '10.0.0.0/16'
Write-Verbose 'Adding subnet to Virtual Network'  
$vnet = $vnetDef | Add-AzureRmVirtualNetworkSubnetConfig -Name 'Subnet-1' -AddressPrefix '10.0.0.0/24' | Set-AzureRmVirtualNetwork

Write-Verbose 'Creating Public IP'  
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $rgName -Location $location -Name $ipName -DomainNameLabel $domName -AllocationMethod Dynamic
Write-Verbose 'Creating NIC'  
$nsg = New-AzureRmNetworkSecurityGroup -Name $nsgName -ResourceGroupName $rgName -Location $location
Write-Verbose 'Network Security Group'  
$nic = New-AzureRmNetworkInterface -ResourceGroupName $rgName -Location $location -Name $nicName -PublicIpAddressId $pip.Id -SubnetId $vnet.Subnets[0].Id -NetworkSecurityGroupId $nsg.Id

# Configuring VM
Write-Verbose 'Creating VM Config'  
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize 

# Specify local administrator account, and then add the NIC
$cred = New-Object PSCredential $adminUsername, ($adminPassword | ConvertTo-SecureString -AsPlainText -Force) # you could use Get-Credential instead to get prompted
$vm = Set-AzureRmVMOperatingSystem -VM $vm -Linux -ComputerName $vmName -Credential $cred 
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

# Specify the OS disk
$diskName = '{0}-osdisk' -f $vmSuffix
$osDiskUri = '{0}vhds/{1}{2}.vhd' -f $storageAccount.PrimaryEndpoints.Blob.ToString(), $vmName.ToLower(), $diskName
$vm = Set-AzureRmVMOSDisk -VM $vm -Name $diskName -VhdUri $osDiskUri -CreateOption fromImage -SourceImageUri $sourceImageUri -Linux

Write-Verbose 'Creating VM...'  

$result = New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vm
Run Code Online (Sandbox Code Playgroud)

Mic*_*l B 6

截至五天前,以及Azure Powershell 1.2.2版,他们向AzureRM.Compute添加了一个新的cmdlet - Set-AzureRmVMPlan

这让你可以像这样配置计划参数 -

$vm = New-AzureRmVMConfig -vmName $vmName -vmSize $vmSize

Set-AzureRmVMPlan -VM $vm -Publisher bitnami -Product lampstack -Name "5-6"
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
$vm = Set-AzureRmVMOSDisk -VM $vm -Name $vhdName -VhdUri $vhdUri -Linux -CreateOption attach -Verbose
Run Code Online (Sandbox Code Playgroud)