Onderliggende runbooks in Service Management Automation
Het is een goede praktijk in Service Management Automation (SMA) om herbruikbare, modulaire runbooks te schrijven met een specifieke functie die door andere runbooks kan worden gebruikt. Een ouder runbook roept vaak een of meer onderliggende runbooks aan om de vereiste functionaliteit uit te voeren. Er zijn twee manieren om een kindrunbook aan te roepen, en ieder heeft zijn eigen verschillen die u moet begrijpen om te bepalen welke het beste is voor uw verschillende scenario's.
Een onderliggend runbook aanroepen met behulp van inline-uitvoering
Als u een runbook inline wilt aanroepen vanuit een ander runbook, gebruikt u de naam van het runbook en geeft u waarden op voor de parameters, precies zoals u een activiteit of cmdlet zou gebruiken. Alle runbooks in dezelfde SMA-omgeving zijn beschikbaar voor alle andere om op deze manier te worden gebruikt. Het hoofdrunbook wacht totdat het kindrunbook is voltooid voordat het naar de volgende regel gaat, en eventuele uitvoer wordt rechtstreeks naar het hoofdrunbook geretourneerd.
Wanneer u een runbook inline aanroept, wordt het uitgevoerd in dezelfde taak als het ouder runbook. Er zal geen indicatie zijn in de taakgeschiedenis van het kind-runbook dat het is uitgevoerd. Eventuele uitzonderingen en uitvoer van streams van het onderliggende runbook worden gekoppeld aan het bovenliggende runbook. Dit resulteert in minder processen en maakt het gemakkelijker om deze bij te houden en problemen op te lossen, aangezien eventuele uitzonderingen die worden gegenereerd door het onderliggende runbook en de streamuitvoer die zijn gekoppeld aan het bovenliggende runbookproces, gemakkelijker te beheren zijn.
Wanneer een runbook wordt gepubliceerd, moeten alle onderliggende runbooks die worden aanroepen, al een gepubliceerde versie hebben. Dit komt doordat Automation enige koppeling maakt met kind-runbooks wanneer een runbook wordt gecompileerd. Als dat niet zo is, lijkt het bovenliggende runbook correct te worden gepubliceerd, maar wordt er een uitzondering gegenereerd wanneer het wordt gestart. Als dit gebeurt, kunt u het bovenliggende runbook opnieuw publiceren, zodat u naar de onderliggende runbooks kunt verwijzen. U hoeft het hoofdrunbook niet opnieuw te publiceren als een van de onderliggende runbooks wordt gewijzigd, omdat de koppeling al is gemaakt.
De parameters van een onderliggend runbook dat inline wordt aangeroepen, kunnen elk gegevenstype zijn, inclusief complexe objecten, en er is geen JSON-serialisatie, omdat u het runbook start met behulp van de beheerportal of met de Start-SmaRunbook cmdlet.
Runbooktypen
Een runbook kan alleen een ander runbook van hetzelfde type gebruiken als een sub-runbook met behulp van inline uitvoering. Dit betekent dat een PowerShell Workflow-runbook geen PowerShell-runbook als onderliggend runbook kan gebruiken en een PowerShell-runbook geen PowerShell Workflow-runbook kan gebruiken.
Wanneer u een onderliggend Runbook van PowerShell Workflow aanroept met behulp van inline-uitvoering, gebruikt u alleen de naam van het runbook. Wanneer u een onderliggende PowerShell-runbook aanroept, moet u zijn naam voorafgaan met .\ om aan te geven dat het script zich in de lokale directory bevindt.
Voorbeeld
In het volgende voorbeeld wordt een ondergeschikt testrunbook aangeroepen dat drie parameters ontvangt: een complex object, een geheel getal, en een booleaanse waarde. De uitvoer van het kinder-runbook wordt toegewezen aan een variabele. In dit geval is het onderliggende runbook een PowerShell Workflow-runbook.
$vm = Get-VM -Name "MyVM" -ComputerName "MyServer"
$output = Test-ChildRunbook -VM $vm -RepeatCount 2 -Restart $true
Hieronder volgt hetzelfde voorbeeld met behulp van een PowerShell-runbook als het kind.
$vm = Get-VM -Name "MyVM" -ComputerName "MyServer"
$output = .\Test-ChildRunbook.ps1 -VM $vm -RepeatCount 2 -Restart $true
Een kind-runbook starten met cmdlets
U kunt de cmdlet Start-SMARunbookgebruiken om een runbook te starten met Windows PowerShell. Wanneer u een child-runbook start vanuit een cmdlet, gaat het ouder-runbook verder naar de volgende regel zodra er een taak is aangemaakt voor het child-runbook. Als u uitvoer uit het runbook wilt ophalen, moet u toegang krijgen tot de taak met behulp van Get-SMAJobOutput-.
De taak van een kind-runbook dat is gestart met een cmdlet, wordt uitgevoerd in een afzonderlijke taak van het ouder-runbook. Dit resulteert in meer taken dan het aanroepen van de werkstroom in de werkstroom zelf, waardoor de overhead op de werkservers toeneemt en ze moeilijker te volgen zijn. De ouder kan echter meerdere kind-runbooks starten zonder te wachten totdat deze zijn voltooid. Voor datzelfde soort parallelle uitvoering, waarbij de onderliggende runbooks inline worden aangeroepen, moet het bovenliggende runbook het parallelle trefwoordgebruiken.
Parameters voor een kinder-runbook dat is gestart met een cmdlet, worden geleverd als een hashtable, zoals beschreven in Runbook Parameters. Alleen eenvoudige gegevenstypen kunnen worden gebruikt, hoewel u de naam van een referentieasset kunt opgeven zoals beschreven in Referenties. Als het runbook een parameter met een complex gegevenstype heeft, moet het inline worden aangeroepen.
In het volgende voorbeeld start een child runbook met parameters en wacht tot het voltooid is. Zodra het is voltooid, wordt de uitkomst van de taak verzameld door het ouder-runbook.
$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
Methoden vergelijken voor het aanroepen van een afgeleid runbook
De volgende tabel bevat een overzicht van de verschillen tussen de twee methoden voor het aanroepen van een runbook vanuit een ander runbook.
Inline | Cmdlet | |
---|---|---|
taak | Kind-runbooks worden uitgevoerd in hetzelfde proces als de ouder. | Er wordt een afzonderlijke taak gemaakt voor het kinder-runbook. |
Uitvoering | Het ouder-runbook wacht tot het kind-runbook is voltooid voordat het doorgaat. | Het ouder-runbook wordt direct voortgezet nadat het kind-runbook is gestart. |
uitvoer | Het bovenliggende runbook kan direct uitvoer verkrijgen van een onderliggend runbook. | Het hoofd-runbook moet uitvoer ophalen uit de sub-runbook job. |
parameters | Waarden voor de kind-runbookparameters worden afzonderlijk gespecificeerd en kunnen gebruik maken van elk gegevenstype. | Waarden voor de onderliggende runbookparameters moeten worden gecombineerd tot één hashtabel en kunnen alleen eenvoudige, matrix- en objectgegevenstypen bevatten die gebruikmaken van JSON-serialisatie. |
Publiceren | Het kinderrunbook moet worden gepubliceerd voordat het ouderrunbook wordt gepubliceerd. | Het kind-runbook moet op elk gewenst moment worden gepubliceerd voordat een ouder-runbook wordt gestart. |
Volgende stappen
- Meer informatie over automation-runbooks.