Compartilhar via


Iniciando um Runbook por meio de outro Runbook

 

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

É uma prática recomendada em Service Management Automation escrever runbooks reutilizáveis e modulares, com uma função discreta que pode ser usada por outros runbooks. Um runbook pai geralmente chamará um ou mais runbooks filho para executar a funcionalidade necessária. Há duas maneiras para chamar um runbook filho, e cada uma tem diferenças marcantes que você deve compreender para que possa determinar qual será a melhor para seus diferentes cenários.

  • Chamar um Runbook filho usando a execução embutida

  • Iniciando um Runbook filho usando o Cmdlet

Chamar um Runbook filho usando a execução embutida

Para invocar um runbook embutido por meio de outro runbook, use o nome do runbook e forneça valores para os parâmetros dele exatamente do modo como você usaria uma atividade ou cmdlet. Todos os runbooks no mesmo ambiente Service Management Automation estão disponíveis para todos os outros para serem usados dessa maneira. O runbook pai aguardará o runbook filho ser concluído antes de passar para a próxima linha e nenhuma saída é retornada diretamente ao pai.

Quando você invoca um runbook embutido, ele é executado no mesmo trabalho que o runbook pai. Não haverá nenhuma indicação no histórico de trabalho do runbook filho de que ele foi executado. Todas as exceções e qualquer fluxo de saída do runbook filho serão associados com o runbook pai. Isso resulta em menos trabalhos e torna mais fácil rastrear e solucionar problemas, já que as exceções geradas pelo runbook filho e qualquer uma de suas saídas de fluxo são associadas com o trabalho do runbook pai.

Quando um runbook é publicado, quaisquer eventuais runbooks filho chamados por ele já devem ter uma versão publicada. Isso ocorre porque Automação cria uma associação com quaisquer eventuais runbooks filho quando um runbook é compilado. Se não forem, o runbook pai dará a impressão de ser publicado corretamente, mas gerará uma exceção quando for iniciado. Se isso acontecer, você poderá republicar o runbook pai para referenciar corretamente os runbooks filho. Você não precisa republicar o runbook pai se qualquer um dos runbooks filho forem alterados, porque a associação já terá sido criada.

Os parâmetros de um runbook filho chamado embutido podem ser qualquer tipo de dados, incluindo objetos complexos, e não há nenhuma serialização JSON como aquelas existentes quando você inicia o runbook usando o Portal de Gerenciamento ou com o cmdlet Start-SmaRunbook.

O exemplo a seguir invoca um runbook filho de teste que aceita três parâmetros, um objeto complexo, um número inteiro e um valor booliano. A saída do runbook filho é atribuída a uma variável.

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

Iniciando um Runbook filho usando o Cmdlet

Você pode usar o cmdlet Start-SMARunbook para iniciar um runbook, conforme descrito em Iniciar um runbook com o Windows PowerShell. Quando você inicia um runbook filho por meio de um cmdlet, o runbook pai será movido para a próxima linha assim que o trabalho for criado para o runbook filho. Se você precisa recuperar qualquer saída do runbook, você precisa acessar o trabalho usando Get-SMAJobOutput.

O trabalho de um runbook filho iniciado com um cmdlet será executado em um trabalho separado em relação ao runbook pai. Isso resulta em mais trabalhos do que chamar o fluxo de trabalho embutido, aumentando a sobrecarga no servidor de trabalho e tornando-os mais difíceis de rastrear. O pai pode iniciar vários runbooks filho, embora não precise esperar de cada um deles ser concluído. Para esse mesmo tipo de execução paralela chamando os runbooks filho embutido, o runbook pai precisaria usar a palavra-chave paralela.

Parâmetros de um runbook filho iniciado com um cmdlet são fornecidos como uma tabela de hash, conforme descrito em Parâmetros do runbook. Somente os tipos de dados simples podem ser usados, embora você possa fornecer o nome de um ativo de credencial, conforme descrito em Credenciais. Se o runbook tem um parâmetro com um tipo de dados complexo, então ele deve ser chamado embutido.

O exemplo a seguir inicia um runbook filho com parâmetros e, em seguida, aguarda a conclusão deste. Depois de concluído, a saída é coletada do trabalho pelo runbook pai.

$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 filho

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

Embutido

Cmdlet

Trabalho

Runbooks filho são executados no mesmo trabalho que o pai.

Um trabalho separado é criado para o runbook filho.

Execução

Runbook pai aguarda que o runbook filho seja concluído antes de continuar.

Runbook pai continua imediatamente após o runbook filho ser iniciado.

Saída

Runbook pai pode obter saída diretamente do runbook filho.

O runbook pai deve recuperar a saída por meio do trabalho do runbook filho.

Parâmetros

Valores para os parâmetros de runbook filho são especificados separadamente e podem usar qualquer tipo de dados.

Valores para os parâmetros de runbook filho devem ser combinados em uma única tabela de hash e só podem incluir tipos de dados simples, de matriz e de objeto que aproveitam a serialização JSON.

Publicando

O runbook filho deve ser publicado antes do runbook pai.

O runbook filho deve ser publicado em qualquer momento antes do runbook pai ser iniciado.