Partilhar via


Runbooks subordinados no Service Management Automation

Importante

Esta versão do Service Management Automation (SMA) chegou ao fim do suporte. Recomendamos que atualize para o SMA 2022.

É uma melhor prática no Service Management Automation (SMA) escrever runbooks modulares reutilizáveis com uma função discreta que pode ser utilizada por outros runbooks. Um runbook principal irá muitas vezes chamar um ou mais runbooks subordinados para executar a funcionalidade necessária. Existem duas formas de chamar um runbook subordinado e cada um tem diferenças distintas que deve compreender para que possa determinar qual será o melhor para os seus diferentes cenários.

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 no mesmo ambiente SMA estão disponíveis para todos os outros para serem utilizados desta 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 resulta em menos trabalhos e torna-os mais fáceis de controlar e resolver problemas, uma vez que quaisquer exceções emitidas pelo runbook subordinado e quaisquer saídas de fluxo associadas à tarefa de 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 a Automatização criar uma associação com runbooks subordinados quando um runbook é compilado. Se não estiverem, o runbook principal parecerá publicar 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 precisa de voltar a publicar o runbook principal se algum dos runbooks subordinados for alterado porque a associação já terá sido criada.

Os parâmetros de um runbook subordinado chamado inline podem ser qualquer tipo de dados, incluindo objetos complexos, e não existe serialização JSON , uma vez que existe quando inicia o runbook com o Portal de Gestão ou com o cmdlet Start-SmaRunbook .

Tipos de runbooks

Um runbook só pode utilizar outro runbook do mesmo tipo que um runbook subordinado através da execução inline. Isto significa que um runbook de Fluxo de Trabalho do PowerShell não pode utilizar um runbook do PowerShell como um subordinado através da execução inline e um runbook do PowerShell não pode utilizar um runbook de Fluxo de Trabalho do PowerShell.

Quando chama um runbook subordinado do Fluxo de Trabalho do PowerShell através da execução inline, basta utilizar o nome do runbook. Quando chama um runbook subordinado do PowerShell, tem de preceder o respetivo nome com .\ para especificar que o script está localizado no diretório local.

Exemplo

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. Neste caso, o runbook subordinado é um runbook do Fluxo de Trabalho do PowerShell.

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

Segue-se o mesmo exemplo com um runbook de script do PowerShell que o subordinado.

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

Iniciar um runbook subordinado com cmdlets

Pode utilizar o cmdlet Start-SMARunbookpara iniciar um runbook com 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 qualquer saída do runbook, terá de aceder à tarefa com Get-SMAJobOutput.

A tarefa de um runbook subordinado iniciada com um cmdlet é executada à parte da tarefa do runbook principal. Isto resulta em mais tarefas do que invocar o fluxo de trabalho inline, aumentar a sobrecarga no servidor de trabalho e torná-los 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, chamando os runbooks subordinados inline, o runbook principal teria de utilizar a palavra-chave paralela.

Os parâmetros de um runbook subordinado iniciado com um cmdlet são fornecidos como uma tabela hash conforme descrito em Parâmetros de Runbook. Apenas podem ser utilizados tipos de dados simples, embora possa fornecer 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

Comparar 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.
Saída 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 utilizem a serialização JSON.
Publicar 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 um runbook principal ser iniciado.

Passos seguintes