Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Pilotez Azure avec PowerShell

Poster un commentaire

Azure ce n’est pas seulement le portail, c’est aussi des commandes Powershell. Il y a même pas mal d’actions qui ne peuvent se faire qu’avec des scripts Powershell.

L’autre intérêt est évidemment de pouvoir scripter la création d’un environnement.

Nous allons voir dans cet article comment démarrer dans Azure avec PowerShell Azure à travers un mini projet pour lancer et éteindre des VM.

[edit 21/03/15]: Je viens d’ajouter un complément, installation du SDK Azure que curieusement j’avais oublié!!???

Monter son environnement PowerShell

L’installation de PowerShell Azure peut se faire d’ici:

http://azure.microsoft.com/en-us/downloads/?fb=en-us

2014-10-14_10-07-22

Si vous êtes sous Windows 8.1 Enterprise, PowerShell est déjà installé, vous aurez juste à ajouter les cmdlets Azures (liens de droite).

Une fois installé, épinglez la console Azure dans la barre des tâches pour la retrouver plus facilement. Au lancement vous devriez voir ceci:

2014-10-14_12-22-15

Installer ISE

ISE est le compagnon indispensable pour développer en PowerShell. Il est installé en même temps que Powershell, mais un peu planqué sous Windows 8.

On peut le trouver ici:

%systemroot%\system32\windowspowershell\v1.0\powershell_ise.exe

Profitez en pour faire un raccourci et lancez le en mode administrateur.

2014-10-14_12-48-18

Sur la gauche deux volets. Vous reconnaissez en bas une console permettant de lancer des commandes. On dispose d’IntelliSense.

En haut une zone où l’on peut charger ou écrire un script. On peut ajouter des points d’arrêt et faire tout ce que l’on attend d’un IDE normal.

 

La dernière version apporte une fonctionnalité vraiment intéressante surtout quand on débute en PowerShell. Sur le volet de droite, dans la liste déroulante Module, sélectionnez un module qui vous intéresse. Par exemple Azure:

2014-10-14_12-50-12

On va sélectionner une commande, par exemple Get-AzureVM qui obtient des informations sur une VM:

2014-10-14_12-52-50

Vous notez le truc intéressant, l’outil charge automatiquement les modules nécessaires, il suffit de faire Afficher les détails:

2014-10-14_12-55-25

L’affichage dépend un peu de la commande sélectionnée. Dans notre cas on doit fournir le nom d’une VM (ServiceName) et le nom du cloud service (Name) où elle est déployée. La documentation de la commande est ici:

http://msdn.microsoft.com/en-us/library/dn495236.aspx

2014-10-14_12-57-59

Une fois renseigné le bouton Exécuter s’active. Notez aussi avant de cliquer dessus la zone Paramètres communs que je vous laisse explorer. Au bout de quelques seconde:

2014-10-14_12-59-56

Le bouton Insérer ne fait qu’insérer la commande dans la console sans la lancer et Copier la copie dans le presse papier.

Peut être vous demandez vous comment fait Powershell pour savoir quel abonnement Azure est concerné et où trouver les credentials. Nous répondront à cette question au chapitre qui suit.

 

Vous pouvez compléter votre installation de ISE avec un outils tiers complémentaire, mais payant:

http://www.powershellmagazine.com/2014/03/28/isesteroids-a-revolutionary-powershell-ise-add-on/

Configurer Azure

Les cmdlets Azure doivent être installées à part, même sur les VM de la galerie Azure. Pour savoir si elles sont déjà installées, lancez:

get-module

Il s’affiche ceci si Azure est présent:

2015-03-21_22-37-35

Si vous ne le voyez pas apparaître, on peut aussi ajouter directement le nom du module:

Get-AzureModule Azure

Si vous devez installer, c’est ici:

http://azure.microsoft.com/en-us/downloads/#cmd-line-Tools

2015-03-21_22-43-08

L’installation est très simple et se fait avec WPI.

On charge ensuite le module:

Import-Module « C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Azure.psd1 »

Note: il faudra regarder un peu l’emplacement exact d’azure.psd1, j’ai a peu près tout vu.

Il reste une dernière étape, importer un ou plusieurs abonnements.

Importer un abonnement

La procédure est décrite dans un article précédent, on ne la reprendra donc pas:

https://amethyste16.wordpress.com/2014/07/15/charger-le-publishsettingsfile-dans-la-console-powershell/

On peut obtenir la liste des abonnements connus de votre configuration:

Get-AzureSubscription

2014-10-14_17-44-53

Comme on le voit dans cet exemple un des abonnements est déclaré comme étant l’abonnement par défaut. Pour passer à un autre abonnement:

Select-AzureSubscription -SubscriptionName « MON ABONNEMENT » 

Et pour savoir qui est l’abonnement courant après tous ces changements:

Get-AzureSubscription -Current

On peut avoir besoin de spécifier des paramètres par défaut d’un abonnement. La méthode Set-AzureSubscription est là pour ça. Par exemple la sélection d’un storage:

Set-AzureSubscription -SubscriptionName « MON ABONNEMENT » -CurrentStorageAccount « MON COMPTE STORAGE »

Auparavant vous pouvez regarder si vous disposez déjà d’un compte de stockage:

Get-AzureStorageAccount

Une fois le changement effectué, si vous relancez Get-AzureSubscription vous devriez voir les changement dans le paramètre CurrentStorageAccountName:

2014-10-14_17-58-47

Toutes ces infos et d’autres sont stockées dans le fichier publishSettings. Il est important de le mettre en un endroit sécurisé ou de ne pas le laisser sur un ordinateur que vous n’utilisez plus. Pour le supprimer:

%appdata%\Windows Azure Powershell

Autre commande intéressante, s’assurer que l’on a la dernière version des modules, par exemple le module Azure:

Get-Module -list Azure

2014-10-15_12-07-24

Et la liste des commandes du module:

Get-Command -Module Azure | more

On peut en trouver la documentation ici:

http://msdn.microsoft.com/library/azure/jj554330.aspx

Appel des API REST

Azure se pilote aussi depuis des API REST et il est possible de le faire depuis un script Powershell. Pourquoi pourrait t’on avoir besoin de faire ça d’ailleurs?

Les cmdlets Powershell sont capables de faire presque tout sous Azure, mais pas absolument tout. Voici un exemple de commandes REST qui ne semble accessible ni au portail, ni en Powershell:

http://msdn.microsoft.com/library/azure/jj154114.aspx

C’est pour ce genre de situation que Powershell propose la commande:

Invoke-RestMethod

La documentation des Api REST se trouve ici:

http://msdn.microsoft.com/library/azure/ee460799.aspx

 

Mais soyons honnête, c’est pas très simple et en général il faut essayer d’éviter. Si vous avez besoin de le faire, voici un tuto:

http://blogs.technet.com/b/heyscriptingguy/archive/2014/03/17/using-the-windows-azure-rest-apis-with-powershell.aspx

Un mini projet

Nous allons créer un mini projet typique du genre de choses que l’on fait avec Powershell Azure. Nous allons créer des tâches planifiées qui stoppent et redémarrent des VM à des heures précises de la journée.

C’est un script d’usage pratique car lorsqu’une VM tourne elle est facturée. Seulement on ne travaille pas la nuit, le week-end ou les jours féries.  D’où l’intérêt d’un tel script qui peut faire faire des économies intéressantes.

 

La commande Get-AzureVM devrait nous intéresser. Elle affiche ceci:

2014-10-15_12-19-08

J’ai deux VM, OK. Mais comment obtenir notre liste dans une variable?

Essayons ces 3 lignes de commandes pour comprendre:

$vms = Get-AzureVM
echo $vms
echo $vms | select Name

Le premier echo affiche la même chose que dans la copie d’écran qui précède.

Le deuxième echo affiche juste la liste des valeurs de Name.

Nous pouvons donc faire ceci:

$vms = Get-AzureVM

Foreach($vm in $vms)
{
    echo $vm.Status
}

Qui affiche la liste des statuts de nos VM. Nous somme maintenant armé pour comprendre le script qui suit:

$vms = Get-AzureVM

Foreach($vm in $vms)
{
 if ( $vm.Status -like « Stopped* »)
 {
    Start-AzureVM -Name $vm.InstanceName -ServiceName $vm.ServiceName
 }

  if ( $vm.Status -like « Ready* »)
 {
    Stop-AzureVM -Name $vm.InstanceName -ServiceName $vm.ServiceName – Force
 }
}

Le script en question arrête les VM en cours et démarre les autres. Notez un point, ce n’est pas parce que la commande est terminée que le serveur a fini de démarrer.

Une fois terminé il s’affiche:

2014-10-15_12-51-06

En général on préfère ne lancer qu’une des opérations à la fois évidemment. On pourrait aussi écrire de façon plus compacte les deux commandes:

Get-AzureVM | ?{$_.Status -like « Ready* »} | ForEach-Object { Stop-AzureVM -ServiceName $_.ServiceName -Name $_.Name -Force }

Get-AzureVM | ?{$_.Status -like « Stopped* »} | ForEach-Object { Start-AzureVM -ServiceName $_.ServiceName -Name $_.Name  }

 

Where et ? sont deux alias pour Where-Object.

 

Le problème est que ces opérations s’effectuent de façon synchrone ce qui peut être long. On va essayer de les exécuter en parallèle. Première approche, créer une tâche. Voici un exemple inspiré de Ref5 en bibliographie:

$vms = Get-azurevm | ?{ $_.Status -like « Stopped* »}
$jobs = @()
foreach ($vm in $vms)
{
    $params = @($vm.Name, $vm.ServiceName)
    $job = Start-Job -ScriptBlock {
        param($ComputerName, $ServiceName)
        start-Azurevm -Name $ComputerName -ServiceName $ServiceName
    } -ArgumentList $params
    $jobs = $jobs + $job
}
 
# On attend que tous les serveurs soient arrêtés
Wait-Job -Job $jobs

Note: Stop/Start ne fonctionnent pas de façon concurrentielle dans un même service cloud. Le code qui précède est donc surtout utile si on cible plusieurs services. Dans ces conditions on peut simplifier l’écriture ainsi:

Start-Job -ScriptBlock { Get-AzureVM | ?{ $_.Status -like “Stopped*” } | Start-AzureVM }

Un plan de formation

Proposé clef en main par Endjin:

https://blogs.endjin.com/2012/03/an-omega-geeks-guide-to-learning-powershell/

 

Bibliographie

  1. http://yossidahan.wordpress.com/2012/12/12/azure-subscriptions-in-powershell-demystified/
  2. http://michaelwasham.com/windows-azure-powershell-reference-guide/getting-started-with-windows-azure-powershell/
  3. http://blogs.technet.com/b/heyscriptingguy/archive/2014/03/17/using-the-windows-azure-rest-apis-with-powershell.aspx
  4. http://www.jonathanagardner.com/start-and-stop-azure-vms-with-powershell/
  5. http://gripdev.wordpress.com/2014/03/01/start-and-stop-azure-vms-and-more-in-parallel-from-powershell/
  6. http://redmondmag.com/articles/2014/08/20/powershell-and-azure-automation.aspx

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s