Gérer ses VM Scale Sets avec PowerShell et Azure Automation

Azure VM Scale Set est le service de Microsoft Azure qui vous permet d’effectuer de la scalabilité automatique sur vos machines virtuelles, en mode Azure Resource Manager (ARM). Il est ainsi possible de faire varier le nombre d’instances de vos machines virtuelles en fonction de règles personnalisées. Par exemple, on peut appliquer une règle de type « augmenter le nombre d’instances si le CPU est à plus de 70% ».
Azure VM Scale Set facilite alors le déploiement et la gestion d’un groupe de machines virtuelles identiques en ARM, sans se préoccuper des composants réseaux, de stockage de façon individuelle. Cette ressource intervient notamment dans les services Azure Service Fabric et Azure Container Service. On se base sur une image de référence, à partir de laquelle les machines virtuelles du Scale Set vont être instanciées, et on y applique ses propres règles d’autoscalabilité.
La facturation du service VM Scale Set est directement liée à l’utilisation des machines virtuelles. Ainsi, on peut considérer de la même façon que l’on peut arrêter le service (donc les machines virtuelles liées au Scale Set) lorsqu’on ne l’utilise pas pour réduire la facturation. La première option est de passer par le portail, c’est une fonctionnalité qui a été récemment mise à disposition.
Il est alors possible de cliquer sur « Deallocate » pour libérer toutes les VMs du Scale Set.
Comme toujours sur le Cloud, les possibilités en termes d’automatisation sont très pertinentes, voyons donc les quelques commandes à exécuter pour effectuer les mêmes opérations via PowerShell.
Lancer PowerShell avec Azure PowerShell précédemment installé, et exécuter les commandes suivantes pour repérer les souscriptions Azure rattachées à votre compte.
Login-AzureRmAccount Get-AzureRMSubscription | Sort SubscriptionName
Vous pouvez alors vous positionner sur la souscription de votre choix (remplacez la valeur de $subscr par le nom de votre souscription de travail).
$subscr="Ma souscription" Get-AzureRmSubscription –SubscriptionName $subscr | Select-AzureRmSubscription
La liste des Azure VM Scale Sets de votre souscription est accessible.
Get-AzureRmVmss
Vous pouvez récupérer un VM Scale Set en particulier en y ajoutant des paramètres supplémentaires.
Get-AzureRmVmss -ResourceGroupName "MyResourceGoup" -VMScaleSetName "MyVmss"
Il est possible de récupérer les informations sur une instance de machine virtuelle du Scale Set via cette commande (les instances sont numérotées à partir de 0).
Get-AzureRmVmssVM -ResourceGroupName "MyResourceGoup" -VMScaleSetName "MyVmss" -InstanceId 1
C’est avec la commande suivante que vous déclenchez l’arrêt des instances sur votre VM Scale Set.
Stop-AzureRmVmss -ResourceGroupName "MyResourceGoup" -VMScaleSetName "MyVmss"
Vous pouvez également déclencher l’opération inverse.
Start-AzureRmVmss -ResourceGroupName "MyResourceGoup" -VMScaleSetName "MyVmss"
Ces commandes PowerShell peuvent être combinées avec Azure Automation pour procéder au déclenchement automatique de ces opérations à des instants définis. On peut imaginer que l’on démarre le VM Scale Set en début de journée et qu’on désalloue les instances de VM en fin de journée, pour un environnement Azure Service Fabric de développement par exemple.
Dans ce cas, la contrainte est de disposer des derniers modules pour pouvoir exécuter les commandes évoquées précédemment dans le compte Azure Automation. Il faut se rendre dans la rubrique Assets puis Modules, et parcourir la Galerie de modules que l’on peut importer dans Azure Automation.
Pour l’import des modules, effectuez l’ajout dans l’ordre suivant, car il y a une dépendance entre les deux modules :
- AzureRM.profile
- AzureRM.Compute
Vous pouvez alors exécuter les dernières commandes disponibles dans vos Runbook Azure Automation. Un Runbook peut être paramétré avec des assets Azure Automation :
- de type Credential, pour spécifier le compte Azure de connexion,
- de type Variable, pour spécifier des valeurs qui pourront être modifiées en fonction de l’exécution.
Voici un exemple de script pour un Runbook « Stop-AzureVMSS ».
param ( [Parameter(Mandatory=$false)] [String] $AzureCredentialAssetName = 'AzureCredential', [Parameter(Mandatory=$false)] [String] $AzureSubscriptionIdAssetName = 'AzureSubscriptionId', [Parameter(Mandatory=$true)] [String] $ResourceGroupName, [Parameter(Mandatory=$true)] [String] $VMScaleSetName ) # Returns strings with status messages [OutputType([String])] # Connect to Azure and select the subscription to work against $Cred = Get-AutomationPSCredential -Name $AzureCredentialAssetName -ErrorAction Stop $null = Add-AzureRmAccount -Credential $Cred -ErrorAction Stop -ErrorVariable err if($err) { throw $err } $SubId = Get-AutomationVariable -Name $AzureSubscriptionIdAssetName -ErrorAction Stop Get-AzureRmSubscription –SubscriptionId $SubId | Select-AzureRmSubscription Stop-AzureRmVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSetName
Cette procédure s’insère parfaitement dans la logique de l’Infrastructure-as-Code, qui vous permet de manipuler les ressources de votre SI avec maîtrise et agilité grâce au Cloud.
Pour plus d’informations sur cette thématique, je vous invite à prendre connaissance de notre livre blanc From Zero To Hero « Infra-as-Code », From Zero to Hero de Cellenza 🙂