1

我正在尝试使用 Windows Azure 的 API REST 来创建虚拟机部署。但是,尝试在以下 XML 文件中指定操作系统映像时遇到问题:

<Deployment xmlns="http://schemas.microsoft.com/windowsazure"   xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Name>SomeName</Name>
  <DeploymentSlot>Production</DeploymentSlot>
  <Label></Label>
  <RoleList>
  <Role i:type="PersistentVMRole">
      <RoleName>SomeName</RoleName>
      <OsVersion i:nil="true"/>
      <RoleType>PersistentVMRole</RoleType>
      <ConfigurationSets>
        <ConfigurationSet i:type="WindowsProvisioningConfigurationSet">
        <ConfigurationSetType>WindowsProvisioningConfiguration</ConfigurationSetType>
        <ComputerName>SomeName</ComputerName>
        <AdminPassword>XXXXXXXXXX</AdminPassword>
        <EnableAutomaticUpdates>true</EnableAutomaticUpdates>
        <ResetPasswordOnFirstLogon>false</ResetPasswordOnFirstLogon>
      </ConfigurationSet>
      <ConfigurationSet i:type="NetworkConfigurationSet">
         <ConfigurationSetType>NetworkConfiguration</ConfigurationSetType>
         <InputEndpoints>
         <InputEndpoint>
             <LocalPort>3389</LocalPort>
             <Name>RemoteDesktop</Name>
             <Protocol>tcp</Protocol>
         </InputEndpoint>
         </InputEndpoints>
      </ConfigurationSet>
      </ConfigurationSets>
      <DataVirtualHardDisks/>
      <Label></Label>
      <OSVirtualHardDisk>
      <MediaLink>¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿???????????????</MediaLink>
      <SourceImageName>¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿??????????????????</SourceImageName>
      </OSVirtualHardDisk>
    </Role>
  </RoleList>
</Deployment>`

我需要 MediaLink(操作系统映像的 URI)和 SourceImageName(操作系统映像的规范名称)。我的问题是,门户网站提供了几个预定义的图像,但我无法确定它们的 URI 和规范名称。我是否会被迫创建自己的操作系统映像并将其上传到我的 Windows Azure 帐户下的任何存储服务?

4

1 回答 1

1

要获取这些参数,您可以List OS Images对订阅执行服务管理 API 操作。

更新 请丢弃我下面的一些评论(对此感到抱歉)。我终于能够使用 REST API 创建一个 VM :)。这里有一些事情:

  1. <MediaLink>元素应指定将创建 VM 的 VHD 的 URL。它必须是与您的虚拟机云服务在同一订阅中的一个存储帐户中的 URL。因此,为此,您可以指定如下 URL: https://[yourstorageaccount].blob.core.windows.net/[blobcontainer]/[filename].vhd 其中 [blobcontainer] 将是您所在的 blob 容器的名称会希望 API 存储 VHD,而 [filename] 是您要为 VHD 提供的任何名称。REST API 所做的是复制 中指定的源图像<SourceImageName>并将其保存在<MediaLink>元素中指定的 URI 中。
  2. 确保将存储 VHD 的服务和存储帐户位于同一数据中心/关联组中。此外,数据中心应该能够支持虚拟机。事实证明,并非所有数据中心都支持虚拟机。
  3. XML 元素的顺序至关重要。向上或向下移动一个元素会导致 400 错误。

根据我的实验,代码如下:

        private static void CreateVirtualMachineDeployment(string subscriptionId, X509Certificate2 cert, string cloudServiceName)
        {
            try
            {
                string uri = string.Format("https://management.core.windows.net/{0}/services/hostedservices/{1}/deployments", subscriptionId, cloudServiceName);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.Method = "POST";
                request.ContentType = "application/xml";
                request.Headers.Add("x-ms-version", "2013-03-01");
                request.ClientCertificates.Add(cert);
                string requestPayload = @"<Deployment xmlns=""http://schemas.microsoft.com/windowsazure"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
  <Name>[SomeName]</Name>
  <DeploymentSlot>Production</DeploymentSlot>
  <Label>[SomeLabel]</Label>
  <RoleList>
    <Role i:type=""PersistentVMRole"">
      <RoleName>MyTestRole</RoleName>
      <OsVersion i:nil=""true""/>
      <RoleType>PersistentVMRole</RoleType>
      <ConfigurationSets>
        <ConfigurationSet i:type=""WindowsProvisioningConfigurationSet"">
          <ConfigurationSetType>WindowsProvisioningConfiguration</ConfigurationSetType>
          <ComputerName>[ComputerName]</ComputerName>
          <AdminPassword>[AdminPassword - Ensure it's strong Password]</AdminPassword>
          <AdminUsername>[Admin Username]</AdminUsername>
          <EnableAutomaticUpdates>true</EnableAutomaticUpdates>
          <ResetPasswordOnFirstLogon>false</ResetPasswordOnFirstLogon>
        </ConfigurationSet>
        <ConfigurationSet i:type=""NetworkConfigurationSet"">
          <ConfigurationSetType>NetworkConfiguration</ConfigurationSetType>
          <InputEndpoints>
            <InputEndpoint>
              <LocalPort>3389</LocalPort>
              <Name>RemoteDesktop</Name>
              <Protocol>tcp</Protocol>
            </InputEndpoint>
          </InputEndpoints>
        </ConfigurationSet>
      </ConfigurationSets>
      <DataVirtualHardDisks/>
      <Label></Label>
      <OSVirtualHardDisk>
        <MediaLink>https://[storageaccount].blob.core.windows.net/vhds/fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Web-CY13SU04-SQL11-SP1-CU3-11.0.3350.0.vhd</MediaLink>
        <SourceImageName>fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Web-CY13SU04-SQL11-SP1-CU3-11.0.3350.0</SourceImageName>
      </OSVirtualHardDisk>
    </Role>
  </RoleList>
</Deployment>";
                byte[] content = Encoding.UTF8.GetBytes(requestPayload);
                request.ContentLength = content.Length;
                using (var requestStream = request.GetRequestStream())
                {
                    requestStream.Write(content, 0, content.Length);
                }

                using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
                {
                }
            }
            catch (WebException webEx)
            {
                using (var streamReader = new StreamReader(webEx.Response.GetResponseStream()))
                {
                    string result = streamReader.ReadToEnd();
                    Console.WriteLine(result);
                }
            }

        }

希望这可以帮助!

于 2013-05-16T13:07:12.217 回答