Compartir a través de


Uso de roles de máquina virtual en Windows Azure Pack con Java

 

Se aplica a: Windows Azure Pack

En esta guía se muestran algunas tareas básicas que un desarrollador de inquilinos puede realizar con roles de máquina virtual (roles de máquina virtual), incluida la creación, actualización y escalado de una instancia de rol de máquina virtual. Los ejemplos de código se escriben en Java y se crearon con el IDE de Eclipse. Dado que en los ejemplos de esta guía se usa el servicio basado en REST HTTP de service Management API, puede modificar estos ejemplos para trabajar con cualquier otro lenguaje capaz de enviar solicitudes de operación HTTP. Para obtener una guía sobre todas las direcciones URL que están disponibles para los roles de máquina virtual, consulte la hoja de referencia rápida de direcciones URL para roles de máquina virtual [SPFSDK][VMROLE].

Los roles de máquina virtual pueden representar una o varias máquinas virtuales dedicadas a una operación específica, como un servidor web o un trabajo web. Los proveedores de servicios pueden ofrecer a los inquilinos una experiencia de autoservicio para el aprovisionamiento de máquinas virtuales a través de una galería mantenida de roles de máquina virtual. Los inquilinos pueden aprovisionar roles de máquina virtual desde la galería mediante la interfaz de usuario del portal de inquilinos o el servicio basado en REST HTTP. Los roles de máquina virtual difieren del modelo tradicional de aprovisionamiento de máquinas virtuales porque proporcionan una operación de escalado que permite ajustar fácilmente el número y la versión de las máquinas virtuales. Para obtener una guía sobre el uso de máquinas virtuales con WAP y Java con el modelo de aprovisionamiento tradicional, consulte Administración de máquinas virtuales con Java. Las funcionalidades que se ofrecen con roles de máquina virtual pueden ayudar al aprovisionamiento y desaprovisionamiento rápidos de las aplicaciones cuando necesite ajustar el número y la versión de las máquinas virtuales.

Service Provider Foundation y Windows Azure Pack para Windows Server exponen un servicio extensible que permite a los proveedores de servicios crear portales multiinquilino. Un inquilino es un cliente de autoservicio del proveedor de servicios. El proveedor de servicios asocia la cuenta del inquilino a un identificador de suscripción y proporciona una clave pública a un certificado de seguridad que se usa para comprobar el inquilino. Requisito previo para ejecutar los ejemplos de esta guía deberá tener una suscripción con un proveedor de servicios que ofrezca una galería de roles de máquina virtual, un servicio en la nube en la suscripción para hospedar el rol de máquina virtual y una red virtual en la suscripción para colocar máquinas virtuales. Si el proveedor de servicios le ha proporcionado un nombre de usuario y una contraseña, puede iniciar sesión en la interfaz de usuario del portal de inquilinos y encontrar el identificador de suscripción. Mientras ha iniciado sesión en el portal, puede cargar un certificado que permita al host comprobarlo como usuario de confianza y puede crear una red virtual que puede usar para colocar máquinas virtuales.

Después de ejecutar los ejemplos de esta guía, debería poder realizar las siguientes tareas con código Java.

  • Creación de un servicio en la nube para hospedar roles de máquina virtual

  • Obtención de una lista de roles de máquina virtual desde la galería

  • Obtención de una referencia a un elemento de la galería de roles de máquina virtual

  • Creación de una nueva instancia de rol de máquina virtual

  • Escalado de un rol de máquina virtual

  • Iniciar, detener, reiniciar, apagar o eliminar una máquina virtual

  • Actualización o eliminación de un rol de máquina virtual

Creación de un servicio en la nube para hospedar roles de máquina virtual

Debe tener un servicio en la nube en la suscripción para hospedar roles de máquina virtual. Para enumerar todos los servicios en la nube, envíe una solicitud de operación HTTP GET a la siguiente dirección URL para CloudServices. Tenga en cuenta que siempre que use una dirección URL con la galería de roles de máquina virtual o los servicios en la nube, también debe anexar la cadena de consulta api-version=2013-03. La cadena de consulta siempre comienza con ? carácter después de la dirección URL.

https://server:port/subscription-id/CloudServices?api-version=2013-03

El siguiente ejemplo de código Java, Get_list, puede devolver todos los servicios en la nube de la suscripción. Los ejemplos de esta guía representarán el identificador de suscripción por la cadena: 2222aa22-22a2-2a22-2a22-2aaaa. En general, puede establecer el encabezado x-ms-principal-id en el correo electrónico del inquilino asociado a la suscripción actual.

public class Get_list 
{
public static void main(String[] args) throws Exception 
   {
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices?api-version=2013-03";       
   URL url = new URL(u);                       
   HttpURLConnection c = null;        
   c = (HttpsURLConnection)url.openConnection();
   c.setRequestMethod("GET");
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null){System.out.println(decodedString);}
   in.close();
   }
}

Si el campo de valor de la respuesta HTTP está vacío, esto significa que no tiene ningún servicio en la nube en la suscripción y tendrá que crear uno antes de aprovisionar un rol de máquina virtual. Puede crear un servicio en la nube enviando una solicitud de operación HTTP POST a la misma dirección URL de CloudServices, pero en el cuerpo de la solicitud debe especificar un nombre y una etiqueta para el nuevo servicio en la nube. Para los ejemplos de esta guía, el OData agregado al cuerpo de una solicitud HTTP se puede guardar en un archivo de texto en el equipo denominado odata.txt. Por ejemplo, el envío de los siguientes odata.txt se puede usar para crear un servicio en la nube denominado TestingCloudService799.

{
    "Name": "TestingCloudService799",
    "Label": "TestingCloudService799"
}

Todos los ejemplos de código java leen odata.txt con el siguiente método getpayload().

public class Data 
{
private String s;
public Data() 
   {
   String fileName = ("C:"+File.separator+"test"+File.separator+"odata.txt");
   File dataFile = new File(fileName);
   byte[] content = new byte[0];
   {      
   try {FileInputStream dataInputStream = new FileInputStream(dataFile);
      int bytesAvailable = dataInputStream.available();
      content = new byte[bytesAvailable];
      dataInputStream.read(content);
      dataInputStream.close();}       
   catch (FileNotFoundException fnfe) {System.out.println("Couldn't find a file called " + fileName);}       
   catch (IOException ioe) {System.out.println("Couldn't read from a file called " + fileName);}      
   this.s = new String(content);
   }
   }
   public String getpayload(){return s;}
 }

El ejemplo de código java, Create_cs, crea un nuevo servicio en la nube denominado TestingCloudService799. Lee odata.txt, transmite esta información a un cuerpo HTTP, establece los encabezados y, a continuación, envía una solicitud de operación POST al punto de conexión de Cloudservices.

public class Create_cs 
{
public static void main(String[] args) throws Exception 
   {
   Data s = new Data();
   String payload = s.getpayload();
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices?api-version=2013-03";       
   URL url = new URL(u);                        
   HttpURLConnection c = null;       
   c = (HttpsURLConnection)url.openConnection();
   c.setRequestMethod("POST");
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   c.setDoOutput(true);
   OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
   out.write(payload);
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null) 
      {System.out.println(decodedString);}
   in.close();
   }
}   

Los proveedores de servicios pueden ofrecer a los inquilinos una galería de autoservicio de roles de máquina virtual. Después, el inquilino puede crear un rol de máquina virtual a partir de uno de los elementos de la galería de roles de máquina virtual. Puede consultar todos los roles de máquina virtual que se ofrecen a la suscripción mediante el envío de una solicitud de operación HTTP GET a la siguiente dirección URL para la galería de roles de máquina virtual. Por ejemplo, puede usar la siguiente dirección URL y Get_list para obtener los roles de máquina virtual que se ofrecen a la suscripción.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems/$/MicrosoftCompute.VMRoleGalleryItem?api-version=2013-03

Este es un ejemplo de la respuesta HTTP que contiene la colección de elementos de la galería de roles de máquina virtual.

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 2148
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
Content-Language: en-US
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
DataServiceVersion: 3.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Wed, 05 Feb 2014 20:11:29 GMT

{"odata.metadata":"https://server:port/SC2012R2/VMM/GalleryService.svc/$metadata#GalleryItems/MicrosoftCompute.VMRoleGalleryItem","value":[{"odata.type":"MicrosoftCompute.VMRoleGalleryItem","Name":"CentOS6LAMP","Publisher":"Microsoft","Version":"1.0.0.0","ContentUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/Content","Description":"Deploy a CentOS 6 virtual machine role with Apache, MySQL and PHP installed.","IconUrl":null,"Label":"CentOS6 LAMP Role","PublishDate":"2014-01-21T19:09:11.163","PublisherLabel":"Microsoft","ResourceDefinition@odata.mediaContentType":"application/json","ResourceDefinitionUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/MicrosoftCompute.ResourceDefinitionGalleryItem/ResourceDefinition","ViewDefinitionUrl":"Gallery/ViewDefinitions(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/%24value"}]}

Esta respuesta indica que hay un rol de máquina virtual ofrecido por el proveedor de servicios: un rol de máquina virtual CentOS 6 con Apache, MySQL y PHP ya instalados. Otros elementos pueden aparecer en la galería en función de los roles de máquina virtual que se ofrecen a la suscripción. Anote la cadena en la respuesta que proporciona la propiedad ContentUrl para el elemento. Deberá usar este valor para obtener una referencia al elemento específico.

"ContentUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)"

Después de seleccionar un elemento de rol de máquina virtual de la galería, obtenga la definición de recursos de ese elemento y determine qué parámetros de recurso debe proporcionar. La definición de recursos es un archivo JSON que describe las restricciones de hardware y creación de instancias de la máquina virtual. Para obtener más información sobre la definición de recursos, consulte la sección ResourceDefinition [SPFSDK][VMROLE].

Use Get_list para enviar una solicitud de operación GET a la dirección URL del elemento de la galería que ha seleccionado.

https://server:port/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/MicrosoftCompute.ResourceDefinitionGalleryItem/ResourceDefinition?api-version=2013-03

En este ejemplo, esta respuesta HTTP incluye el objeto ResourceDefinition para el rol de máquina virtual centOS.

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 2009
Content-Type: application/json
Content-Language: en-US
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Thu, 06 Feb 2014 17:03:10 GMT

{"IntrinsicSettings":{"HardwareProfile":{"VMSize":"[Param.VMRoleVMSize]"},"NetworkProfile":{"NetworkAdapters":[{"IPAddresses":[{"AllocationMethod":"Dynamic","ConfigurationName":"IPV4Configuration","Type":"IPV4"}],"Name":"NIC1","NetworkRef":"[Param.VMRoleNetworkRef]"}]},"OperatingSystemProfile":{"AdminCredential":"[Param.VMRoleAdminCredential]","ComputerNamePattern":"[Param.VMRoleComputerNamePattern]","LinuxOperatingSystemProfile":{"DNSDomainName":"[Param.VMRoleDNSDomainName]","SSHPublicKey":"[Param.VMRoleSSHPublicKey]"},"TimeZone":"[Param.VMRoleTimeZone]","WindowsOperatingSystemProfile":null},"ScaleOutSettings":{"InitialInstanceCount":"1","MaximumInstanceCount":"5","MinimumInstanceCount":"1","UpgradeDomainCount":"1"},"StorageProfile":{"OSVirtualHardDiskImage":"[Param.VMRoleOSVirtualHardDiskImage]"}},"Name":"CentOS6LAMP","Publisher":"Microsoft","ResourceExtensionReferences":[{"Name":"CentOS6LAMP","Publisher":"Microsoft","ReferenceName":"CentOS6LAMP","ResourceExtensionParameterValues":"{\"MySQLRootPassword\":\"[Param.CentOS6LAMPMySQLRootPassword]\"}","Version":"1.0.0.0"}],"ResourceParameters":[{"Description":"Computer size","Name":"VMRoleVMSize","Type":"String"},{"Description":"Operating system disk","Name":"VMRoleOSVirtualHardDiskImage","Type":"String"},{"Description":"Network reference","Name":"VMRoleNetworkRef","Type":"String"},{"Description":"Resource Extension CentOS6LAMP. Parameter MySQLRootPassword. Run once command parameter","Name":"CentOS6LAMPMySQLRootPassword","Type":"SecureString"},{"Description":"Compute name pattern","Name":"VMRoleComputerNamePattern","Type":"String"},{"Description":"Time zone","Name":"VMRoleTimeZone","Type":"String"},{"Description":"Administrator credential","Name":"VMRoleAdminCredential","Type":"Credential"},{"Description":"DNS domain name","Name":"VMRoleDNSDomainName","Type":"String"},{"Description":"SSH public key","Name":"VMRoleSSHPublicKey","Type":"String"}],"SchemaVersion":"1.0","Type":"Microsoft.Compute\/VMRole\/1.0","Version":"1.0.0.0"}

Tenga en cuenta que la propiedad ResourceParameters enumera los parámetros. Aunque no todos los roles de máquina virtual deben tener parámetros, si se muestran parámetros en la propiedad ResourceParameters del objeto ResourceDefinition, debe proporcionar un valor para cada uno de ellos. Puede proporcionar los parámetros y sus valores si los empaqueta en una cadena codificada en JSON con el formato siguiente.

{ "parameter1 name" : "parameter1 value", "parameter2 name" : "parameter2 value", ... }

Después de recopilar parameterValues, puede compilar un objeto ResourceConfiguration que contenga parameterValues y la versión de los valores de parámetro. En esta guía, el objeto ResourceConfiguration de ejemplo usa los siguientes valores de parámetro.

"ResourceConfiguration": 
{
"ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork1\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
"Version": "1.0.0.0"
}

Tenga en cuenta que la red virtual denominada VMNetwork1 ya debe existir en la suscripción del inquilino. Se debe especificar una red virtual para colocar máquinas virtuales. Puede crear una red virtual mediante el portal de interfaz de usuario del inquilino de la suscripción.

Creación de una nueva instancia de rol de máquina virtual

Compile un nuevo objeto VirtualMachineRole combinando el objeto ResourceDefinition recuperado de la galería de roles de máquina virtual y el objeto ResourceConfiguration que creó en el paso anterior. A continuación, envíe todo el objeto VirtualMachineRole como cuerpo de una solicitud de operación HTTP POST a la dirección URL de VMRoles.

https://server:port/subscription-id/CloudServices/cloudservice-name/Resources/MicrosoftCompute/VMRoles?api-version=2013-03

Por ejemplo, el odata.txt puede contener el siguiente objeto VitualMachineRole.

{
    "InstanceView": null,
    "Label": "My VM Role Instance",
    "Name": "TestVMRole",
    "ProvisioningState": null,
    "ResourceConfiguration": {
        "ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork1\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
        "Version": "1.0.0.0"
    },
    "ResourceDefinition": {
        "IntrinsicSettings": {
            "HardwareProfile": { "VMSize": "[Param.VMRoleVMSize]" },
            "NetworkProfile": {
                "NetworkAdapters": [{
                    "IPAddresses": [{
                        "AllocationMethod": "Dynamic",
                        "ConfigurationName": "IPV4Configuration",
                        "LoadBalancerConfigurations": [],
                        "Type": "IPV4"
                    }],
                    "Name": "NIC1",
                    "NetworkRef": "[Param.VMRoleNetworkRef]"
                }]
            },
            "OperatingSystemProfile": {
                "AdminCredential": "[Param.VMRoleAdminCredential]",
                "ComputerNamePattern": "[Param.VMRoleComputerNamePattern]",
                "LinuxOperatingSystemProfile": {
                    "DNSDomainName": "[Param.VMRoleDNSDomainName]",
                    "SSHPublicKey": "[Param.VMRoleSSHPublicKey]"
                },
                "TimeZone": "[Param.VMRoleTimeZone]",
                "WindowsOperatingSystemProfile": null
            },
            "ScaleOutSettings": {
                "InitialInstanceCount": "1",
                "MaximumInstanceCount": "5",
                "MinimumInstanceCount": "1",
                "UpgradeDomainCount": "1"
            },
            "StorageProfile": {
                "DataVirtualHardDisks": [],
                "OSVirtualHardDiskImage": "[Param.VMRoleOSVirtualHardDiskImage]"
            }
        },
        "Name": "CentOS6LAMP",
        "Publisher": "Microsoft",
        "ResourceExtensionReferences": [{
            "Name": "CentOS6LAMP",
            "Publisher": "Microsoft",
            "ReferenceName": "CentOS6LAMP",
            "ResourceExtensionParameterValues": "{\"MySQLRootPassword\":\"[Param.CentOS6LAMPMySQLRootPassword]\"}",
            "Version": "1.0.0.0"
        }],
        "ResourceParameters": [{
            "Description": "Computer size",
            "Name": "VMRoleVMSize",
            "Type": "String"
        },
            {
                "Description": "Operating system disk",
                "Name": "VMRoleOSVirtualHardDiskImage",
                "Type": "String"
            },
            {
                "Description": "Network reference",
                "Name": "VMRoleNetworkRef",
                "Type": "String"
            },
            {
                "Description": "Resource Extension CentOS6LAMP. Parameter MySQLRootPassword. Run conce command parameter",
                "Name": "CentOS6LAMPMySQLRootPassword",
                "Type": "SecureString"
            },
            {
                "Description": "Compute name pattern",
                "Name": "VMRoleComputerNamePattern",
                "Type": "String"
            },
            {
                "Description": "Time zone",
                "Name": "VMRoleTimeZone",
                "Type": "String"
            },
            {
                "Description": "Administrator credential",
                "Name": "VMRoleAdminCredential",
                "Type": "Credential"
            },
            {
                "Description": "DNS domain name",
                "Name": "VMRoleDNSDomainName",
                "Type": "String"
            },
            {
                "Description": "SSH public key",
                "Name": "VMRoleSSHPublicKey",
                "Type": "String"
            }
        ],
        "SchemaVersion": "1.0",
        "Type": "Microsoft.Compute/VMRole/1.0",
        "Version": "1.0.0.0"
    },
    "Substate": null
}

Puede usar el siguiente código Java, Create_vmr y el objeto VirtualMachine de ejemplo, para crear un nuevo rol de máquina virtual denominado TestVMRole.

public class Create_vmr 
{
public static void main(String[] args) throws Exception 
   {
   Data s = new Data();
   String payload = s.getpayload();
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles?api-version=2013-03";       
   URL url = new URL(u);                        
   HttpURLConnection c = null;       
   c = (HttpsURLConnection)url.openConnection();
   c.setRequestMethod("POST");
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   c.setDoOutput(true);
   OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
   out.write(payload);
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
   in.close();
   }
}  

Dado que InitialInstanceCount es 1, una máquina virtual TestVMRole, denominada LAMP0001, se coloca en VMNetwork1 y se inicia. Para obtener el identificador de esta nueva máquina virtual, envíe una solicitud de operación HTTP GET a la dirección URL de las máquinas virtuales de TestVMRole.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03

El identificador único de la máquina virtual se representa en esta guía mediante la cadena 6e66ee6e-6e6e-6666-ee66-e666e66666e.

Escalado de un rol de máquina virtual

Puede ajustar el número de máquinas virtuales que se ejecutan en una instancia de rol de máquina virtual mediante el envío de una solicitud de operación HTTP POST a la dirección URL para el rol de máquina virtual y el punto de conexión de escalado. El número de instancias no puede ser menor que el mínimo o más que el número máximo de instancias especificadas en el objeto VitualMachineRole. Por ejemplo, use la siguiente dirección URL para ajustar la escala del rol TestVMRole.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/Scale?api-version=2013-03

El cuerpo de la solicitud de operación POST debe especificar el número de máquinas virtuales a las que se va a crear una instancia para el rol de máquina virtual como InstanceCount. El envío del siguiente odata.txt aumenta el número de máquinas virtuales que se ejecutan en TestVMRole a dos.

{
    "InstanceCount": 2
}

Para obtener una lista de todas las máquinas virtuales que se encuentran actualmente en el rol TestVMRole, envíe una solicitud de operación HTTP GET a la dirección URL de las máquinas virtuales.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03

La respuesta HTTP de ejemplo tiene el siguiente aspecto.

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 496
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
request-id: d3350337-10af-0000-897f-39d3af10cf01
DataServiceVersion: 3.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Thu, 06 Feb 2014 21:52:56 GMT

{"odata.metadata":"https://server:8090/SC2012R2/VMM/Microsoft.Management.Odata.svc/$metadata#VM","value":[{"Id":"6e66ee6e-6e6e-6666-ee66-e666e666666e","ComputerName":"LAMP001.mydns","RuntimeState":"Running","ConnectToAddresses":[{"IPAddress":"10.0.0.4","NetworkName":"VMNetwork1","Port":3389}]},{"Id":"77ff7777-7777-7777-ff7f-f7f7f77777f7","ComputerName":"LAMP002","RuntimeState":"Running","ConnectToAddresses":[{"IPAddress":"10.0.0.5","NetworkName":"VMNetwork1","Port":3389}]}]}

La respuesta HTTP muestra que una segunda máquina virtual del rol TestVMRole denominado LAMP0002 y representada por 77ff7777-7777-7777-7777-ff7f-f7f7f7777f7 ahora se está ejecutando.

Tenga en cuenta que si el rol de máquina virtual se escala a un recuento de instancias que es menor que el número actual de máquinas virtuales, algunas de las máquinas virtuales se eliminan tanto si se están ejecutando como si no. Si desea eliminar una máquina virtual específica en un rol de máquina virtual, consulte la siguiente sección Inicio, detención, reinicio, apagado o eliminación de una máquina virtual.

Iniciar, detener, reiniciar, apagar o eliminar una máquina virtual

Para detener la máquina virtual, envíe una solicitud de operación HTTP POST a la siguiente dirección URL con un cuerpo vacío. Por ejemplo, el siguiente ejemplo de código Java detiene LAMP002, que tiene ID=77ff7777-7777-7777-ff7f-f7f7f7777f7.

public class Start_vmr 
{
public static void main(String[] args) throws Exception 
   {
   String payload ="";
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Stop?api-version=2013-03";       
   URL url = new URL(u);                        
   HttpURLConnection c = null;       
   c = (HttpsURLConnection)url.openConnection();
   c.setRequestMethod("POST");
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   c.setDoOutput(true);
   OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
   out.write(payload);
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
   in.close();
   }
}   

También puede usar este código Java de ejemplo para realizar una solicitud de operación HTTP POST para iniciar, reiniciar o apagar una máquina virtual. Use la siguiente dirección URL para iniciar el lamp0002 detenido.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Start?api-version=2013-03

Use la siguiente dirección URL para reiniciar la ejecución de LAMP0002.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Restart?api-version=2013-03

Use la siguiente dirección URL para apagar lamp0002 en ejecución.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Shutdown?api-version=2013-03

Puede eliminar una máquina virtual específica mediante el envío de una solicitud de operación HTTP DELETE al punto de conexión de la máquina virtual con una carga vacía. Debe detener la máquina virtual antes de eliminarla. Tenga en cuenta que en el ejemplo se usa el encabezado X-HTTP-Method para invalidar la operación POST con DELETE. Por ejemplo, el siguiente código Java, Delete_vm, elimina la máquina virtual que tiene ID=77ff7777-7777-7777-ff7f-f7f7f7777f7.

public class Delete_vm 
{
public static void main(String[] args) throws Exception 
   {
   String payload ="";
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7?api-version=2013-03";       
   URL url = new URL(u);                       
   HttpURLConnection c = null;      
   c = (HttpsURLConnection)url.openConnection();
   TrustModifier.relaxHostChecking(c); // ignore host checking errors 
   c.setRequestMethod("POST");        
   c.setRequestProperty("X-HTTP-Method", "DELETE"); 
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   c.setDoOutput(true);        
   OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
   out.write(payload);
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null){System.out.println(decodedString);}
   in.close();
   }
}

Tenga en cuenta que esto elimina específicamente la máquina virtual LAMP0002. Si TestVMRole se reduce horizontalmente de 2 a 1 instancias, la máquina virtual LAMP0001 se elimina, incluso si LAMP0002 se ha detenido anteriormente.

Actualización o eliminación de un rol de máquina virtual

Puede actualizar una instancia de rol de máquina virtual a una nueva versión mientras las máquinas virtuales de versiones anteriores continúan ejecutándose. Si agrega nuevas máquinas virtuales mediante el escalado horizontal del rol de máquina virtual, las nuevas máquinas virtuales obtienen la versión actualizada del rol de máquina virtual. Las máquinas virtuales basadas en ambas versiones se pueden ejecutar al mismo tiempo. Es posible que tenga que detener o eliminar esas máquinas virtuales específicas en función de la versión anterior.

Puede actualizar un rol de máquina virtual enviando una solicitud de operación HTTP MERGE a la dirección URL del rol de máquina virtual. El cuerpo contiene la información actualizada que se va a combinar en VirtualMachineRole.

https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole?api-version=2013-03

Por ejemplo, el siguiente odata.txt actualiza el rol TestVMRole de la versión 1.0.0.0 a la versión 1.0.0.1. Mientras que la versión 1.0.0.0 colocó máquinas virtuales en VMNetwork1, la versión de ejemplo 1.0.0.1 coloca máquinas virtuales en VMNetwork2.

{
    "ResourceConfiguration": {
        "ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork2\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
        "Version": "1.0.0.1"
    }
}  

El siguiente ejemplo de código Java puede actualizar la versión TestVMRole. Tenga en cuenta que en el ejemplo se usa el encabezado X-HTTP-Method para invalidar la operación POST con MERGE.

public class Update_vmr 
{
public static void main(String[] args) throws Exception 
   {
   Data s = new Data();
   String payload = s.getpayload();
   String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole?api-version=2013-03";       
   URL url = new URL(u);                        
   HttpURLConnection c = null;       
   c = (HttpsURLConnection)url.openConnection();
   c.setRequestMethod("POST");
   c.setRequestProperty("X-HTTP-Method", "MERGE");
   c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
   c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
   c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
   c.setRequestProperty("Accept-Charset", "UTF-8");
   c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
   c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
   c.setRequestProperty("x-ms-principal-id", "user@contoso.com");      
   c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
   c.setRequestProperty(“Host”, “user@contoso.com”);
   c.setRequestProperty("Expect", "100-continue");
   c.setDoOutput(true);
   OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
   out.write(payload);
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
   String decodedString;
   while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
   in.close();
   }
}  

Después de ejecutar este código, si se crean nuevas máquinas virtuales TestVMRole, estas serán la versión 1.0.0.1. Las máquinas virtuales existentes de la versión 1.0.0.0 siguen ejecutándose. Por ejemplo, aumente la escala de TestVMRole de 1 a 2. La nueva máquina virtual usa la nueva versión y se ejecuta en VMNetwork2. La máquina virtual que se ejecuta en VMNetwork1 continúa ejecutándose en VMNetwork1. Puede reducir el número de instancias o eliminar la máquina virtual anterior para actualizar todas las instancias de la versión anterior del rol de máquina virtual.

Para eliminar un rol de máquina virtual y todas las máquinas virtuales del rol, detenga las máquinas virtuales y envíe una solicitud de operación HTTP DELETE a la dirección URL del rol de máquina virtual con un cuerpo vacío. Use el encabezado X-HTTP-Method para invalidar la operación POST con DELETE.

Consulte también

Administración de máquinas virtuales con Java
Servicio de inquilino de roles de máquina virtual [SPFSDK][VMROLE]
Referencia JSON del rol de máquina virtual [SPFSDK][VMROLE]