Utiliser des rôles de machine virtuelle dans Windows Azure Pack avec Java
S’applique à : Windows Azure Pack
Ce guide illustre certaines tâches de base qu’un développeur client peut effectuer avec des rôles de machine virtuelle (rôles de machine virtuelle), notamment la création, la mise à jour et la mise à l’échelle d’une instance de rôle de machine virtuelle. Les exemples de code sont écrits en Java et ont été créés à l’aide de l’IDE Eclipse. Étant donné que les exemples de ce guide utilisent le service REST HTTP de l’API Gestion des services, vous pouvez modifier ces exemples pour utiliser n’importe quel autre langage capable d’envoyer des requêtes d’opération HTTP. Pour obtenir un guide de toutes les URL disponibles pour les rôles de machine virtuelle, consultez la aide-mémoire d’URL pour les rôles de machine virtuelle [SPFSDK][VMROLE].
Les rôles de machine virtuelle peuvent représenter une ou plusieurs machines virtuelles dédiées à une opération spécifique, comme un serveur web ou un worker web. Les fournisseurs de services peuvent offrir aux locataires une expérience en libre-service pour l’approvisionnement de machines virtuelles via une galerie organisée de rôles de machine virtuelle. Les locataires peuvent approvisionner des rôles de machine virtuelle à partir de la galerie à l’aide de l’interface utilisateur du portail client ou du service HTTP REST. Les rôles de machine virtuelle diffèrent du modèle traditionnel d’approvisionnement des machines virtuelles, car ils fournissent une opération de mise à l’échelle qui vous permet d’ajuster facilement le nombre et la version des machines virtuelles. Pour obtenir un guide d’utilisation des machines virtuelles avec WAP et Java avec le modèle d’approvisionnement traditionnel, consultez Gestion des machines virtuelles avec Java. Les fonctionnalités offertes avec les rôles de machine virtuelle peuvent faciliter l’approvisionnement rapide et le déprovisionnement de vos applications lorsque vous devez ajuster le nombre et la version de vos machines virtuelles.
Service Provider Foundation et Windows Azure Pack pour Windows Server exposent un service extensible qui permet aux fournisseurs de services de créer des portails multilocataires. Un locataire est un client libre-service du fournisseur de services. Le fournisseur de services associe le compte du locataire à un ID d’abonnement et fournit une clé publique à un certificat de sécurité utilisé pour vérifier le locataire. Condition préalable à l’exécution des exemples de ce guide, vous devez disposer d’un abonnement avec un fournisseur de services offrant une galerie de rôles de machine virtuelle, un service cloud dans l’abonnement pour héberger le rôle de machine virtuelle et un réseau virtuel dans l’abonnement pour placer des machines virtuelles. Si votre fournisseur de services vous a donné un nom d’utilisateur et un mot de passe, vous pouvez vous connecter à l’interface utilisateur du portail client et trouver votre ID d’abonnement. Lorsque vous êtes connecté au portail, vous pouvez charger un certificat qui permet à l’hôte de vérifier que vous êtes un utilisateur approuvé et de créer un réseau virtuel que vous pouvez utiliser pour placer des machines virtuelles.
Après avoir exécuté les exemples de ce guide, vous devez être en mesure d’effectuer les tâches suivantes avec du code Java.
Créer un service cloud pour héberger des rôles de machine virtuelle
Obtenir la liste des rôles de machine virtuelle à partir de la galerie
Obtenir une référence à un élément de galerie de rôles de machine virtuelle
Créer une instance de rôle de machine virtuelle
Mettre à l’échelle un rôle de machine virtuelle
Démarrer, arrêter, redémarrer, arrêter ou supprimer une machine virtuelle
Mettre à jour ou supprimer un rôle de machine virtuelle
Créer un service cloud pour héberger des rôles de machine virtuelle
Vous devez disposer d’un service cloud dans votre abonnement pour héberger des rôles de machine virtuelle. Pour répertorier tous les services cloud, envoyez une requête d’opération HTTP GET à l’URL suivante pour CloudServices. Notez que chaque fois que vous utilisez une URL avec la galerie de rôles de machine virtuelle ou les services cloud, vous devez également ajouter la chaîne de requête api-version=2013-03. La chaîne de requête commence toujours par le ? caractère après l’URL.
https://server:port/subscription-id/CloudServices?api-version=2013-03
L’exemple de code Java suivant, Get_list, peut retourner tous les services cloud de votre abonnement. Les exemples de ce guide représentent votre ID d’abonnement par la chaîne : 2222aa22-22a2-2a22-2a22-2a22-2aaaaa2aaaaa. En général, vous pouvez définir l’en-tête x-ms-principal-id sur l’e-mail du locataire associé à l’abonnement actuel.
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 le champ valeur de la réponse HTTP est vide, cela signifie que vous n’avez aucun service cloud dans votre abonnement et que vous devez en créer un avant de provisionner un rôle de machine virtuelle. Vous pouvez créer un service cloud en envoyant une requête d’opération HTTP POST à la même URL CloudServices, mais dans le corps de la demande, vous devez spécifier un nom et une étiquette pour le nouveau service cloud. Pour les exemples de ce guide, oData ajouté au corps d’une requête HTTP peut être enregistré dans un fichier texte sur votre ordinateur nommé odata.txt. Par exemple, l’envoi des odata.txt suivants peut être utilisé pour créer un service cloud nommé TestingCloudService799.
{
"Name": "TestingCloudService799",
"Label": "TestingCloudService799"
}
Tous les exemples de code Java lisent odata.txt à l’aide de la méthode getpayload() suivante.
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;}
}
L’exemple de code Java, Create_cs, crée un service cloud nommé TestingCloudService799. Il lit odata.txt, diffuse ces informations dans un corps HTTP, définit les en-têtes, puis envoie une demande d’opération POST au point de terminaison 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();
}
}
Obtenir la liste des rôles de machine virtuelle à partir de la galerie
Les fournisseurs de services peuvent proposer aux locataires une galerie libre-service de rôles de machine virtuelle. Le locataire peut ensuite créer un rôle de machine virtuelle à partir de l’un des éléments de la galerie de rôles de machine virtuelle. Vous pouvez rechercher tous les rôles de machine virtuelle proposés à votre abonnement en envoyant une demande d’opération HTTP GET à l’URL suivante pour la galerie de rôles de machine virtuelle. Par exemple, vous pouvez utiliser l’URL suivante et Get_list pour obtenir les rôles de machine virtuelle proposés à votre abonnement.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems/$/MicrosoftCompute.VMRoleGalleryItem?api-version=2013-03
Voici un exemple de réponse HTTP contenant la collection d’éléments de la galerie de rôles de machine virtuelle.
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"}]}
Cette réponse indique qu’il existe un rôle de machine virtuelle proposé par le fournisseur de services : un rôle de machine virtuelle CentOS 6 avec Apache, MySQL et PHP déjà installé. D’autres éléments peuvent apparaître dans la galerie en fonction des rôles de machine virtuelle proposés à votre abonnement. Notez la chaîne dans la réponse qui donne la propriété ContentUrl pour l’élément. Vous devez utiliser cette valeur pour obtenir une référence à l’élément spécifique.
« ContentUrl »:"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27) »
Obtenir une référence à un élément de galerie de rôles de machine virtuelle
Après avoir sélectionné un élément de rôle de machine virtuelle dans la galerie, obtenez la définition de ressource de cet élément et déterminez les paramètres de ressource que vous devez fournir. La définition de ressource est un fichier JSON qui décrit le matériel de la machine virtuelle et les restrictions d’instanciation. Pour plus d’informations sur la définition de ressource, consultez la section ResourceDefinition [SPFSDK][VMROLE].
Utilisez Get_list pour envoyer une demande d’opération GET à l’URL de l’élément de galerie que vous avez sélectionné.
https://server:port/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0.0%27,Publisher%3d%27Microsoft%27)/MicrosoftCompute.ResourceDefinitionGalleryItem/ResourceDefinition?api-version=2013-03
Pour cet exemple, cette réponse HTTP inclut l’objet ResourceDefinition pour le rôle de machine virtuelle 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"}
Notez que la propriété ResourceParameters répertorie les paramètres. Bien que tous les rôles de machine virtuelle ne soient pas requis pour avoir des paramètres, si des paramètres sont répertoriés dans la propriété ResourceParameters de l’objet ResourceDefinition, vous devez fournir une valeur pour chacun de ces paramètres. Vous pouvez fournir les paramètres et leurs valeurs en les empaquetant dans une chaîne encodée JSON au format suivant.
{ « parameter1 name » : « parameter1 value », « parameter2 name » : « parameter2 value », ... }
Une fois que vous avez collecté ParameterValues, vous pouvez générer un objet ResourceConfiguration contenant ParameterValues et la version des valeurs de paramètre. Dans ce guide, l’exemple d’objet ResourceConfiguration utilise les valeurs de paramètre suivantes.
"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"
}
Notez que le réseau virtuel nommé VMNetwork1 doit déjà exister dans l’abonnement du locataire. Un réseau virtuel doit être spécifié pour placer des machines virtuelles. Vous pouvez créer un réseau virtuel à l’aide du portail de l’interface utilisateur du locataire de votre abonnement.
Créer une instance de rôle de machine virtuelle
Générez un nouvel objet VirtualMachineRole en combinant l’objet ResourceDefinition récupéré à partir de la galerie de rôles de machine virtuelle et l’objet ResourceConfiguration que vous avez créé à l’étape précédente. Envoyez ensuite l’intégralité de l’objet VirtualMachineRole en tant que corps d’une requête d’opération HTTP POST à l’URL de VMRoles.
https://server:port/subscription-id/CloudServices/cloudservice-name/Resources/MicrosoftCompute/VMRoles?api-version=2013-03
Par exemple, le odata.txt peut contenir l’objet VitualMachineRole suivant.
{
"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
}
Vous pouvez utiliser le code Java suivant, Create_vmr et l’exemple d’objet VirtualMachine, pour créer un rôle de machine virtuelle nommé 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();
}
}
Étant donné que InitialInstanceCount est 1, une machine virtuelle TestVMRole, nommée LAMP0001, est mise sur VMNetwork1 et démarrée. Vous pouvez obtenir l’ID de cette nouvelle machine virtuelle en envoyant une requête d’opération HTTP GET à l’URL des machines virtuelles de TestVMRole.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03
L’ID unique de la machine virtuelle est représenté dans ce guide par la chaîne 6e66ee6e-6e6e-6666-ee66-e666-e666e6666e.
Mettre à l’échelle un rôle de machine virtuelle
Vous pouvez ajuster le nombre de machines virtuelles en cours d’exécution dans une instance de rôle de machine virtuelle en envoyant une demande d’opération HTTP POST à l’URL du rôle de machine virtuelle et du point de terminaison de mise à l’échelle. Le nombre d’instances ne peut pas être inférieur au nombre minimal ou supérieur au nombre maximal d’instances que vous avez spécifiées dans l’objet VitualMachineRole. Par exemple, vous utilisez l’URL suivante pour ajuster l’échelle du rôle TestVMRole.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/Scale?api-version=2013-03
Le corps de la demande d’opération POST doit spécifier le nombre de machines virtuelles à instancier pour le rôle de machine virtuelle en tant que InstanceCount. L’envoi des odata.txt suivants augmente le nombre de machines virtuelles exécutées dans TestVMRole à deux.
{
"InstanceCount": 2
}
Pour obtenir la liste de toutes les machines virtuelles actuellement dans le rôle TestVMRole, envoyez une requête d’opération HTTP GET à l’URL des machines virtuelles.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03
L’exemple de réponse HTTP se présente comme suit.
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 réponse HTTP indique qu’une deuxième machine virtuelle du rôle TestVMRole nommé LAMP0002 et représentée par 77ff7777-7777-7777-7777-777f-f7f7777f7 est maintenant en cours d’exécution.
Notez que si le rôle de machine virtuelle est mis à l’échelle vers un nombre d’instances inférieur au nombre actuel de machines virtuelles, certaines des machines virtuelles sont supprimées, qu’elles soient en cours d’exécution ou non. Si vous souhaitez supprimer une machine virtuelle spécifique dans un rôle de machine virtuelle, consultez la section suivante Démarrer, arrêter, redémarrer, arrêter ou supprimer une machine virtuelle.
Démarrer, arrêter, redémarrer, arrêter ou supprimer une machine virtuelle
Vous pouvez arrêter la machine virtuelle en envoyant une requête d’opération HTTP POST à l’URL suivante avec un corps vide. Par exemple, l’exemple de code Java suivant arrête LAMP002, qui a ID=77ff777-7777-7777-7777-ff7f-f7f77777f7.
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();
}
}
Vous pouvez également utiliser cet exemple de code Java pour effectuer une requête d’opération HTTP POST pour démarrer, redémarrer ou arrêter une machine virtuelle. Utilisez l’URL suivante pour démarrer la LAMP0002 arrêtée.
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
Utilisez l’URL suivante pour redémarrer la LAMP0002 en cours d’exécution.
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
Utilisez l’URL suivante pour arrêter l’exécution de LAMP0002.
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
Vous pouvez supprimer une machine virtuelle spécifique en envoyant une requête d’opération HTTP DELETE au point de terminaison de la machine virtuelle avec une charge utile vide. Vous devez arrêter la machine virtuelle avant de la supprimer. Notez que l’exemple utilise l’en-tête X-HTTP-Method pour remplacer l’opération POST par DELETE. Par exemple, le code Java suivant, Delete_vm, supprime la machine virtuelle qui a ID=77ff7777-7777-7777-ff7f-f7f7777f7.
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();
}
}
Notez que cela supprime spécifiquement la machine virtuelle LAMP0002. Si TestVMRole est mis à l’échelle de 2 à 1 instances, la machine virtuelle LAMP0001 est supprimée, même si LAMP0002 a été arrêtée précédemment.
Mettre à jour ou supprimer un rôle de machine virtuelle
Vous pouvez mettre à jour une instance de rôle de machine virtuelle vers une nouvelle version alors que les machines virtuelles des versions précédentes continuent à s’exécuter. Si vous ajoutez de nouvelles machines virtuelles en effectuant un scale-out du rôle de machine virtuelle, les nouvelles machines virtuelles obtiennent la version mise à jour du rôle de machine virtuelle. Les machines virtuelles basées sur les deux versions peuvent s’exécuter en même temps. Vous devrez peut-être arrêter ou supprimer ces machines virtuelles spécifiques en fonction de la version antérieure.
Vous pouvez mettre à jour un rôle de machine virtuelle en envoyant une demande d’opération HTTP MERGE à l’URL du rôle de machine virtuelle. Le corps contient les informations mises à jour à fusionner dans VirtualMachineRole.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole?api-version=2013-03
Par exemple, la odata.txt suivante met à jour le rôle TestVMRole de la version 1.0.0.0 vers la version 1.0.0.1. Alors que la version 1.0.0.0 a placé des machines virtuelles sur VMNetwork1, l’exemple de version 1.0.0.1 place les machines virtuelles sur 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"
}
}
L’exemple de code Java suivant peut mettre à jour la version de TestVMRole. Notez que l’exemple utilise l’en-tête X-HTTP-Method pour remplacer l’opération POST par 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();
}
}
Après avoir exécuté ce code, si de nouvelles machines virtuelles TestVMRole sont créées, elles seront la version 1.0.0.1. Les machines virtuelles 1.0.0.0 existantes continuent à s’exécuter. Par exemple, augmentez l’échelle de TestVMRole de 1 à 2. La nouvelle machine virtuelle utilise la nouvelle version et s’exécute sur VMNetwork2. La machine virtuelle s’exécutant sur VMNetwork1 continue à s’exécuter sur VMNetwork1. Vous pouvez réduire le nombre d’instances ou supprimer l’ancienne machine virtuelle pour mettre à jour toutes les instances de la version précédente du rôle de machine virtuelle.
Pour supprimer un rôle de machine virtuelle et toutes les machines virtuelles du rôle, arrêtez les machines virtuelles et envoyez une requête d’opération HTTP DELETE à l’URL du rôle de machine virtuelle avec un corps vide. Utilisez l’en-tête X-HTTP-Method pour remplacer l’opération POST par DELETE.
Voir aussi
Gestion des machines virtuelles avec Java
Service de locataire des rôles de machine virtuelle [SPFSDK][VMROLE]
Référence JSON du rôle de machine virtuelle [SPFSDK][VMROLE]