Iniciar un runbook desde otro runbook

 

Publicada: marzo de 2016

Se aplica a: Windows Azure Pack for Windows Server, System Center 2012 R2 Orchestrator

En Automatización de administración de servicios, el procedimiento recomendado es escribir runbooks modulares reutilizables con una función independiente que otros runbooks puedan utilizar. Normalmente, un runbook primario llamará a uno o varios runbooks secundarios para llevar a cabo la función requerida. Hay dos maneras de llamar a un runbook secundario, y cada una presenta diferencias que debe conocer para poder determinar cuál es la mejor para los diferentes escenarios.

  • Invocar un runbook secundario mediante ejecución insertada

  • Iniciar un runbook secundario con cmdlets

Invocar un runbook secundario mediante ejecución insertada

Para invocar un runbook insertado desde otro runbook, utilice el nombre del runbook y proporcione los valores de sus parámetros exactamente igual que haría con una actividad o un cmdlet. Todos los runbooks del mismo entorno de Automatización de administración de servicios están disponibles para que todos los demás los usen de esta manera. El runbook primario esperará a que el runbook secundario se complete antes de pasar a la siguiente línea, y la salida se devuelve directamente al primario.

Al invocar un runbook insertado, se ejecuta en el mismo trabajo que el runbook primario. En el historial de trabajos del runbook secundario no habrá ninguna indicación de que se ejecutó. Las excepciones y las salidas de los flujos del runbook secundario se asociarán con el primario. Esto permite reducir el número de trabajos y facilita el seguimiento y la solución de problemas porque las posibles excepciones producidas por el runbook secundario y las salidas de los flujos están asociadas con el trabajo del runbook primario.

Cuando se publica un runbook, los runbooks secundarios a los que llama deben tener ya una versión publicada. El motivo es que Automatización crea una asociación con los runbooks secundarios cuando un runbook se compila. Si no la tienen, parecerá que el runbook primario se publica correctamente, pero generará una excepción cuando se inicie. Si esto ocurre, puede volver a publicar el runbook primario para hacer referencia correctamente a los runbooks secundarios. No es necesario volver a publicar el runbook primario si se cambia alguno de los runbooks secundarios porque ya se habrá creado la asociación.

Los parámetros de un runbook secundario al que se llama en línea pueden ser de cualquier tipo de datos, incluidos objetos complejos, y no se produce ninguna serialización de JSON como cuando el runbook se inicia con el Portal de administración o con el cmdlet Start-SmaRunbook.

En el ejemplo siguiente se invoca un runbook secundario de prueba que acepta tres parámetros: un objeto complejo, un entero y un valor booleano. La salida del runbook secundario se asigna a una variable.

$vm = Get-VM –Name "MyVM" –ComputerName "MyServer"
$output = Test-ChildRunbook –VM $vm –RepeatCount 2 –Restart $true

Iniciar un runbook secundario con cmdlets

Puede utilizar el cmdlet Start-SMARunbook para iniciar un runbook, tal y como se describe en Para iniciar un runbook con Windows PowerShell. Cuando se inicia un runbook secundario desde un cmdlet, el runbook primario pasará a la siguiente línea en cuanto se cree el trabajo para el runbook secundario. Si necesita recuperar todas las salidas del runbook, debe acceder al trabajo mediante Get SMAJobOutput.

El trabajo de un runbook secundario iniciado con un cmdlet se ejecutará en un trabajo diferente del runbook primario. El resultado es que aumenta el número de trabajos que invocan el flujo de trabajo en línea, aumenta la carga en el servidor Worker y se dificulta el seguimiento. Sin embargo, el elemento primario puede iniciar varios runbooks secundarios sin tener que esperar a que se completen. Para ese mismo tipo de ejecución en paralelo con llamadas en línea a los runbooks secundarios, el runbook primario tendría que usar la palabra clave parallel.

Los parámetros para un runbook secundario que se inicia con un cmdlet se proporcionan como una tabla hash, tal y como se describe en Runbook Parameters. Solo se pueden usar tipos de datos simples, aunque puede proporcionar el nombre de un activo de credencial tal y como se describe en Credentiales. Si el runbook tiene un parámetro con un tipo de datos complejo, debe llamarse en línea.

En el ejemplo siguiente se inicia un runbook secundario con parámetros y se espera a que finalice. Una vez completado, el runbook primario recopila la salida del trabajo.

$webServer = 'https://MyServer'
$port = 9090
$runbookName = "Test-Runbook"
$params = @{"VMName"="MyVM";"RepeatCount"=2;"Restart"=$true} 

$job = Start-SmaRunbook –WebServiceEndpoint $webServer –Port $port –Name $runbookName –Parameters $params

$doLoop = $true
While ($doLoop) {
   $job = Get-SmaJob –WebServiceEndpoint $webServer –Port $port -Id $job.Id
   $status = $job.Status
   $doLoop = (($status -ne "Completed") -and ($status -ne "Failed") -and ($status -ne "Suspended") -and ($status -ne "Stopped") 
}

Get-SmaJobOutput –WebServiceEndpoint $webServer –Port $port -Id $job.Id –Stream Output

Comparación de métodos para llamar a un runbook secundario

En la tabla siguiente se resumen las diferencias entre los dos métodos para llamar a un runbook desde otro runbook.

En línea

Cmdlet

Trabajo

Los runbooks secundarios se ejecutan en el mismo trabajo que el primario.

Se crea un trabajo independiente para el runbook secundario.

Ejecución

El runbook primario espera a que el runbook secundario se complete antes de continuar.

El runbook primario continúa inmediatamente después de que el runbook secundario se inicie.

Salida

El runbook primario puede obtener la salida directamente del runbook secundario.

El runbook primario debe recuperar la salida del trabajo del runbook secundario.

Parámetros

Los valores de los parámetros del runbook secundario se especifican por separado y pueden utilizar cualquier tipo de datos.

Los valores de los parámetros del runbook secundario deben combinarse en una sola tabla hash y solo pueden incluir tipos de datos simples, de matriz y de objeto que utilicen la serialización de JSON.

Publicación

El runbook secundario debe publicarse antes de que se publique el runbook primario.

El runbook secundario debe publicarse antes de que se inicie el runbook primario.