Compartilhar via


Usar funções de VM em Windows Pacote do Azure com Java

 

Aplica-se a: Windows Azure Pack

Este guia demonstra algumas tarefas básicas que um desenvolvedor de locatário pode fazer com funções de máquina virtual (funções de VM), incluindo criação, atualização e dimensionamento de uma instância de função de VM. Os exemplos de código são escritos em Java e foram criados usando o IDE do Eclipse. Como os exemplos neste guia usam o serviço baseado em HTTP REST da API de Gerenciamento de Serviços, você pode modificar esses exemplos para trabalhar com qualquer outro idioma capaz de enviar solicitações de operação HTTP. Para obter um guia para todas as URLs que estão disponíveis para funções de VM, consulte a Folha de Referência de URL para Funções de VM [SPFSDK][VMROLE].

As funções de VM podem representar uma ou mais máquinas virtuais dedicadas a uma operação específica, como um servidor Web ou um servidor Web. Os provedores de serviços podem oferecer aos locatários uma experiência de autoatendimento para provisionar máquinas virtuais por meio de uma galeria de funções de máquina virtual com curadoria. Os locatários podem provisionar funções de VM da galeria usando a interface do usuário do portal do locatário ou o serviço baseado em HTTP REST. As funções de VM diferem do modelo tradicional de provisionamento de máquinas virtuais porque fornecem uma operação de escala que permite ajustar o número e a versão das máquinas virtuais facilmente. Para obter um guia sobre como usar máquinas virtuais com WAP e Java com o modelo de provisionamento tradicional, consulte o Gerenciamento de Máquinas Virtuais com Java. Os recursos oferecidos com funções de VM podem auxiliar o provisionamento rápido e o desprovisionamento de seus aplicativos quando você precisa ajustar o número e a versão de suas máquinas virtuais.

O Service Provider Foundation e o Windows Azure Pack for Windows Server expõem um serviço extensível que permite aos provedores de serviço criar portais multilocatários. Um locatário é um cliente de autoatendimento do provedor de serviços. O provedor de serviços associa a conta do locatário a uma ID de assinatura e fornece uma chave pública a um certificado de segurança usado para verificar o locatário. Pré-requisito para executar os exemplos neste guia, você precisará ter uma assinatura com um provedor de serviços que ofereça uma galeria de funções de VM, um serviço de nuvem na assinatura para hospedar a função de VM e uma rede virtual na assinatura para colocar máquinas virtuais. Se o provedor de serviços tiver fornecido um nome de usuário e uma senha, você poderá fazer logon na interface do usuário do portal do locatário e encontrar sua ID de assinatura. Ao fazer logon no portal, você pode carregar um certificado que permite que o host verifique você como um usuário confiável e você pode criar uma rede virtual que pode ser usada para colocar máquinas virtuais.

Depois de executar os exemplos neste guia, você deve ser capaz de realizar as tarefas a seguir com código Java.

  • Criar um serviço de nuvem para hospedar funções de VM

  • Obter uma lista de funções de VM da galeria

  • Obter uma referência a um item da galeria de funções de VM

  • Criar uma nova instância de função de VM

  • Dimensionar uma função de VM

  • Iniciar, parar, reiniciar, desligar ou excluir uma máquina virtual

  • Atualizar ou excluir uma função de VM

Criar um serviço de nuvem para hospedar funções de VM

Você deve ter um serviço de nuvem em sua assinatura para hospedar funções de VM. Para listar todos os serviços de nuvem, envie uma solicitação de operação HTTP GET para a URL a seguir para CloudServices. Observe que sempre que você usa uma URL com a galeria de funções de VM ou serviços de nuvem, também deve acrescentar a cadeia de caracteres de consulta api-version=2013-03. A cadeia de caracteres de consulta sempre começa com o ? caractere após a URL.

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

O exemplo de código Java a seguir, Get_list, pode retornar todos os serviços de nuvem em sua assinatura. Os exemplos neste guia representarão sua ID de assinatura pela cadeia de caracteres: 2222aa22-22a2-2a22-2aaaaa. Em geral, você pode definir o cabeçalho x-ms-principal-id para o email do locatário associado à assinatura atual.

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();
   }
}

Se o campo de valor na resposta HTTP estiver vazio, isso significa que você não tem serviços de nuvem em sua assinatura e precisará criar um antes de provisionar uma função de VM. Você pode criar um serviço de nuvem enviando uma solicitação de operação HTTP POST para a mesma URL do CloudServices, mas no corpo da solicitação você deve especificar um nome e rótulo para o novo serviço de nuvem. Para os exemplos neste guia, o OData adicionado ao corpo de uma solicitação HTTP pode ser salvo em um arquivo de texto em seu computador chamado odata.txt. Por exemplo, o envio do odata.txt a seguir pode ser usado para criar um serviço de nuvem chamado TestingCloudService799.

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

Todos os exemplos de código Java são lidos odata.txt usando o método getpayload() a seguir.

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;}
 }

O exemplo de código Java, Create_cs, cria um novo serviço de nuvem chamado TestingCloudService799. Ele lê odata.txt, transmite essas informações para um corpo HTTP, define os cabeçalhos e envia uma solicitação de operação POST para o ponto de extremidade 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();
   }
}   

Os provedores de serviços podem oferecer aos locatários uma galeria de autoatendimento de funções de máquina virtual. Em seguida, o locatário pode criar uma função de VM de um dos itens da galeria de funções da VM. Você pode consultar todas as funções de VM oferecidas à sua assinatura enviando uma solicitação de operação HTTP GET para a URL a seguir para a galeria de funções da VM. Por exemplo, você pode usar a URL e Get_list a seguir para obter as funções de VM oferecidas à sua assinatura.

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

Aqui está um exemplo da resposta HTTP que contém a coleção de itens da galeria de funções de VM.

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"}]}

Essa resposta indica que há uma função de VM oferecida pelo provedor de serviços: uma função de máquina virtual CentOS 6 com Apache, MySQL e PHP já instalados. Outros itens podem aparecer na galeria dependendo de quais funções de VM são oferecidas à sua assinatura. Observe a cadeia de caracteres na resposta que fornece a propriedade ContentUrl para o item. Você precisará usar esse valor para obter uma referência ao item específico.

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

Depois de selecionar um item de Função de VM da galeria, obtenha a definição de recurso para esse item e determine quais parâmetros de recurso você precisará fornecer. A definição de recurso é um arquivo JSON que descreve as restrições de hardware e instanciação da máquina virtual. Para obter mais informações sobre a definição de recurso, consulte a seção ResourceDefinition [SPFSDK][VMROLE] .

Use Get_list para enviar uma solicitação de operação GET para a URL do item da galeria selecionado.

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

Para este exemplo, essa resposta HTTP inclui o objeto ResourceDefinition para a função de VM 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"}

Observe que a propriedade ResourceParameters lista parâmetros. Embora nem todas as funções de VM sejam necessárias para ter parâmetros, se quaisquer parâmetros estiverem listados na propriedade ResourceParameters do objeto ResourceDefinition, você deverá fornecer um valor para cada um deles. Você pode fornecer os parâmetros e seus valores empacotando-os em uma cadeia de caracteres codificada em JSON usando o formato a seguir.

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

Depois de reunir o ParameterValues, você poderá criar um objeto ResourceConfiguration que contém o ParameterValues e a versão dos valores de parâmetro. Neste guia, o objeto ResourceConfiguration de exemplo usa os valores de parâmetro a seguir.

"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"
}

Observe que a rede virtual chamada VMNetwork1 já deve existir na assinatura do locatário. Uma rede virtual deve ser especificada para colocar máquinas virtuais. Você pode criar uma rede virtual usando o portal de interface do usuário do locatário de sua assinatura.

Criar uma nova instância de função de VM

Crie um novo objeto VirtualMachineRole combinando o objeto ResourceDefinition recuperado da galeria de funções da VM e o objeto ResourceConfiguration que você criou na etapa anterior. Em seguida, envie todo o objeto VirtualMachineRole como o corpo de uma solicitação de operação HTTP POST para a URL para VMRoles.

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

Por exemplo, o odata.txt pode conter o seguinte 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
}

Você pode usar o código Java a seguir, Create_vmr e o objeto VirtualMachine de exemplo, para criar uma nova função de VM chamada 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();
   }
}  

Como InitialInstanceCount é 1, uma máquina virtual TestVMRole, chamada LAMP0001, é colocada na VMNetwork1 e iniciada. Você pode obter a ID dessa nova máquina virtual enviando uma solicitação de operação HTTP GET para a URL das VMs do TestVMRole.

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

A ID exclusiva para a vm é representada neste guia pela cadeia de caracteres 6e66ee6e-6e6e-6666-ee66-e666e6666e.

Dimensionar uma função de VM

Você pode ajustar quantas máquinas virtuais estão em execução em uma instância de função de VM enviando uma solicitação de operação HTTP POST para a URL para a função de VM e o ponto de extremidade de escala. O número de instâncias não pode ser menor que o mínimo ou mais do que o número máximo de instâncias especificadas no objeto VitualMachineRole. Por exemplo, você usa a URL a seguir para ajustar a escala da função TestVMRole.

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

O corpo da solicitação de operação POST deve especificar o número de máquinas virtuais a serem instanciadas para a função de VM como InstanceCount. Enviar o odata.txt a seguir aumenta o número de máquinas virtuais em execução no TestVMRole para duas.

{
    "InstanceCount": 2
}

Para obter uma lista de todas as máquinas virtuais atualmente na função TestVMRole, envie uma solicitação de operação HTTP GET para a URL das VMs.

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

O exemplo de resposta HTTP tem a seguinte aparência.

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}]}]}

A resposta HTTP mostra que uma segunda máquina virtual da função TestVMRole chamada LAMP0002 e representada por 77ff7777-7777-7777-ff7f-f7f7f7f7777f7 agora está em execução.

Observe que, se a função de VM for dimensionada para uma contagem de instâncias menor que o número atual de máquinas virtuais, algumas das VMs serão excluídas se estiverem ou não em execução. Se você quiser excluir uma máquina virtual específica em uma função de VM, consulte a seção a seguir Iniciar, parar, reiniciar, desligar ou excluir uma máquina virtual.

Iniciar, parar, reiniciar, desligar ou excluir uma máquina virtual

Você pode interromper a máquina virtual enviando uma solicitação de operação HTTP POST para a URL a seguir com um corpo vazio. Por exemplo, o exemplo de código Java a seguir interrompe LAMP002, que tem ID=77ff7777-7777-7777-ff7f-f7f7f7f7777f7.

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();
   }
}   

Você também pode usar este código Java de exemplo para fazer uma solicitação de operação HTTP POST para iniciar, reiniciar ou desligar uma VM. Use a URL a seguir para iniciar o LAMP0002 interrompido.

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 a URL a seguir para reiniciar o LAMP0002 em execução.

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 a URL a seguir para desligar o LAMP0002 em execução.

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

Você pode excluir uma máquina virtual específica enviando uma solicitação de operação HTTP DELETE para o ponto de extremidade da VM com uma carga vazia. Você deve parar a VM antes de excluí-la. Observe que o exemplo usa o cabeçalho X-HTTP-Method para substituir a operação POST com DELETE. Por exemplo, o código Java a seguir, Delete_vm, exclui a VM que tem ID=77ff7777-7777-7777-ff7f-f7f7f7f7777f7.

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();
   }
}

Observe que isso exclui a máquina virtual LAMP0002 especificamente. Se o TestVMRole for redimensionado de 2 para 1 instâncias, a máquina virtual LAMP0001 será excluída, mesmo que LAMP0002 tenha sido interrompida anteriormente.

Atualizar ou excluir uma função de VM

Você pode atualizar uma instância de função de VM para uma nova versão enquanto as máquinas virtuais das versões anteriores continuam a ser executadas. Se você adicionar novas máquinas virtuais dimensionando a Função de VM, as novas máquinas virtuais obterão a versão atualizada da função de VM. Máquinas virtuais baseadas em ambas as versões podem ser executadas ao mesmo tempo. Talvez seja necessário interromper ou excluir essas máquinas virtuais específicas com base na versão anterior.

Você pode atualizar uma função de VM enviando uma solicitação de operação DE MESCLAGEM HTTP para a URL da função de VM. O corpo contém as informações atualizadas para mesclar no VirtualMachineRole.

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

Por exemplo, o odata.txt a seguir atualiza a função TestVMRole da versão 1.0.0.0 para a versão 1.0.0.1. Enquanto a versão 1.0.0.0 colocou máquinas virtuais na VMNetwork1, a versão de exemplo 1.0.0.1 coloca máquinas virtuais na 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"
    }
}  

O exemplo de código Java a seguir pode atualizar a versão TestVMRole. Observe que o exemplo usa o cabeçalho X-HTTP-Method para substituir a operação POST com 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();
   }
}  

Depois de executar esse código, se novas VMs TestVMRole forem criadas, elas serão a versão 1.0.0.1. As VMs da versão 1.0.0.0 existentes continuam sendo executadas. Por exemplo, aumente a escala de TestVMRole de 1 para 2. A nova máquina virtual usa a nova versão e é executada na VMNetwork2. A máquina virtual em execução na VMNetwork1 continua a ser executada na VMNetwork1. Você pode reduzir o número de instâncias ou excluir a máquina virtual mais antiga para atualizar todas as instâncias da versão anterior da Função de VM.

Para excluir uma função de VM e todas as máquinas virtuais na função, interrompa as máquinas virtuais e envie uma solicitação de operação HTTP DELETE para a URL da função VM com um corpo vazio. Use o cabeçalho X-HTTP-Method para substituir a operação POST com DELETE.

Consulte Também

Gerenciamento de Máquina Virtual com Java
Serviço de Locatário de Funções de VM [SPFSDK][VMROLE]
Referência JSON da função VM [SPFSDK][VMROLE]