Lorsqu'on démarre une VM dynamiquement par powershell par exemple, on aimerait savoir  tout aussi dynamiquement si la VM est démarrée et opérationnelle.

Pour cela, nous disposons de différentes informations sur la VM, mais lesquels prendre. Par exemple, on peut trouver le statut du réseau, des disques, ... Nous allons voir quels statuts récupérer et comment les interpréter.

Avant de commencer, nous allons nous connecter à la souscription qui contient notre VM :

Login-AzureRmAccount
Select-AzureRmSubscription -Subscription '<Nom de la souscription>'

Si vous cherchez le nom de votre souscription, utilisez la commande Get-AzureRmSubscription

Ainsi, nous pouvons récupérer les différentes informations d'une VM avec la commande Get-AzureRmVM

Get-AzureRmVM -ResourceGroupName '<Nom du groupe>' -Name '<Nom de la VM>'

Parmi les informations renvoyées, on pourrait penser que le statut de la VM nous est indiqué par "ProvisioningState", mais il n'en est rien. Si elle est allumée, c'est "Succeeded" mais si elle est éteinte également.

Pour avoir le statut, il faut ajouter le paramètre "-status" à la commande :

Get-AzureRmVM -ResourceGroupName '<Nom du groupe>' -Name '<Nom de la VM>' -status

Si vous lancez cette commande, vous allez voir toutes sortes d'informations et de statuts. Mais ce qui nous intéresse, ce sont les premiers statuts :

Get-AzureRmVM -ResourceGroupName '<Nom du groupe>' -Name '<Nom de la VM>' -status | Select-Object -ExpandProperty Statuses

Avec cette commande, vous pouvez voir tout d'abord le "PowerState". Ce statut indique l'état de démarrage de la VM. Il peut prendre les valeurs deallocated, stopped, starting, running, ... la liste des statuts peut se trouver ici.

Lorsque ce statut est à "Running", la VM est démarrer. Mais ça ne suffit pas! Ca ne veut pas dire que tous les services sont disponibles. Si par exemple, vous hébergez une base de données sur cette VM, il se peut qu'elle ne soit pas encore disponible. Pour être sûr, que la VM est complètement disponible, il faut également récupérer le "ProvisioningState" qui doit être à "succeeded".

Voici la commande qui permet d'avoir ces statuts :

Get-AzureRmVM -ResourceGroupName '<Nom du groupe>' -Name '<Nom de la VM>' -status | Select-Object -ExpandProperty Statuses | ForEach-Object {$_.Code}

Pour résumer, avec cette commande :

  • Si PowerState = deallocated alors la VM est complètement éteinte et désallouée
  • Si PowerState = running et ProvisionningState = succeeded alors la VM est complètement démarrée

Et voici ce que ça donne en C# en utilisant le package Nuget Microsoft.Azure.Management.Compute.Fluent :

var credentials = InitAzureConfig();
var computeManagement = new ComputeManagementClient(credentials) { SubscriptionId = _subscriptionId };
var vm = await computeManagement.VirtualMachines.GetAsync(resourceGroupName, vmName, InstanceViewTypes.InstanceView);
string technicalStatus = null;
VmStatusEnum vmStatus = VmStatusEnum.UnKnown;

bool isRunning = false;
bool isProvisionned = false;

foreach (var state in vm.InstanceView.Statuses)
{
    if (state.Code.Contains("PowerState"))
    {
        technicalStatus = state.Code;
        switch (state.Code)
        {
            case "PowerState/running":
                isRunning = true;
                vmStatus = VmStatusEnum.Starting;
                break;
            case "PowerState/starting":
                vmStatus = VmStatusEnum.Starting;
                break;
            case "PowerState/deallocating":
                vmStatus = VmStatusEnum.Stopping;
                break;
            case "PowerState/stopped":
                vmStatus = VmStatusEnum.Stopped;
                break;
            case "PowerState/deallocated":
                vmStatus = VmStatusEnum.StoppedAndDeallocated;
                break;
            default:
                vmStatus = VmStatusEnum.UnKnown;
                break;
        }
    }
    else if (state.Code.Equals("ProvisioningState/succeeded", StringComparison.InvariantCultureIgnoreCase))
    {
         isProvisionned = true;
    }
}

if (isRunning && isProvisionned)
{
     vmStatus = VmStatusEnum.Started;
}

 


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *