Il mio Blog

Da qualche mese nell’azienda per quale lavoro, ovvero Vivido, abbiamo migrato tutti gli ambienti di sviluppo su Microsoft Azure.

L’Hybrid Cloud conta attualmente circa 30 VM con ambienti di sviluppo (SO Windows 8.1 o 10, Visual Studio 2015 o Eclipse a seconda dei linguaggi di sviluppo) e sono assegnate ai singoli dipendenti.

L’operatività iniziale è quella che, non appena arrivato in ufficio, ogni sviluppatore acceda al portale Portale Azure con le proprie credenziali, si avvii la VM che più gli interessa (un dev può avere anche una VM per ambiente di sviluppo) e si colleghi una volta avviato via RDP. Una volta terminato il lavoro la vm deve essere spenta e deallocata: visto che il cloud ha un costo in base alle ore di effettivo utilizzo delle componenti, se la VM viene spenta non ci sono costi (fatta eccezione per lo storage che la VM occupa).

Facendo un rapido calcolo, prendendo dal calcolatore prezzi di Microsoft Azure il costo di una VM A3 (Area Europa Occidentale, Tipo Windows, Piano Standard) per un mese è di circa 226€*.

Calculator1

Notate che le ore sono 744, ovvero 31 giorni pieni.

E’ qui che il cloud e il modello di Microsoft Azure ci vengono in aiuto: una VM di uno sviluppatore serve soltanto nelle giornate di lavoro (5 giorni su 7) e durante l’orario di lavoro (8 ore è l’orario standard, mettiamo anche un’ora di pausa pranzo e arrotondiamo per eccesso a 10 ore al giorno lavorativo).

Ne segue che un VM verrà utilizzata ‘solo’ 210h se il mese è di 21 giorni lavorativi. Una VM A3 (con 4 core, 7Gb di ram e 285Gb di disco HDD) ci viene a costare 64€/mese*!

Calculator2

E’ possibile che un dev si dimentichi la VM accesa e i costi mensili quindi possono quindi lievitare. Come fare allora a controllare automaticamente che le VM non consumino denaro se non utilizzate?

In questo ci viene incontro Azure Automation con degli strumenti che ci permettono di automatizzare operazioni manuali, operazioni di lunga durata o ripetitive, come può essere nel nostro caso accendere e spengere una VM.

E’ necessario come prima cosa creare un Account di Automazione (Automation Account) e quindi dobbiamo connetterci al Portale Azure e cliccare sul tasto + Nuovo, selezionare Gestione dal menù Crea e scegliere Automation Account.

AutomationAccount

Immettiamo quindi i dati dando un nome al nostro Automation Account, scegliamo/creiamo il Resource Group (o Gruppo di risorse), la sottoscrizione e l’area. Possiamo scegliere anche di creare dei dati di test per prendere mano con i servizi di automazione.

AutomationAccount2

Una volta creato vi troverete difronte ad una finestra simile a questa sotto

Automation3

Runbook sono una serie di task (o attività) che eseguono operazioni automatizzate.

Prima di creare un Runbook ho prima bisogno di definire alcuni Assets che sono suddivisi in Pianificazioni, Moduli, Certificati, Variabili e Credenziali

Automation4

Vedrete presenti già dei moduli che permetteranno di eseguire gli script PowerShell propri dei task dei Runbook. In questo caso a noi serve il modulo Azure che è già presente.

Come prima cosa devo connettermi all’account e alla subscription (o alle subscription) per accedere all’elenco delle VM che voglio spengere. Nel mio caso ho optato per l’utilizzo di un certificato che deve essere caricato nell’Asset Certificati e caricato anche attraverso il portale ‘classico’ in Settings -> Certificati di gestione.

Automation5

Fatto questo, visto che vorrò spengere tutte le VM di sviluppo che ho creato sotto una unica subscription, creo 3 Variabili dentro Asset: CertificateName (che conterrà il nome del certificato che ho caricato in precedenza) SubscriptionID (che conterrà il codice o GUID della sottoscrizione) e SubscriptionName (che conterrà il nome della sottoscrizione). Ad ognuna assegno i valori esatti.

Automation6

E’ ora di creare il nostro RunBook.

Automation7

Come noterete è richiesto il tipo di Runbook fra “Powershell“, “Flusso di lavoro Powershell” e “Grafico“. Noi scegliamo il primo, ovvero “Powershell”. Come nome scegliamo “Spengimento-VM” o un nome similare.

Verrete subito rimandati alla pagina di modifica del RunBook che non è altro che un editor di testo dove poter immettere i nostri comandi PowerShell.

A sinistra avete una area dove poter sfogliare i CMTLET (CommandLets), i Runbooks e gli Assets, così da reperire le informazioni rapidamente.

Automation8

Incolliamo poi questo script:

<#
.NOTES
	Author: Riccardo Cappello
	Last Update: 24/08/2015
	Description: Workflow per spegnere tutte le vm nella subscription di sviluppo
#>

workflow Spengi-VM
{
	param(   )	#Niente parametri in input
	
    $subscriptionID = Get-AutomationVariable -Name 'SubscriptionID'
	Write-Output "SubscriptionID :  $subscriptionID " 
    $certificateName = Get-AutomationVariable -Name 'CertificateName'
	Write-Output "CertificateName :  $certificateName " 
    $certificate = Get-AutomationCertificate -Name $certificateName  
	Write-Output "Certificate :  $certificate "
	$subscriptionName = Get-AutomationVariable -Name 'SubscriptionName' 

	Set-AzureSubscription $subscriptionName -SubscriptionId $subscriptionID -Certificate $certificate 
    
	Select-AzureSubscription -SubscriptionId $subscriptionID
	
	$VMs = Get-AzureVM 
    foreach($VM in $VMs)
    {
        $vmName = $VM.Name 
		$vmServiceName = $VM.ServiceName
	    
	    if ( ($VM.InstanceStatus -eq 'ReadyRole') -Or ($VM.InstanceStatus -eq 'StoppedVM') ) # #Se la VM è accesa oppure se la VM è spenta ma non deallocata (quindi continuo a pagarla) 
	    {
	        Write-Output "Shutting down VM :  $vmName "
			try{
	        	Stop-AzureVM -Name $vmName -ServiceName $vmServiceName -Force #Stoppo la VM e la dealloco
			}
			catch
			{
				$ErrorMessage = $_.Exception.Message
    			$FailedItem = $_.Exception.ItemName
			
				Write-Output " $vmName : We failed to shutdown $FailedItem. The error message was $ErrorMessage"
			}
	    }
    } 
}

Dalla riga 12 alla riga 18 prendo i valori delle variabili e il certificato di connessione precedentemente inseriti.

Dalla riga 20 alla riga 22 seleziono e mi connetto alla Subscription per la quale voglio controllare le VM.

Dalla riga 25 in poi c’è la logica di spengimento: Per tutte le VM presenti nella subscription (riga 25) controllo la VM sia accesa e pronta (riga 30) o stoppata ma non deallocata (ovvero che comunque continuo a pagare).

Se lo è, alla riga 34 lancio un comando di Stop-AzureVM per spengere e deallocare la VM.

Ho inserito anche un controllo nel caso l’operazione non vada a buon fine.

Posso adesso cliccare su “Riquadro di test” e avviare un test dello script finchè non sono soddisfatto del risultato.

Se ne sono soddisfatto, posso pubblicare il RunBook e Schedularne l’esecuzione. Clicco quindi su “Pubblica” e poi su “Pianifica” dove schedulo giornalmente, alle 19:00 ad esempio, orario in cui i dev sono già usciti, l’attività.

Automation9

Da quel momento in poi posso dormire tranquillo non pensando che qualcuno abbia lasciato accesa la VM aumentando così i costi di Cloud 🙂

Azure Automation è gratuito per 500 minuti al mese di RunBook eseguiti, lo script sopra prenderà qualche secondo al giorno quindi dovremmo riuscire tranquillamente a non spendere ulteriore denaro per l’operazione. Nel caso mettessimo sù molte operazioni di automazione, il costo è comunque limitato a 0,0017€ / minuto!

 

 

*ci sono da condiderare anche i costi di traffico dati, comunque il calcolo è puramente per evidenziare il ‘pagare e non utilizzare sempre’ e il ‘pagare solo quanto utilizzato’.

Comments ( 1 )