Recently, I learned something new about Azure Automation–that you could execute tasks inside of a VM. I haven’t dealt with this situation before–typically, any tasks I want to execute inside of a VM, I execute using a scheduler like SQL Agent, or the Windows scheduler. However, in this situation, we were trying to reduce costs, and this VM is just used for ETL processing (the database in Azure SQL DB), but we still needed to take backups of the Master Data Services database.
My first thought around this was to have an SQL Server Agent job that either executed on startup, or once a day, however this was messy, and could potentially lead to having several sets of unnecessary backups a day. I knew I could create an Azure Automation job that would check the status of the VM, and start it if it was stopped. What I needed to figure out from there was:
- How to get a command to execute inside of the VM
- To shutdown the VM if it had not been running previously
Enter Azure Hybrid Runbooks
While this image shows a potential on-premises > Azure use case, in my case I was simply using this to connect to a VM within Azure. You will have to run some PowerShell to enable this on your machine, but after that step is completed, you can simply call Azure Automation cmdlets with the “-runon” option, which specifies the name of the hybrid worker group you created.
The other trick to this, was calling a runbook from a runbook, which wasn’t well documented.
# Ensures you do not inherit an AzureRMContext in your runbook Disable-AzureRmContextAutosave –Scope Process if ($vm -ne 'PowerState/running') {start-azurermvm -ResourceGroupName $RGName -Name $vmName; start-sleep -Seconds 35; start-azureRMautomationrunbook -AutomationAccount 'Automation' -Name 'BackupDB' -ResourceGroupName $rgName -AzureRMContext $AzureContext -Runon 'Backups' -Wait; stop-azurermvm -Name $VMname -ResourceGroupName $RgName -force} else {start-azureRMautomationrunbook -AutomationAccount 'Automation' -Name 'BackupDB'` -ResourceGroupName $rgName -AzureRMContext $AzureContext -RunOn 'Backups' -Wait}
In order to execute this inner runbook, you simply use the Start-AzureRMAutomationRunbook and since it’s hybrid, we use the aforementioned -runon option. My BackupDB runbook simply uses the DBATools
backup-dbadatabase cmdlet, to perform a full backup.
It’s quick and easy to get this up and running in your automation account–the hardest part is getting all of the modules you need into your automation account.