使用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将上面的代码移植到C#:
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:实体类型'PersistentVMRole'的属性'OSDisk' name'c1cmdb'为null或为空。
是的,我省略了该属性,但为什么我必须首先指定它?
答案 0 :(得分:1)
看起来您的CreateDeploymentAsync()
调用正在尝试创建新VM(也称为Role)而未指定某些必需字段。创建部署时,它还会旋转其第一个虚拟机。
您必须在原始角色中指定缺少的信息,因为您的请求中没有足够的信息来创建虚拟机。如果您比较Role
和VirtualMachineCreateParameters
的界面,您应该注意到很多相似之处 - 它们或多或少地分担相同的责任。您是否尝试在初始调用中从角色的VmImage中指定实际的VM?你可能会有这样的运气。 :)
答案 1 :(得分:1)
只为那些在这个问题上挣扎的人。事实证明,格雷格的回答暗示了正确的方法,这就是为什么我被标记为正确的答案。
从捕获的映像创建VM时,您所要做的就是使用该映像创建部署:
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 for .Net由于缺乏文档和样本而令人沮丧。