Refactorizando y reutilizando runbooks en Azure Automation

Siempre que puedas, refactoriza y reutiliza tu código. No importa si estamos hablando de un lenguaje de programación o de scripting, creeme que hará tu día a día más fácil. Es por eso que hoy me gustaría hablarte de cómo reutilizar tus runbooks desde otros, con el objetivo de que todas aquellas acciones que sean repetibles puedas centralizarlas y mantenerlas de una forma más cómoda.

A día de hoy existen tres tipos de runbooks diferentes:

En este post te voy a mostrar las diferentes formas que tenemos para llamar a runbooks del mismo tipo e incluso de diferente tipo con el fin de reutilizarlos. Lo primero que debes saber es que no es posible llamar runbooks de diferente tipo dentro de un mismo job, a excepción del tipo graphical que si puede llamar a los de tipo workflow, ya que se basan en lo mismo. Por ello, vamos a ver cómo sería la llamada en cada uno de los supuestos.

Lo más importante de todo es que tengas en cuenta que para llamar a un runbook dentro de otro este primero necesita ser publicado (si está en draft no funcionará). Para este ejemplo he creado unos scripts muy simples que te ayudarán a entender la forma de invocarlos. Empecemos con el tipo PowerShell Workflow:

workflow child-ps-workflow
{
param(
[parameter(Mandatory)]
[string] $Dad
)
Write-Output "Hello from child-ps-workflow (called from $Dad)";
}

Como puedes ver, el script hijo sólo muestra por consola un saludo y el nombre del padre. Para llamarlo desde otro runbook de tipo PowerShell Workflow basta con utilizar su nombre seguido de los parámetros que necesita:

workflow parent-ps-workflow
{
child-ps-workflow -Dad "parent-ps-workflow";

#This won't work
#.\child-powershell.ps1
}
Azure Automation - Child ps workflow
Azure Automation – Child ps workflow

En el caso del tipo PowerShell script, difiere algo del anterior

param(
[string] $Dad
)

Write-Output "Hello from child-powershell (called from $Dad)";

El script está adaptado a este tipo, pero además el padre debe llamarle de forma diferente:

.\child-powershell.ps1 -Dad "parent-powershell";

#This won't work
#child-ps-workflow

Por último, en el modo graphical, como ya te comenté al inicio de este post, es posible invocar a uno de su mismo tipo o hacer uso de uno de tipo PowerShell Workflow.

Azure Automation - Child graphical
Azure Automation – Child graphical

El padre lo llamaría añadiendolo al canvas, a través del menú de la izquierda:

Azure Automation - Parent graphical
Azure Automation – Parent graphical

Como ves, es muy sencillo invocar runbooks del mismo tipo dentro de la misma cuenta de Azure Automation. Sin embargo es importante que sepas que también es posible combinar diferentes tipos de runbooks, e incluso llamar a otros que estén en otra cuenta o subscripción. Para ello, es necesario hacer uso de Start-AzureRmAutomationRunbook/Start-AzureAutomationRunbook el cual nos permite romper dichas barreras.

#The name of the Automation Credential Asset this runbook will use to authenticate to Azure.
$CredentialAssetName = "DefaultAzureCredential";

#Get the credential with the above name from the Automation Asset store
$Cred = Get-AutomationPSCredential -Name $CredentialAssetName;
if(!$Cred) {
    Throw "Could not find an Automation Credential Asset named '${CredentialAssetName}'. Make sure you have created one in this Automation Account."
}

#Connect to your Azure Account
Write-Output "Logging....";
Add-AzureRmAccount -Credential $Cred;

#Invoke a powershell ARM Automation Account
Write-Output "Launching the child...";
$params = @{"Dad"="parent-ps-workflow"}; 
Start-AzureRMAutomationRunbook –AutomationAccountName "returngis-automation" –Name "child-powershell" -ResourceGroupName "DSC" -Parameters $params;

Si lanzas dicho comando con el runbook seleccionado, comprobarás que esta vez el padre no espera por él, ya que se lanzan en un job diferente del que a priori no tenemos visibilidad.

Azure Automation - Test - Start-AzureRmAutomationRunbook

Si necesitaramos conocer el estado del runbook que hemos lanzando en un job diferente, podemos seguir una implementación similar a la que se muestra en este otro en la galería.
Para que este comando funcione, asegurate que tienes la última versión del módulo Azure, para el modo ASM, y AzureRM.profile y AzureRM.Automation si creaste la cuenta desde el nuevo portal, accediendo a Assets > Modules e importándolos desde la galería, en el caso de que estos módulos estuvieran desactualizados.

Azure Automation - Assets - Modules
Azure Automation – Assets – Modules

¡Saludos!