Créer sa VM avec PowerShell dans Azure

Il y a quelques mois j’ai publié un article pour expliquer comment monter sa VM dans Azure. La procédure alors décrite comportait un grand nombre d’étapes dont certaines peuvent prendre beaucoup de temps. C’est pourquoi je vous propose aujourd’hui de faire exactement la même chose mais en automatisant le processus pour pouvoir créer facilement sa VM avec PowerShell dans Azure. N’hésitez pas à relire l’article d’origine disponible ici.
Importer les commandes Azure
La première étape consiste à inclure les commandes Azure.
#Ajout commandes Azure Import-Module 'c:\Program Files (x86)\Microsoft SDKs\Windows Azure\PowerShell\Azure\Azure.psd1'
Auparavant il faut les installer en utilisant l’outil Web Platform Installer.
Téléchargement de l’image de la machine virtuelle
Comme précédemment, je prends comme source la dernière VM de Brian Keller disponible sur son blog. La seconde étape consiste à télécharger toutes les archives puis à les décompresser pour obtenir le vhd. Il est important de décompresser dans le même répertoire que celui qui contient les archives car c’est à cet endroit que le script cherchera le vhd.
function DownloadVMImage([string]$dest, [string]$links) { if (!(Test-Path $dest)) { Write-Host "Creation du chemin '$dest'" mkdir $dest } foreach ($line in $links.Split("`r`n")) { $url = $line.Trim(); if ($url.Length -gt 0) { $url = "$($line.Trim())" $parts = $url.Split("/") $saveTo = "$($dest + $parts[$parts.Length - 1])" if($saveTo.EndsWith("exe")) { $exetorun = $saveTo } if (!(Test-Path $saveTo)) { Write-Host "Telechargement '$url' vers '$saveTo'" Start-BitsTransfer $url $saveTo $retry = $true } else { Write-Host "Le fichier '$saveTo' existe deja." $retry = $false } } } #Decompression Write-Host "Lancement '$exetorun'" & $exetorun | Out-Host }
Téléchargement de la souscription azure
Pour fonctionner, notre script a besoin de connaitre le nom de la souscription Azure à utiliser. C’est ce que fait la fonction suivante. Elle permet de télécharger le fichier publishsettings puis de le charger. Pour cela, il faut que le fichier soit enregistré dans le répertoire contenant les archives.
function AzureSubscription([string]$dest) { $settingfile = "" while($settingfile.Length -eq 0) { foreach($file in Get-ChildItem($dest)) { if($file.Extension -eq ".publishsettings") { $settingfile = $file.Name Write-Host "Utilisation du fichier suivant '$settingfile'" } } if($settingfile.Length -eq 0) { Get-AzurePublishSettingsFile Pause } } Import-AzurePublishSettingsFile "$($dest + $settingfile)" $subscription = $settingfile.Split("-") $subscriptionname = $subscription[0] Write-Host "Utilisation de la souscription '$subscriptionname'" Set-AzureSubscription -SubscriptionName $subscriptionname return $subscriptionname }
Création du conteneur
Cette nouvelle étape consiste à créer un conteneur qui recevra le vhd :
function CreateContainer([string]$subscriptionname, [string]$prefix) { $storagename = $prefix + "storage" Write-Host "Creation d'un nouveau stockage '$storagename'" Set-AzureSubscription -SubscriptionName $subscriptionname -CurrentStorageAccountName $storagename New-AzureStorageAccount -StorageAccountName $storagename -Label $prefix -Location "West Europe" $storagekey = Get-AzureStorageKey -StorageAccountName $storagename | %{$_.Primary} $context = New-AzureStorageContext -StorageAccountName $storagename -StorageAccountKey $storagekey $storagecontainername = $prefix + "container" Write-Host "Creation d'un nouveau conteneur '$storagecontainername'" New-AzureStorageContainer -Name $storagecontainername -Context $context }
Upload du vhd
Maintenant que le conteneur est créé, il faut y stocker le vhd. Voilà donc l’objectif de la fonction suivante :
function UploadVhd([string]$dest, [string]$prefix) { Write-Host "Upload de l'image vhd" $endpoint = (Get-AzureStorageContainer).CloudBlobContainer.Uri.AbsoluteUri $endpoint = $endpoint + "/" + $prefix + ".vhd" Write-Host "Utilisation du endpoint suivant '$endpoint'" foreach($file in Get-ChildItem $dest -Recurse) { if($file.Extension -eq ".vhd") { $vhd = $file.FullName Write-Host "Utilisation du fichier suivant '$vhd'" } } Add-AzureVhd -Destination $endpoint -LocalFilePath $vhd }
Création de la machine virtuelle
A partir du vhd précédemment uploadé, nous allons créer la machine virtuelle qui l’utilisera :
function CreateVM([string]$prefix) { $endpoint = (Get-AzureStorageContainer).CloudBlobContainer.Uri.AbsoluteUri $endpoint = $endpoint + "/" + $prefix + ".vhd" $imagename = $prefix + "image" $imagelabel = $prefix + " image" Write-Host "Ajout de l'image '$imagename' depuis '$endpoint'" Add-AzureVMImage -ImageName $imagename -MediaLocation $endpoint -Label $imagelabel -OS Windows $vmname = $prefix + "VM" $vmservice = $prefix + "service01" Write-Host "Creation de la machine virtuelle '$vmname'" New-AzureQuickVM –Windows –ServiceName $vmservice –Name $vmname –ImageName $imagename -Password "p@ssw0rd" -AdminUsername "MainUser" -Location "West Europe" }
Exécution du script
Maintenant que toutes les fonctions sont définies, il reste uniquement à les appeler en leur passant les bons paramètres. Si tout se déroule correctement, la nouvelle machine virtuelle devrait être disponible. Il ne faut pas non plus oublier d’être patient car les étapes de téléchargement, de décompression et d’upload peuvent prendre beaucoup de temps.
Remarque importante : le préfixe utilisé ci-dessous pour nommer l’ensemble des éléments ne doit pas comporter de majuscule. Sinon la création de la VM échouera.
$Destination = "D:\AzureVM\TFS2013\"; $Links = " http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part01.exe http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part02.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part03.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part04.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part05.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part06.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part07.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part08.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part09.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part10.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part11.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part12.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part13.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part14.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part15.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part16.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part17.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part18.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part19.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part20.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part21.rar http://download.microsoft.com/download/B/C/8/BC8558E1-192E-4286-B3B0-320A8B7CE49D/VisualStudio2013.RTM.ALM.part22.rar "; $prefix = "tfs2013" DownloadVMImage $Destination $Links $subscriptionname = AzureSubscription $Destination CreateContainer $subscriptionname $prefix UploadVhd $Destination $prefix CreateVM $prefix