Runbook figlio in Automazione di AzureChild runbooks in Azure Automation

È buona norma in automazione di Azure scrivere runbook riutilizzabili e modulari con una funzione discreta che può essere utilizzata da altri runbook.It is a best practice in Azure Automation to write reusable, modular runbooks with a discrete function that can be used by other runbooks. Un runbook padre chiama spesso uno o più runbook figlio per eseguire la funzionalità richiesta.A parent runbook will often call one or more child runbooks to perform required functionality. Esistono due modi per chiamare un runbook figlio e ognuno presenta differenze che è necessario comprendere in modo che sia possibile determinare quale sarà migliore per i diversi scenari.There are two ways to call a child runbook, and each has distinct differences that you should understand so that you can determine which will be best for your different scenarios.

Richiamare un runbook figlio con esecuzione inlineInvoking a child runbook using inline execution

Per richiamare un runbook inline da un altro runbook, utilizzare il nome del runbook e fornire valori per i relativi parametri, esattamente come si farebbe per un'attività o un cmdlet.To invoke a runbook inline from another runbook, you use the name of the runbook and provide values for its parameters exactly like you would use an activity or cmdlet. Tutti i runbook nello stesso account di automazione sono disponibili a tutti gli altri per essere utilizzati come quanto segue.All runbooks in the same Automation account are available to all others to be used in this manner. Il runbook padre attenderà il completamento del runbook figlio prima di passare alla riga successiva e gli output vengono restituiti direttamente all'elemento padre.The parent runbook will wait for the child runbook to complete before moving to the next line, and any output is returned directly to the parent.

Quando si richiama un runbook inline, esso viene eseguito nello stesso processo del runbook padre.When you invoke a runbook inline, it runs in the same job as the parent runbook. Nella cronologia del processo non verrà indicato il runbook figlio eseguito.There will be no indication in the job history of the child runbook that it ran. Eventuali eccezioni e flussi di output dal runbook figlio verranno associati all'elemento padre.Any exceptions and any stream output from the child runbook will be associated with the parent. Ciò comporta un minor numero di processi e li rende più semplici per rilevare e risolvere poiché le eccezioni generate dal runbook figlio e i relativi output del flusso sono associati al processo padre.This results in fewer jobs and makes them easier to track and to troubleshoot since any exceptions thrown by the child runbook and any of its stream output are associated with the parent job.

Quando viene pubblicato un runbook, tutti i runbook figlio chiamati devono già essere pubblicati.When a runbook is published, any child runbooks that it calls must already be published. Questo avviene perché l'automazione di Azure crea un'associazione con i runbook figlio quando viene compilato un runbook.This is because Azure Automation builds an association with any child runbooks when a runbook is compiled. In caso contrario, il runbook padre sembrerà pubblicato correttamente ma al suo avvio verrà generata un'eccezione.If they aren’t, the parent runbook will appear to publish properly, but will generate an exception when it’s started. In questo caso, è possibile ripubblicare il runbook padre per fare riferimento in modo corretto ai runbook figlio.If this happens, you can republish the parent runbook in order to properly reference the child runbooks. Non è necessario ripubblicare il runbook padre se alcuni runbook figlio sono stati modificati in quanto l'associazione sarà già stata creata.You do not need to republish the parent runbook if any of the child runbooks are changed because the association will have already been created.

I parametri di un runbook figlio chiamato inline possono essere costituiti da qualsiasi tipo di dati, inclusi gli oggetti complessi, e non esiste alcuna serializzazione JSON come quando si avvia il runbook usando il portale di Azure o il cmdlet Start-AzureRmAutomationRunbook.The parameters of a child runbook called inline can be any data type including complex objects, and there is no JSON serialization as there is when you start the runbook using the Azure portal or with the Start-AzureRmAutomationRunbook cmdlet.

Tipi di runbookRunbook types

Tipi che possono richiamarsi a vicenda:Which types can call each other:

  • Un runbook di PowerShell e i runbook grafici possono chiamarsi reciprocamente inline (entrambi i tipi sono basati su PowerShell).A PowerShell runbook and Graphical runbooks can call each other inline (both are PowerShell based).
  • Un runbook del flusso di lavoro PowerShell e i runbook grafici del flusso di lavoro PowerShell possono richiamarsi a vicenda inline (entrambi i tipi si basano su PowerShell).A PowerShell Workflow runbook and Graphical PowerShell Workflow runbooks can call each other inline (both are PowerShell Workflow based)
  • I tipi PowerShell e i tipi di flusso di lavoro PowerShell non possono richiamarsi a vicenda online e devono utilizzare Start-AzureRmAutomationRunbook.The PowerShell types and the PowerShell Workflow types can’t call each other inline, and must use Start-AzureRmAutomationRunbook.

Quando è importante l’ordine di pubblicazione:When does publish order matter:

  • L'ordine di pubblicazione dei runbook è rilevante solo per i runbook del flusso di lavoro PowerShell e i runbook grafici del flusso di lavoro PowerShell.The publish order of runbooks only matters for PowerShell Workflow and Graphical PowerShell Workflow runbooks.

Quando si richiama un runbook figlio grafico o del flusso di lavoro PowerShell tramite l’esecuzione inline, è sufficiente utilizzare il nome del runbook.When you call a Graphical or PowerShell Workflow child runbook using inline execution, you just use the name of the runbook. Quando si chiama un runbook figlio di PowerShell, è necessario anteporre al nome .\ per specificare che lo script si trova nella directory locale.When you call a PowerShell child runbook, you must preceded its name with .\ to specify that the script is located in the local directory.

EsempioExample

Nell'esempio seguente viene richiamato un runbook figlio di test che accetta tre parametri, un oggetto complesso, un numero intero e un valore booleano.The following example invokes a test child runbook that accepts three parameters, a complex object, an integer, and a boolean. L'output del runbook figlio viene assegnato a una variabile.The output of the child runbook is assigned to a variable. In questo caso, il runbook figlio è un runbook del flusso di lavoro PowerShellIn this case, the child runbook is a PowerShell Workflow runbook

$vm = Get-AzureRmVM –ResourceGroupName "LabRG" –Name "MyVM"
$output = PSWF-ChildRunbook –VM $vm –RepeatCount 2 –Restart $true

Di seguito si trova lo stesso esempio con un runbook di PowerShell come elemento figlio.Following is the same example using a PowerShell runbook as the child.

$vm = Get-AzureRmVM –ResourceGroupName "LabRG" –Name "MyVM"
$output = .\PS-ChildRunbook.ps1 –VM $vm –RepeatCount 2 –Restart $true

Avvio di un runbook figlio utilizzando cmdletStarting a child runbook using cmdlet

È possibile usare il cmdlet Start-AzureRmAutomationRunbook per avviare un runbook come descritto nella sezione relativa all'avvio di un runbook con Windows PowerShell.You can use the Start-AzureRmAutomationRunbook cmdlet to start a runbook as described in To start a runbook with Windows PowerShell. Sono disponibili due modalità di utilizzo di questo cmdlet.There are two modes of use for this cmdlet. In una modalità, il cmdlet restituisce l'ID del processo non appena viene creato il processo figlio per il runbook figlio.In one mode, the cmdlet returns the job id as soon as the child job is created for the child runbook. Nell'altra modalità, che consente di specificare il parametro -wait , il cmdlet attende che l'elemento figlio finisca il processo e restituisce l'output dal runbook figlio.In the other mode, which you enable by specifying the -wait parameter, the cmdlet will wait until the child job finishes and will return the output from the child runbook.

Verrà eseguito il processo da un runbook figlio avviato con un cmdlet in un processo separato dal runbook padre.The job from a child runbook started with a cmdlet will run in a separate job from the parent runbook. Questo comporta più processi rispetto al richiamo del runbook inline e li rende più difficili da rilevare. L'elemento padre può avviare diversi runbook figli in modo asincrono senza attendere che ognuno di essi sia terminato.This results in more jobs than invoking the runbook inline and makes them more difficult to track. The parent can start multiple child runbooks asynchronously without waiting for each to complete. Per questa stessa tipologia di esecuzione parallela che chiama l’inline del runbook figlio, il runbook padre dovrà usare la parola chiave parallela.For that same kind of parallel execution calling the child runbooks inline, the parent runbook would need to use the parallel keyword.

L'output dei runbook figlio non viene restituito ai runbook padre in modo affidabile a causa dei tempi.The output of the child runbooks are not returned to the parent runbook reliably due to timing. È anche possibile che alcune variabili come $VerbosePreference, $WarningPreference e altre variabili non vengano propagate ai runbook figlio.Also certain variables like $VerbosePreference, $WarningPreference, and others may not be propagated to the child runbooks. Per evitare questi problemi, è possibile richiamare i runbook figlio come processi di automazione separati usando il cmdlet Start-AzureRmAutomationRunbook con l'opzione -Wait.In order to avoid these issues, you can invoke the child runbooks as separate Automation jobs using the Start-AzureRmAutomationRunbook cmdlet with the -Wait switch. In questo modo viene bloccato il runbook padre fino al completamento del runbook figlio.This blocks the parent runbook until the child runbook is complete.

Se non si vuole bloccare il runbook padre in attesa, è possibile richiamare il runbook figlio usando il cmdlet Start-AzureRmAutomationRunbook senza l'opzione -Wait.If you don’t want the parent runbook to be blocked on waiting, you can invoke the child runbook using Start-AzureRmAutomationRunbook cmdlet without the -Wait switch. Sarà quindi necessario usare Get-AzureRmAutomationJob per attendere il completamento del processo e Get-AzureRmAutomationJobOutput e Get-AzureRmAutomationJobOutputRecord per recuperare i risultati.You would then need to use Get-AzureRmAutomationJob to wait for job completion, and Get-AzureRmAutomationJobOutput and Get-AzureRmAutomationJobOutputRecord to retrieve the results.

I parametri per un runbook figlio avviato con un cmdlet vengono forniti come una tabella hash, come descritto in Parametri di Runbook.Parameters for a child runbook started with a cmdlet are provided as a hashtable as described in Runbook Parameters. Possono essere utilizzati solo tipi di dati semplici.Only simple data types can be used. Se il runbook dispone di un parametro con un tipo di dati complessi, deve essere chiamato inline.If the runbook has a parameter with a complex data type, then it must be called inline.

EsempioExample

Nell'esempio seguente viene avviato un runbook figlio con parametri e si attende il suo completamento con il parametro Start-AzureRmAutomationRunbook -wait.The following example starts a child runbook with parameters and then waits for it to complete using the Start-AzureRmAutomationRunbook -wait parameter. Una volta completato, l'output viene raccolto dal runbook figlio.Once completed, its output is collected from the child runbook.

$params = @{"VMName"="MyVM";"RepeatCount"=2;"Restart"=$true}
$joboutput = Start-AzureRmAutomationRunbook –AutomationAccountName "MyAutomationAccount" –Name "Test-ChildRunbook" -ResourceGroupName "LabRG" –Parameters $params –wait

Confronto di metodi per chiamare un runbook figlioComparison of methods for calling a child runbook

Nella tabella seguente vengono riepilogate le differenze tra i due metodi per chiamare un runbook da un altro runbook.The following table summarizes the differences between the two methods for calling a runbook from another runbook.

InlineInline CmdletCmdlet
ProcessoJob I runbook figlio vengono eseguiti nello stesso processo dell’elemento padre.Child runbooks run in the same job as the parent. Viene creato un processo separato per il runbook figlio.A separate job is created for the child runbook.
EsecuzioneExecution Il runbook padre attende il completamento del runbook figlio prima di continuare.Parent runbook waits for the child runbook to complete before continuing. Il runbook padre continua subito dopo l'avvio del runbook figlio o attende il completamento del processo figlio.Parent runbook continues immediately after child runbook is started or parent runbook waits for the child job to finish.
OutputOutput Il runbook padre può ottenere output direttamente dal runbook figlio.Parent runbook can directly get output from child runbook. Il runbook padre deve recuperare l'output dal processo del runbook figlio o può ottenere direttamente l'output dal runbook figlio.Parent runbook must retrieve output from child runbook job or parent runbook can directly get output from child runbook.
ParametriParameters I valori per i parametri di runbook figlio vengono specificati separatamente e possono utilizzare qualsiasi tipo di dati.Values for the child runbook parameters are specified separately and can use any data type. I valori per i parametri di runbook figlio devono essere combinati in una singola tabella di hash e possono includere solo tipi di dati semplici, matrice e oggetto che sfruttano la serializzazione JSON.Values for the child runbook parameters must be combined into a single hashtable and can only include simple, array, and object data types that leverage JSON serialization.
Account di automazioneAutomation Account Il runbook padre può utilizzare solo runbook figlio nello stesso account di automazione.Parent runbook can only use child runbook in the same automation account. Il runbook padre può usare runbook figlio di qualsiasi account di automazione della stessa sottoscrizione di Azure e anche di una sottoscrizione diversa a cui si ha una connessione.Parent runbook can use child runbook from any automation account from the same Azure subscription and even a different subscription if you have a connection to it.
PubblicazionePublishing Il runbook figlio deve essere pubblicato prima della pubblicazione del runbook padre.Child runbook must be published before parent runbook is published. Il runbook figlio deve essere pubblicato prima che il runbook padre venga avviato.Child runbook must be published any time before parent runbook is started.

Passaggi successiviNext steps