2

上面使用 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:名称为“c1cmdb”的实体类型“PersistentVMRole”的属性“OSDisk”为空或为空。

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

4

2 回答 2

2

看起来您的CreateDeploymentAsync()呼叫正在尝试创建一个新的虚拟机(又名角色)而不指定一些必填字段。创建部署时,它还会启动其第一个虚拟机。

您必须在原始角色中指定缺少的信息,因为您的请求中没有足够的信息来创建虚拟机。如果你比较 和 的接口RoleVirtualMachineCreateParameters你应该注意到很多相似之处——它们或多或少地分担相同的责任。您是否尝试过在初始调用中从角色中的 VmImage 指定您的实际 VM?这样你可能会有更多的运气。:)

于 2014-08-27T21:55:41.910 回答
2

仅适用于任何为这个问题而苦苦挣扎的人。原来 Greg 的答案暗示了正确的方法,这就是我标记为正确答案的原因。

从捕获的映像创建 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,因为该方法具有完全不同的目的:它用于将另一个虚拟机添加到现有部署中。命名只是误导。

由于缺乏文档和示例,到目前为止,使用适用于 .Net 的 Azure SDK 一直是一种挫败感。

于 2014-08-28T15:22:37.713 回答