Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从捕获的映像以编程方式创建Azure VM_C#_Powershell_Azure_Azure Sdk .net - Fatal编程技术网

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

C# 从捕获的映像以编程方式创建Azure VM,c#,powershell,azure,azure-sdk-.net,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-A

使用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);
var vmname=ComputeClusterMasterName(clusterName);
var p1=新的VirtualMachineCreateDeploymentParameters
{
Name=vmname,
角色=新列表
{  
新角色()
{
RoleType=“PersistentVMRole”,
RoleName=vmname,
RoleSize=“超小”,
ConfigurationSets=新列表(),
},
},
DeploymentSlot=DeploymentSlot.Production,
Label=vmname
};
wait client.VirtualMachines.CreateDeploymentAsync(clusterName,p1);
var parms=新的VirtualMachineCreateParameters();
parms.AvailabilitySetName=clusterName;
parms.RoleName=vmname;
parms.RoleSize=“超小型”;
parms.VMImageName=“捕获的vm映像xx”;
wait client.VirtualMachines.CreateAsync(cloudServiceName、vmname、parms);
当我运行上面的代码时,CreateDeploymentAsync失败:

BadRequest:具有的实体类型“PersistentVMRole”的属性“OSDisk” 名称“c1cmdb”为null或为空


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

看起来您的
CreateDeploymentAsync()
调用正在尝试创建一个新的VM(也称为角色),而没有指定一些必需的字段。创建部署时,它还将启动其第一个虚拟机


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

只适用于与此问题作斗争的任何人。结果是Greg answer暗示了正确的方法,这就是为什么我标记为正确答案的原因

从捕获的映像创建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);
var args=新的VirtualMachineCreateDeploymentParameters
{
Name=vmname,
角色=新列表
{  
新角色
{
RoleType=“PersistentVMRole”,
RoleName=vmname,
RoleSize=“超小”,
ConfigurationSets=新列表(),
VMImageName=“捕获的vm映像xx”,
ProvisionGuestAgent=true,
},
},
DeploymentSlot=DeploymentSlot.Production,
Label=vmname,
};
wait client.VirtualMachines.CreateDeploymentAsync(clusterName,args);
不需要调用CreateAsync,因为该方法具有完全不同的用途:它用于向现有部署添加另一个虚拟机。这个名字简直是误导


到目前为止,由于缺乏文档和示例,使用Azure SDK for.Net的工作非常令人沮丧。

原始VM是使用门户手动创建的。我现在运气不好吗?不,我不知道我是否理解你为什么认为自己会运气不好。:)如果您试图将新VM添加到现有部署中,请完全跳过CreateDeploymentAsync调用,只需将VirtualMachines.CreateAsync与现有cloudservice一起使用,对吗?