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.

installwindowsazurepowershell.png

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