Partilhar via


Iniciar um Runbook a partir de Outro Runbook

 

Aplica-se a: Windows Azure Pack for Windows Server, System Center 2012 R2 Orchestrator

No Service Management Automation, a melhor prática é escrever runbooks modulares e reutilizáveis com uma função discreta que possa ser utilizada por outros runbooks. Um runbook principal chamará, frequentemente, um ou mais runbooks subordinados para executar a funcionalidade necessária. Existem duas formas de chamar runbooks subordinados e cada uma delas apresenta diferenças distintas que deverá compreender para poder determinar qual é a mais adequada aos seus diferentes cenários.

  • Invocar um Runbook Subordinado com a Execução Inline

  • Iniciar um Runbook Subordinado com um Cmdlet

Invocar um Runbook Subordinado com a Execução Inline

Para invocar um runbook inline a partir de outro runbook, deve utilizar o nome do runbook e indicar os valores dos respetivos parâmetros, exatamente da mesma forma que utilizaria uma atividade ou um cmdlet. Todos os runbooks que se encontrem no mesmo ambiente do Service Management Automation estão disponíveis para que todos os outros sejam utilizados da mesma forma. O runbook principal aguarda que o runbook subordinado seja concluído antes de se mover para a linha seguinte e qualquer resultado é devolvido diretamente ao principal.

Quando invoca um runbook inline, este é executado na mesma tarefa que o runbook principal. Não haverá qualquer indicação no histórico de tarefas do runbook subordinado que a executou. Quaisquer exceções e qualquer saída de fluxo a partir do runbook subordinado serão associadas ao principal. Isto origina menos tarefas e facilita o controlo e a resolução de problemas nas mesmas, uma vez que eventuais exceções geradas pelo runbook subordinado e por quaisquer das suas saídas de fluxo são associadas à tarefa do runbook principal.

Quando um runbook é publicado, todos os runbooks subordinados que aquele invoque têm de já ter uma versão publicada. Isto deve-se ao facto de o Automation criar uma associação a todos os runbooks subordinados quando um runbook é compilado. Se não for esse o caso, o runbook principal vai parecer ter sido publicado corretamente, mas gerará uma exceção quando for iniciado. Se isto acontecer, pode voltar a publicar o runbook principal de modo a referenciar adequadamente os runbooks subordinados. Não tem de voltar a publicar o runbook principal se qualquer um dos runbooks subordinados forem alterados, porque a associação já terá sido criada.

Os parâmetros de um runbook subordinado invocado inline podem ser de qualquer tipo de dados, incluindo objetos complexos, e não ocorre serialização JSON, como acontece quando inicia o runbook através do Portal de Gestão ou com o cmdlet Start-SmaRunbook.

O exemplo seguinte invoca um runbook subordinado de teste que aceita três parâmetros - um objeto complexo, um número inteiro e um booleano. O resultado do runbook subordinado é atribuído a uma variável.

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

Iniciar um Runbook Subordinado com um Cmdlet

Pode utilizar o cmdlet Start-SMARunbook para iniciar um runbook, conforme descrito em To start a runbook with Windows PowerShell. Quando inicia um runbook subordinado a partir de um cmdlet, o runbook principal move-se para a linha seguinte assim que a tarefa do runbook subordinado for criada. Se precisar de obter resultados do runbook, tem de utilizar Get-SMAJobOutput para aceder à tarefa.

A tarefa de um runbook subordinado iniciada com um cmdlet é executada à parte da tarefa do runbook principal. Este processo origina mais tarefas do que invocar o fluxo de trabalho inline, aumentando a sobrecarga sobre o servidor worker e tornando-as mais difíceis de controlar. No entanto, o principal pode iniciar vários runbooks subordinados sem esperar que cada um deles seja concluído. Para esse mesmo tipo de execução paralela de invocar os runbooks subordinados inline, o runbook principal teria de utilizar a palavra-chave paralela.

Os parâmetros para um runbook subordinado iniciado com um cmdlet são fornecidos sob a forma de uma tabela hash, conforme descrito em Runbook Parameters. Apenas os tipos de dados simples podem ser utilizados, embora possa indicar o nome de um recurso de credencial, conforme descrito em Credenciais. Se o runbook tiver um parâmetro com um tipo de dados complexo, tem de ser chamado inline.

O exemplo seguinte inicia um runbook subordinado com parâmetros e, depois, aguarda que este seja concluído. Depois de concluído, o respetivo resultado é recolhido da tarefa pelo runbook principal.

$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

Comparação de Métodos para Chamar um Runbook Subordinado

A tabela seguinte resume as diferenças entre os dois métodos para chamar um runbook a partir de outro runbook.

Inline

Cmdlet

Tarefa

O runbook subordinado é executado na mesma tarefa que o principal.

É criada uma tarefa separada para o runbook subordinado.

Execução

O runbook principal aguarda que o runbook subordinado seja concluído antes de continuar.

O runbook principal continua imediatamente após o início do runbook subordinado.

Resultado

O runbook principal pode obter resultados diretamente do runbook subordinado.

O runbook principal tem de obter o resultado da tarefa do runbook subordinado.

Parâmetros

Os valores para o runbook subordinado são especificados em separado e podem utilizar quaisquer tipos de dados.

Os valores dos parâmetros do runbook subordinado têm de ser combinados numa única tabela hash e só podem incluir tipos de dados simples, de matriz e de objeto que tirem partido da serialização JSON.

Publicação

O runbook subordinado tem de ser publicado antes da publicação do runbook principal.

O runbook subordinado tem de ser publicado em qualquer altura antes de o runbook principal ser iniciado.