2014-08-27 107 views
1

使用Azure的PowerShell中的上述创建Azure的VM是比较直接的:编程方式从拍摄的图像

$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失败:

错误请求:属性 'OSDisk' 的实体类型“P ersistentVMRole'与 名称'c1cmdb'为空或空。

是的,我已经省略了那个属性,但为什么我必须在第一个地方指定它?

回答

1

看起来你的CreateDeploymentAsync()调用正在尝试创建一个新的虚拟机(aka Role)而没有指定一些必需的字段。创建部署时,它也会启动第一个虚拟机。

由于创建虚拟机的请求中没有足够的信息,您必须在原始角色中指定缺少的信息。如果您比较RoleVirtualMachineCreateParameters的界面,您应该注意到很多相似之处 - 它们或多或少具有相同的责任。您是否曾尝试在首次调用中的角色中从VmImage中指定实际的虚拟机?这样你可能会有更多的运气。 :)

+0

原始VM是使用门户手动创建的。我现在运气不好吗? – 2014-08-28 07:26:47

+0

不,我不确定我明白你为什么认为你运气不好。 :)如果您尝试将新虚拟机添加到现有部署中,请完全跳过CreateDeploymentAsync调用,并使用VirtualMachines.CreateAsync和现有的cloudservice,对吧? – 2014-08-28 15:15:16

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因为该方法有一个完全不同的用途:它是用于将另一台虚拟机添加到现有部署中。命名只是误导。

由于缺少文档和示例,迄今为止,与.NET一起使用Azure SDK已经成为挫折的一次胜利。

相关问题