2014-08-27 100 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已經成爲挫折的一次勝利。

相關問題