When you’re working with Azure Resource Manager one of the first intent is to automate the process of creating an environment. The steps for this process can be varied, so I want to show you in this post how you can use Azure Automation as automation mechanism in this scenario. The first thing you should do is create an Azure Automation account. From the current portal you can do so in the Automation section, by clicking on the link Create an automation account.

Once created, it is necessary to add the module AzureResourceManager, which is not present today and is required to be able to work with the Azure Resource Manager. You can get this module installing Microsoft Azure PowerShell on your local machine. Access to the path C:\Program Files (x 86)\Microsoft SDKs\Azure\PowerShell\ResourceManager to locate the folder that contains the module and generate a zip with it in order to upload it through the portal.

Access your Azure Automation account, click on the ASSETS section and select the Import Module option in the menu.

The process will take a few minutes, but It will be available for all runbooks created in this account.

To finish the configuration of the new account, it is necessary to create an Azure Active Directory user and add it as co-administrator of your subscription, in the same way that I explained in this article. Once you have it you must add it through ADD SETTING > ADD CREDENTIAL. The credential type is Windows PowerShell Credential which ask for a name for the credential and a description. In my case, I use the same name as the user to be clear who is such a credential.

Finally, you must indicate the user name and the same password to save the credential as an asset of Azure Automation.

Now that you have the account you only need to create a runbook with your workflow to create the environment. To do this you have add it by clicking in NEW > APP SERVICES > AUTOMATION > RUNBOOK > QUICK CREATE.

The script that comes with the ARM projects doesn’t work directly. Thanks to my colleague João Soares, we have built a workflow that I’ve been using to perform this task:
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" }
Once published and released the runbook your environment is ready to be used:

Remember that the runbooks can be programmed through the SCHEDULE tab.
Cheers!