以编程方式从捕获的映像创建Azure VM

时间:2014-08-27 18:07:02

标签: c# powershell azure azure-sdk-.net

使用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或为空。

是的,我省略了该属性,但为什么我必须首先指定它?

2 个答案:

答案 0 :(得分:1)

看起来您的CreateDeploymentAsync()调用正在尝试创建新VM(也称为Role)而未指定某些必需字段。创建部署时,它还会旋转其第一个虚拟机。

您必须在原始角色中指定缺少的信息,因为您的请求中没有足够的信息来创建虚拟机。如果您比较RoleVirtualMachineCreateParameters的界面,您应该注意到很多相似之处 - 它们或多或少地分担相同的责任。您是否尝试在初始调用中从角色的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由于缺乏文档和样本而令人沮丧。