Программно создавая Azure VM из захваченного изображения

50
6

Использование Azure Powershell выше, это относительно прямолинейно:

$image = "captured-vm-image-xx" 
New-AzureService -ServiceName $servicename -Location $region
$config = New-AzureVMConfig -Name $servicename -InstanceSize ExtraSmall -AvailabilitySetName $avsetname -ImageName $image
New-AzureVM -ServiceName $servicename -VMs $config -VNetName $vnetname -WaitForBoot

Теперь я пытаюсь перенести код выше на С# с помощью Azure 2.4 SDK:

var vmname = ComputeClusterMasterName(clusterName);

var p1 = new VirtualMachineCreateDeploymentParameters
{
Name = vmname,
Roles = new List<Role>
{
new Role()
{
RoleType = "PersistentVMRole",
RoleName = vmname,
RoleSize = "ExtraSmall",
ConfigurationSets = new List<ConfigurationSet>(),
},
},
DeploymentSlot = DeploymentSlot.Production,
Label = vmname
};

await client.VirtualMachines.CreateDeploymentAsync(clusterName, p1);

var parms = new VirtualMachineCreateParameters();
parms.AvailabilitySetName = clusterName;
parms.RoleName = vmname;
parms.RoleSize = "ExtraSmall";
parms.VMImageName = "captured-vm-image-xx";
await client.VirtualMachines.CreateAsync(cloudServiceName, vmname, parms);

Когда я запускаю код выше CreateDeploymentAsync, сбой:

BadRequest: свойство "OSDisk" для типа сущности "PersistentVMRole" с именем "c1cmdb" является нулевым или пустым.

Да, я пропустил это свойство, но почему я должен указать его в первую очередь?

спросил(а) 2014-08-27T21:07:00+04:00 5 лет, 6 месяцев назад
1
Решение
52

Похоже, ваш вызов CreateDeploymentAsync() пытается создать новую виртуальную машину (aka Role) без указания некоторых необходимых полей. Когда развертывание создается, оно также закручивает первую виртуальную машину (ы).

Вы должны указать недостающую информацию в своей исходной роли, потому что в вашем запросе недостаточно информации о создании виртуальной машины. Если вы сравниваете интерфейсы Role и VirtualMachineCreateParameters, вы должны заметить, что многие parallels- имеют более или менее ту же ответственность. Вы пытались вместо этого указать виртуальную виртуальную машину из VmImage в роли в своем первоначальном вызове? Возможно, вам повезет больше. :)

ответил(а) 2014-08-28T00:55:00+04:00 5 лет, 6 месяцев назад
49

Просто для тех, кто борется с этой проблемой. Оказывается, ответ Грега намекнул на правильный подход, который я назвал правильным ответом.

При создании виртуальной машины из захваченного изображения все, что вам нужно сделать, это создать развертывание с использованием этого образа:

var args = new VirtualMachineCreateDeploymentParameters
{
Name = vmname,
Roles = new List<Role>
{
new Role
{
RoleType = "PersistentVMRole",
RoleName = vmname,
RoleSize = "ExtraSmall",
ConfigurationSets = new List<ConfigurationSet>(),
VMImageName = "captured-vm-image-xx",
ProvisionGuestAgent = true,
},
},
DeploymentSlot = DeploymentSlot.Production,
Label = vmname,
};

await client.VirtualMachines.CreateDeploymentAsync(clusterName, args);

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

Работа с Azure SDK для.Net до сих пор была изюминкой разочарования из-за отсутствия документации и образцов.

ответил(а) 2014-08-28T18:22:00+04:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема