Как включить "Планирование информации" при создании виртуальной машины ARM из захваченного изображения с помощью Powershell?

У меня есть виртуальная машина ARM, созданная из Marketplace: bitnami LAMP (Ubuntu). Я успешно сделал снимок. Во время захвата я сохранил шаблон json.

Используя основанный на этом шаблон, я могу в интерактивном режиме успешно создавать новые виртуальные машины с помощью средства развертывания шаблонов. (таким образом, захваченное изображение в порядке). Обратите внимание: этот шаблон JSON включает информацию о плане, см. Ниже

Однако моя первоначальная цель - создать новые виртуальные машины ARM на основе захваченного изображения с помощью Powershell.

Кажется, что все работает, но в последней команде New-AzureRmVM возвращает и сообщение об ошибке:

Создание виртуальной машины из образа Marketplace требует информации Plan в запросе.

Очевидно, что эта информация отсутствует, но я не могу узнать, как ее добавить.

Вот что я попробовал:

  • Я исследовал переменную $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"
  } 

Опять же, захваченное изображение (.vhd), которое пытается использовать этот сценарий, подтверждается хорошо, потому что с тем же захваченным изображением я могу создавать новые виртуальные машины ARM с помощью средства развертывания шаблонов портала.


Я думаю, что источник не слишком важен в этом случае (в нем нет ошибки, просто пропущено что-то, но об этом явно сказано в вопросе), но я все равно присоединяю источник... Необязательное чтение.

# 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

3 ответа

Решение

По состоянию на пять дней назад и 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": []
  }
]

Для всех, кто попадает сюда, как я, если вы не знаете издателя или еще чего-нибудь.

Сохраните переменные для нового имени виртуальной машины $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

Команда set-azurermvmplan исправила ошибку. Мы должны получить все параметры из раздела сценариев автоматизации портала.

Если вы просто хотите "отредактировать"/ обновить виртуальную машину и легко добавить к ней план, но получаете ошибку:

Ошибка Azure: 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
Другие вопросы по тегам