
31 Mag 2016 [cross-post]: Provisioning di una VM ARM via PowerShell
Sul blog del team di MSDN Italia all’indirizzo
https://blogs.msdn.microsoft.com/italy/2016/05/17/provisioning-di-una-vm-arm-via-powershell
è stato pubblicato un mio Guest Post, che riporto nella sua interezza.
Il contenuto è estremamente tecnico, ma assieme agli aspetti di marketing, questo è sostanzialmente il nostro lavoro, cioè produrre software di qualità, ed è indispensabile utilizzare piattaforme di qualità come Microsoft Azure.
Qui descriviamo un caso reale di come realizziamo una virtual machine per fare dei test o per avere un ambiente di sviluppo pronto all’uso.
Capita molto spesso di avere il bisogno di creare velocemente delle VM su Azure per effettuare dei test o comunque per necessità impellenti. Il Portale Azure è molto intuitivo e immediato nell’adempiere questa funzionalità, ma vediamo come creare un VM via PowerShell con la stessa rapidità.
Prima di tutto è necessario avere installato Azure Powershell, se non lo abbiamo già possiamo consultare questa ottima guida. La versione minima per eseguire questi script è la 1.0.0.
Se abbiamo già installato Azure Powershell, apriamolo e lanciamo questo semplice comando per conoscere la versione presente.
Get-Module AzureRM | format-table version
Iniziamo quindi con il primo fondamentale passaggio: stabiliamo una connessione con Azure eseguendo
Login-AzureRmAccount
Ci verrà mostrata la finestra di login dove è necessario inserire le nostre credenziali per accedere ad Azure. Il risultato sarà qualcosa di simile
Se il nostro account Azure ha associato più Sottoscrizioni è necessario impostare quella dove vogliamo creare la nostra VM.
Possiamo usare PowerShell per elencare le Sottoscrizioni e recuperarne id e nome con il comando
Get-AzureRmSubscription | sort SubscriptionName | Select SubscriptionId, SubscriptionName
Copiamo il SubscriptionId della sottoscrizione da selezionare ed eseguiamo
Select-AzureRmSubscription -SubscriptionId 'id sottoscrizione fra virgolette'
Oppure se preferiamo copiare il SubscriptionName eseguiamo
Select-AzureRmSubscription -SubscriptionName 'nome sottoscrizione fra virgolette'
Ora creiamo alcune variabili che ci torneranno utili negli comandi successivi
# Impostiamo il DataCenter dove vogliamo creare la mia VM. # Un elenco completo con il comando: Get-AzureLocation | sort Name | Select Name $location = 'West Europe' # Il nome dello storage account dove depositare la VM. # Può avere solo lettere minuscole e numeri e da 3 a 24 caratteri # e deve essere univoco in tutto Azure. # Per testare se il nome dello storage account è già presente, # usiamo il comando: Test-AzureName -Storage $storageAccount # Se il comando di test ritorna False, il nome dello storage non è usato e può essere scelto $storageAccount = 'vmstoragemydev01' # Il contenitore dello storage dove fisicamente saranno salvati i dati della VM $defaultContainer = 'vhds' # La dimensione dell'istanza della VM. # Un elenco completo con il comando Get-AzureLocation | Where {$_.Name -eq $location} # e vedendo le istanze disponibili presenti alla voce VirtualMachineRoleSizes # oppuere andando a questo link $instanceSize = 'Standard_D1_v2' # Il nome che desideriamo dare alla VM $vmName = 'my-dev01' # Il nome utente dell'account locale della VM $adminLogin = 'myadmin' # La password dell'utende dell'account locale della VM $adminPassword = 'MyP@ssw0rd$' # Il nome del Virtual Network dove si appoggerà la VM $vnetName = 'MyNetwork' # Il nome della subnet del Virtual Network $vnetSubnet = 'clients' # Il nome del Gruppo di Risorse / Resource Group $resourceGroupName = "MyVmClients" # Il nome del disco che conterrà il sistema operativo della VM $diskname = "MY_DEV01_OSDisk" # Il nome dell’etichetta del dominio che assumerà la VM dall'esterno $domainNameLabel = 'my-dev01'
Creiamo adesso il Resource Group
New-AzureRmResourceGroup -Name $resourceGroupName -Location $location
E a ruota creiamo lo storage, in questo caso ridondato localmente (Standard_LRS).
New-AzureRmStorageAccount -StorageAccountName $storageAccount -Location $location -Type Standard_LRS -ResourceGroupName $resourceGroupName
Assicuriamoci ora di creare una Subnet e un Virtual Network.
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name $vnetSubnet -AddressPrefix '192.168.1.0/24' $vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName -Location $location -AddressPrefix '192.168.1.0/24' -Subnet $subnet
Una volta create la vnet, riprendiamo il valori della subnet che in fase di creazione sono stati correlati con un ID che ci servirà più avanti.
$subnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name $vnetSubnet
Creiamo ora un Public IP Address (PIP) e una Network Interface (NIC).
$pip = New-AzureRmPublicIpAddress -Name "${vmName}_ip" -ResourceGroupName $resourceGroupName -DomainNameLabel $domainNameLabel -Location $location -AllocationMethod Dynamic
$nic = New-AzureRmNetworkInterface -Name "${vmName}_nic1" -SubnetId $subnet.Id -Location $location -ResourceGroupName $resourceGroupName -PublicIpAddressId $pip.Id
Prepariamo poi le credenziali per l’utente amministratore della VM
$vmCreds = New-Object System.Management.Automation.PSCredential($adminLogin, ($adminPassword | ConvertTo-SecureString -AsPlainText -Force))
Scegliamo l’immagine della VM che vogliamo creare. Se la Subscription è collegata ai benefici MSDN, è possibile testare anche alcuni tipi di VM altrimenti non presenti, come immagini con Windows 10. Possiamo risalire prima all’elenco dei publisher con il comando
Get-AzureRmVMImagePublisher -Location $location | Sort PublisherName | Select PublisherName
Scegliamo per esempio “MicrosoftVisualStudio“, provider Microsoft per immagini di VM con installazioni di Visual Studio già comprese.
Vediamo quindi le offerte di questo provider.
Get-AzureRmVMImageOffer -Location $location -PublisherName "MicrosoftVisualStudio" | Sort Offer | Select Offer
Anche qui scegliamo “VisualStudio” e vediamo gli Sku relativi.
Get-AzureRmVMImageSku -Location $location -PublisherName "MicrosoftVisualStudio" -Offer "VisualStudio" | Sort Skus | Select Skus
Di tutta la lista, proviamo a scegliere “”VS-2015-Comm-VSU2-AzureSDK-29-WS2012R2“ ovvero un Windows Server 2012 R2 con Visual Studio 2015 Update 2 e Azure SDK 2.9.
Preleviamo quindi l’immagine stando attenti a selezionare l’ultima versione disponibile nel caso ne fossero pubblicate più di una.
$vmImage = Get-AzureRmVMImage -Location $location -PublisherName "MicrosoftVisualStudio" -Offer "VisualStudio" -Skus "VS-2015-Comm-VSU2-AzureSDK-29-WS2012R2" | Sort-Object -Descending -Property Version | Select-Object -First(1)
E’ giunto adesso il momento di iniziare a comporre i pezzi e a completare la configurazione per la nostra VM.
Prepariamo prima la configurazione di base.
$vmconfig = New-AzureRmVMConfig -VMName $vmName -VMSize $instanceSize
Aggiungiamo poi le configurazioni per il Sistema Operativo, che sarà di tipo Windows.
Set-AzureRmVMOperatingSystem -Windows -VM $vmconfig -ProvisionVMAgent -EnableAutoUpdate -Credential $vmCreds -ComputerName $vmname
Inseriamo i riferimenti all’immagine della VM che abbiamo scelto in precedenza
Set-AzureRmVMSourceImage -VM $vmconfig -PublisherName $vmImage.PublisherName -Offer $vmImage.Offer -Skus $vmImage.Skus -Version $vmImage.Version
Ed il network precedentemente creato
Add-AzureRmVMNetworkInterface -VM $vmconfig -Id $nic.Id
Dallo Storage calcoliamo il percorso che avrà il file VHD (Virtual Hard Disk) che conterrà il disco del Sistema Operativo e inseriamolo nella configurazione.
$storacct = Get-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccount $vhduri = $storacct.PrimaryEndpoints.Blob.OriginalString + "vhds/${diskname}.vhd" Set-AzureRmVMOSDisk -VM $vmconfig -Name $diskname -VhdUri $vhduri -Caching ReadWrite -CreateOption fromImage
Se proviamo a stampare la variabile $vmconfig vediamo che abbiamo costruito un file JSON con tutte le caratteristiche proprie della VM che andremo a creare.
Ed ecco il comando che effettuerà il provisioning della VM.
New-AzureRMVM -ResourceGroupName $resourceGroupName -Location $location -VM $vmconfig
Una volta terminato il Provisioning, possiamo vedere lo stato della VM eseguendo
Get-AzureRmVm -Name $vmName -ResourceGroupName $resourceGroupName
Questa è una panaromica sul portale di quanto è stato creato da PowerShell
Se il Network fosse connesso tramite VPN S2S al network On-Premise o comunque se il Domain Controller fosse raggiungubile dalla VM, dopo la creazione potremo aggiungere un breve comando che effettua la Join a Dominio della VM.
$DomainName = "DOMINIO.LAN" $DomainJoinAdminName = "DOMINIO.LAN\utente" $DomainJoinPassword = "Password"
Set-AzureRMVMExtension -VMName $VMName –ResourceGroupName $ResourceGroupName -Name "JoinAD" -ExtensionType "JsonADDomainExtension" -Publisher "Microsoft.Compute" -TypeHandlerVersion "1.0" -Location $location -Settings @{ "Name" = $DomainName; "OUPath" = ""; "User" = $DomainJoinAdminName; "Restart" = "true"; "Options" = 3} -ProtectedSettings @{"Password" = $DomainJoinPassword}
Buon divertimento quindi con PowerShell e le VM ARM!
Un grazie a Erica Barone e a Jessica Tibaldi, ambedue Technical Evangelist in Microsoft, per l’opportunità.
No Comments