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

时间:2016-03-08 15:31:29

标签: azure-powershell azure-resource-manager azureportal

我有一个从市场创建的ARM VM:bitnami LAMP(Ubuntu) 我成功拍摄了一张照片。在捕获过程中,我保存了json模板。

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

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

所有似乎都在最后一个命令New-AzureRmVM返回并错误说明:

  

从Marketplace图像创建虚拟机需要Plan   请求中的信息。

显然这些信息丢失了,但我找不到如何添加它。

以下是我尝试的内容:

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

实际上,原始捕获的json模板包含Plan intomation:

  },
  "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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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": []
  }
]

答案 2 :(得分:0)

set-azurermvmplan命令修复了错误。我们应该从门户网站的自动化脚本部分获取所有参数。

答案 3 :(得分:0)

对于其他像我这样结束的人,如果您不知道发布者或其他任何内容。

为新的虚拟机名称$ 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>

获取nics列表(如果有)并将其保存到变量$ 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

答案 4 :(得分:0)

如果您只想“编辑” /更新VM并轻松地将计划添加到其中,但是却收到错误消息:

天蓝色错误:CannotSetPlanOnUpdate

消息:此资源是没有计划的。新计划不能与更新关联。

您可以使用以下虚拟机配置来检索PowerShell对象:

$vm = Get-AzureRmVM -ResourceGroupName "<Res-Grp>" -Name "<VM-Name>"

然后按照michael-b的建议进行编辑

Set-AzureRmVMPlan -VM $vm -Publisher bitnami -Product lampstack -Name "5-6"

然后通过门户删除虚拟机(请勿关闭Powershell窗口!) 然后重新部署:

Update-AzureRmVM -VM $vm