Azure Resource Manager automatizado con Azure Automation

Cuando trabajamos con Azure Resource Manager una de la primeras intenciones es automatizar el proceso de creación de un entorno. La forma de lanzar este proceso puede ser variada, por eso quiero mostrarte en este post cómo podrías utilizar Azure Automation como mecanismo de automatización en este escenario.

Lo primero que debes hacer es crear una cuenta de Azure Automation. Desde el portal actual puedes hacerlo desde la sección Automation, pulsando sobre el enlace Create an automation account.

Create an automation account
Create an automation account

Una vez creada, es necesario añadir el módulo AzureResourceManager, el cual no está presente a día de hoy y es necesario para poder trabajar con los Azure Resource Manager. Este módulo se consigue teniendo instalado Microsoft Azure PowerShell en nuestra máquina local. Accede a la ruta C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ResourceManager para localizar la carpeta que contiene dicho módulo y genera un zip con la misma para subirla a través del portal.

Azure Resource Manager module for Azure Automation
Azure Resource Manager module for Azure Automation

Accede a tu cuenta de Azure Automation, haz clic sobre el apartado ASSETS y selecciona la opción Import Module en el menú inferior.

Import integration module
Import integration module – AzureResourceManager

El proceso tardará unos minutos, pero a partir de ese momento estará disponible para todos los runbooks creados en esta cuenta.

Extracting activities from the integration module. Module - AzureResourceManager
Extracting activities from the integration module. Module – AzureResourceManager

Para finalizar la configuración de la nueva cuenta, es necesario crear un usuario de Azure Active Directory y agregarlo como co-administrador de tu suscripción, de la misma forma que expliqué en este artículo. Una vez que lo tengas debes añadirlo a través de ADD SETTING > ADD CREDENTIAL. El tipo de credencial es Windows PowerShell Credential donde te pedirá un nombre para la credencial y una descripción. En mi caso utilizo el mismo nombre que el usuario para tener claro a quién corresponde dicha credencial.

Azure Automation - Add Settings - Add Credential
Azure Automation – Add Settings – Add Credential

Por último deberás indicar el nombre de usuario y la contraseña del mismo para guardar la credencial como asset de Azure Automation.

Azure Automation - Add Credential - Define Credential
Azure Automation – Add Credential – Define Credential

Ahora que ya tienes la cuenta sólo te falta crear un runbook con tu workflow para crear el entorno. Para ello, desde el menú inferior, puedes añadirlo haciendo clic en NEW > APP SERVICES > AUTOMATION > RUNBOOK > QUICK CREATE.

Azure Automation - Create runbook . buildenv
Azure Automation – Create runbook . buildenv

El script que acompaña a los proyectos de ARM no funciona directamente. Gracias a mi compañero Joao Soares, hemos construido un workflow que he estado utilizando para llevar a cabo esta tarea:

workflow buildenv
{
    #1. Subscription Name and Credential
    $SubscriptionName = "Windows Azure MSDN - Visual Studio Ultimate"
    $Cred = Get-AutomationPSCredential -Name "gisautomation@giselatboutlook.onmicrosoft.com"
    
    #2. Add Azure Account
    Add-AzureAccount -Credential $Cred
    
    #3. Select Subscription Account
    Select-AzureSubscription -SubscriptionName $SubscriptionName
    
    #4. Resource Name, Location and ARM files
    $ResourceGroupName = "MyNewEnvironment"
    $ResourceGroupLocation = "West Europe"
	
    #4.1 ARM files and Azure Storage account
    $TemplateFile = "WebSite.json"   
    $TemplateParametersFile = "WebSite.param.dev.json"
    $Container = "templates"
    $StorageAccount = "resourcemanagerstore"
    
    #5. Download the Json File and convert it to an Hashtable
    $HashTable = @{}
	$HashTable = InlineScript {
		
		$StorageKey = (Get-AzureStorageKey -StorageAccountName $using:StorageAccount).Primary
		$StorageContext = New-AzureStorageContext $using:StorageAccount $using:StorageKey
		
		$TemplateFile = New-AzureStorageBlobSASToken -Blob $using:TemplateFile -Container $using:Container -Context $using:StorageContext -FullUri -Permission r
		$TemplateParametersFile = New-AzureStorageBlobSASToken -Blob $using:TemplateParametersFile -Container $using:Container -Context $using:StorageContext -FullUri -Permission r
		
		$JSONFile =Invoke-RestMethod -Method Get -Uri $TemplateParametersFile
		$HashTable = @{}
		$JSONFile.parameters | get-member -MemberType NoteProperty | Where-Object{ -not [string]::IsNullOrEmpty($JSONFile.parameters."$($_.name)")} | ForEach-Object {$HashTable.add($_.name,$JSONFile.parameters."$($_.name)".value)}
		$HashTable
	 
        #6. Call New-AzureResourceGroup and pass the hashtable as TemplateParameterObject
        New-AzureResourceGroup -Name $using:ResourceGroupName -Location $using:ResourceGroupLocation  -TemplateParameterObject $HashTable -TemplateFile $TemplateFile  -Verbose -Force 
    }
       
    Write-Output "Done"
}

Una vez publicado y lanzado el runbook tu entorno estará listo para ser utilizado:

MyNewEnvironment - ARM and Azure Automation

Recuerda que los runbooks pueden ser programados a través de la pestaña SCHEDULE.

¡Saludos!