使用 Powershell 从捕获的图像创建 ARM VM 时如何包含 "Plan information"?
How to include "Plan information" when creating ARM VM from a captured image using Powershell?
我有一个从市场创建的 ARM 虚拟机:bitnami LAMP (Ubuntu)
我已经成功地捕捉到了图像。在捕获过程中,我保存了 json 模板。
使用基于该模板的模板,我可以通过门户的模板部署工具以交互方式成功创建新的 VM。 (所以捕获的图像是可以的)。请注意:json 模板 确实包含 计划信息,请参阅下文
然而,我最初的目标是根据捕获的图像使用 Powershell
创建新的 ARM 虚拟机
一切似乎都有效,但在最后一个命令 New-AzureRmVM returns 和错误说明中:
Creating a virtual machine from Marketplace image requires Plan
information in the request.
显然缺少此信息,但我找不到如何添加它。
这是我试过的:
- 我检查了 $vm 变量(New-AzureRmVM 命令的参数是什么),它的计划 属性 是空的。 (如预期)
- 我搜索了合适的 Add-AzureRmVm... 命令但没有成功
- 我尝试手动设置计划 属性 及其在 所有大小写 组合中的子属性:所有错误. (比如 $vm.Plan.Publisher="bitnami")
实际上原始捕获的 json 模板包含计划信息:
},
"name": "[parameters('vmName')]",
"type": "Microsoft.Compute/virtualMachines",
"location": "westeurope",
"plan": {
"name": "5-6",
"publisher": "bitnami",
"product": "lampstack"
}
同样,此脚本尝试使用的捕获图像(.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
截至五天前,Azure Powershell 版本 1.2.2 向 AzureRM.Compute - Set-AzureRmVMPlan
添加了一个新的 cmdlet
这让你像这样配置计划参数 -
$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
azure cli 中的以下命令提供了信息。
下面的示例 运行。
azure vm image show --location westus --publisher paloaltonetworks --offer vmseries1 --sku bundle1 --version 7\.1\.1 --json
[
{
"id": "/Subscriptions/subscription-id/Providers/Microsoft.Compute/Locations/westus/Publishers/paloaltonetworks/ArtifactTypes/VMImage/Offers/vmseries1/Skus/bundle1/Versions/7.1.1",
"name": "7.1.1",
"location": "westus",
"plan": {
"publisher": "paloaltonetworks",
"name": "bundle1",
"product": "vmseries1"
},
"osDiskImage": {
"operatingSystem": "Linux"
},
"dataDiskImages": []
}
]
set-azurermvmplan 命令修复了错误。我们应该从门户的自动化脚本部分获取所有参数。
对于像我一样最终来到这里的任何人,如果你不知道出版商或其他任何东西。
为新虚拟机名称 $VM_NAME、资源组 $RESOURCE_GROUP 和位置 $REGION 保存变量,然后 运行 以下命令并创建关联变量:
VM_NAME=<new-vm-name>
RESOURCE_GROUP=<my-resource-group>
REGION=<my-disks-location>
获取$PLAN_NAME、$PLAN_PRODUCT、$PLAN_PUBLISHER
**此命令可能需要很长时间。如果您可以提供“--publisher”、“--offer”或“--sku”,则可以缩短等待时间。*
az vm image list --location $REGION --all -o table | grep <any-keyword>
PLAN_NAME=<output-from-command-above>
PLAN_PRODUCT=<output-from-command-above>
PLAN_PUBLISHER=<output-from-command-above>
获取可用磁盘并保存到变量 $OS_DISK 和 $OS_TYPE
az disk list -o table
OS_DISK=<output-from-command-above>
OS_TYPE=<output-from-command-above>
获取网卡列表(如果可用)并保存到变量 $NIC
az network nic list -o table
NIC=<output-from-command-above>
获取可用的虚拟机大小并保存到变量 $VM_SIZE
az vm list-sizes -l $REGION -o table
VM_SIZE=<output-from-command-above>
设置完所有变量后,您可以运行此命令重新创建机器:
az vm create \
--name $VM_NAME \
--resource-group $RESOURCE_GROUP \
--attach-os-disk $OS_DISK \
--os-type $OS_TYPE \
--location $REGION \
--size $VM_SIZE \
--plan-name $PLAN_NAME \
--plan-product $PLAN_PRODUCT \
--plan-publisher $PLAN_PUBLISHER \
--nics $NIC
如果您只想“编辑”/更新 VM 并轻松将计划添加到其中,但收到错误消息:
Azure Error: CannotSetPlanOnUpdate
Message: This resource was created without a plan. A new plan cannot be associated with an update.
您可以使用 VM 配置检索 PowerShell 对象:
$vm = Get-AzureRmVM -ResourceGroupName "<Res-Grp>" -Name "<VM-Name>"
然后按照 michael-b
的建议进行编辑
Set-AzureRmVMPlan -VM $vm -Publisher bitnami -Product lampstack -Name "5-6"
然后通过门户删除虚拟机(不要关闭 Powershell Window!)
然后重新部署:
Update-AzureRmVM -VM $vm
我有一个从市场创建的 ARM 虚拟机:bitnami LAMP (Ubuntu) 我已经成功地捕捉到了图像。在捕获过程中,我保存了 json 模板。
使用基于该模板的模板,我可以通过门户的模板部署工具以交互方式成功创建新的 VM。 (所以捕获的图像是可以的)。请注意:json 模板 确实包含 计划信息,请参阅下文
然而,我最初的目标是根据捕获的图像使用 Powershell
创建新的 ARM 虚拟机一切似乎都有效,但在最后一个命令 New-AzureRmVM returns 和错误说明中:
Creating a virtual machine from Marketplace image requires Plan information in the request.
显然缺少此信息,但我找不到如何添加它。
这是我试过的:
- 我检查了 $vm 变量(New-AzureRmVM 命令的参数是什么),它的计划 属性 是空的。 (如预期)
- 我搜索了合适的 Add-AzureRmVm... 命令但没有成功
- 我尝试手动设置计划 属性 及其在 所有大小写 组合中的子属性:所有错误. (比如 $vm.Plan.Publisher="bitnami")
实际上原始捕获的 json 模板包含计划信息:
},
"name": "[parameters('vmName')]",
"type": "Microsoft.Compute/virtualMachines",
"location": "westeurope",
"plan": {
"name": "5-6",
"publisher": "bitnami",
"product": "lampstack"
}
同样,此脚本尝试使用的捕获图像(.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
截至五天前,Azure Powershell 版本 1.2.2 向 AzureRM.Compute - 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
azure cli 中的以下命令提供了信息。 下面的示例 运行。
azure vm image show --location westus --publisher paloaltonetworks --offer vmseries1 --sku bundle1 --version 7\.1\.1 --json
[
{
"id": "/Subscriptions/subscription-id/Providers/Microsoft.Compute/Locations/westus/Publishers/paloaltonetworks/ArtifactTypes/VMImage/Offers/vmseries1/Skus/bundle1/Versions/7.1.1",
"name": "7.1.1",
"location": "westus",
"plan": {
"publisher": "paloaltonetworks",
"name": "bundle1",
"product": "vmseries1"
},
"osDiskImage": {
"operatingSystem": "Linux"
},
"dataDiskImages": []
}
]
set-azurermvmplan 命令修复了错误。我们应该从门户的自动化脚本部分获取所有参数。
对于像我一样最终来到这里的任何人,如果你不知道出版商或其他任何东西。
为新虚拟机名称 $VM_NAME、资源组 $RESOURCE_GROUP 和位置 $REGION 保存变量,然后 运行 以下命令并创建关联变量:
VM_NAME=<new-vm-name>
RESOURCE_GROUP=<my-resource-group>
REGION=<my-disks-location>
获取$PLAN_NAME、$PLAN_PRODUCT、$PLAN_PUBLISHER **此命令可能需要很长时间。如果您可以提供“--publisher”、“--offer”或“--sku”,则可以缩短等待时间。*
az vm image list --location $REGION --all -o table | grep <any-keyword>
PLAN_NAME=<output-from-command-above>
PLAN_PRODUCT=<output-from-command-above>
PLAN_PUBLISHER=<output-from-command-above>
获取可用磁盘并保存到变量 $OS_DISK 和 $OS_TYPE
az disk list -o table
OS_DISK=<output-from-command-above>
OS_TYPE=<output-from-command-above>
获取网卡列表(如果可用)并保存到变量 $NIC
az network nic list -o table
NIC=<output-from-command-above>
获取可用的虚拟机大小并保存到变量 $VM_SIZE
az vm list-sizes -l $REGION -o table
VM_SIZE=<output-from-command-above>
设置完所有变量后,您可以运行此命令重新创建机器:
az vm create \
--name $VM_NAME \
--resource-group $RESOURCE_GROUP \
--attach-os-disk $OS_DISK \
--os-type $OS_TYPE \
--location $REGION \
--size $VM_SIZE \
--plan-name $PLAN_NAME \
--plan-product $PLAN_PRODUCT \
--plan-publisher $PLAN_PUBLISHER \
--nics $NIC
如果您只想“编辑”/更新 VM 并轻松将计划添加到其中,但收到错误消息:
Azure Error: CannotSetPlanOnUpdate
Message: This resource was created without a plan. A new plan cannot be associated with an update.
您可以使用 VM 配置检索 PowerShell 对象:
$vm = Get-AzureRmVM -ResourceGroupName "<Res-Grp>" -Name "<VM-Name>"
然后按照 michael-b
的建议进行编辑Set-AzureRmVMPlan -VM $vm -Publisher bitnami -Product lampstack -Name "5-6"
然后通过门户删除虚拟机(不要关闭 Powershell Window!) 然后重新部署:
Update-AzureRmVM -VM $vm