Az Azure Automation PowerShell-munkafolyamatának ismertetése

Az Azure Automation runbookjai Windows PowerShell-munkafolyamatként, Windows Workflow Foundationt használó Windows PowerShell-szkriptekként vannak implementálva. A munkafolyamat olyan programozott, összekapcsolódó lépések sora, amik hosszan futó feladatokat végeznek el vagy több eszközön vagy felügyelt csomóponton keresztül végrehajtandó, több lépés koordinációját igénylik.

Bár egy munkafolyamat a Windows PowerShell szintaxisával van megírva, és a Windows PowerShell indítja el, azt a Windows Workflow Foundation dolgozza fel. A munkafolyamatok egy normál szkripttel szembeni előnyei közé tartozik a műveletek egyidejű teljesítménye több eszközön, valamint a hibák automatikus helyreállítása.

Megjegyzés:

Ez a cikk a PowerShell 5.1-hez használható; A PowerShell 7.1 (előzetes verzió) és a PowerShell 7.2 (előzetes verzió) nem támogatja a munkafolyamatokat. A PowerShell-munkafolyamat-szkriptek nagyon hasonlítanak a Windows PowerShell-szkriptekhez, de vannak jelentős különbségek, amelyek zavaróak lehetnek egy új felhasználó számára. Ezért azt javasoljuk, hogy csak akkor írja meg a runbookokat a PowerShell-munkafolyamat használatával, ha ellenőrzőpontokat kell használnia.

A cikk témaköreinek részletes leírását a Windows PowerShell-munkafolyamat első lépései című témakörben találja.

Munkafolyamat kulcsszó használata

A PowerShell-szkriptek PowerShell-munkafolyamattá alakításának első lépése a kulcsszóval való Workflow beágyazás. A munkafolyamat a Workflow kulcsszóval kezdődik, amelyet a szkript törzse követ kapcsos zárójelek között. A munkafolyamat neve a kulcsszót követi az Workflow alábbi szintaxis szerint:

Workflow Test-Workflow
{
    <Commands>
}

A munkafolyamat nevének meg kell egyeznie az Automation-runbook nevével. Ha a runbook importálása folyamatban van, a fájlnévnek meg kell egyeznie a munkafolyamat nevével, és .ps1 végződésűnek kell lennie.

Ha paramétereket szeretne hozzáadni a munkafolyamathoz, használja a Param kulcsszót ugyanúgy, mint egy szkriptben.

Ismerje meg a PowerShell-munkafolyamat kódja és a PowerShell-szkriptkód közötti különbségeket

A PowerShell-munkafolyamat kódja szinte megegyezik a PowerShell-szkriptkóddal, néhány jelentős módosítás kivételével. Az alábbi szakaszok ismertetik a PowerShell-szkriptek munkafolyamatban való futtatásához szükséges módosításokat.

Tevékenységek

A tevékenység egy munkafolyamat adott feladata, amelyet sorozatban hajtanak végre. A Windows PowerShell-munkafolyamat automatikusan átalakítja a Windows PowerShell-parancsmagok nagy részét tevékenységekké munkafolyamat futtatásakor. Ha a runbookban ezen parancsmagok egyikét adja meg, a megfelelő tevékenységet a Windows Workflow Foundation futtatja.

Ha egy parancsmagnak nincs megfelelő tevékenysége, a Windows PowerShell-munkafolyamat automatikusan inlineScript-tevékenységben futtatja a parancsmagot. Egyes parancsmagok ki vannak zárva, és csak akkor használhatók munkafolyamatokban, ha explicit módon belefoglalja őket egy InlineScript-blokkba. További információ: Tevékenységek használata parancsfájl-munkafolyamatokban.

A munkafolyamat-tevékenységek közös paramétereket használnak a működésük konfigurálásához. Lásd: about_WorkflowCommonParameters.

Pozícióparaméterek

A munkafolyamat tevékenységeivel és parancsmagjaival nem használhat pozícióparamétereket. Ezért paraméterneveket kell használnia. Fontolja meg a következő kódot, amely az összes futó szolgáltatást lekéri:

Get-Service | Where-Object {$_.Status -eq "Running"}

Ha egy munkafolyamatban próbálja futtatni ezt a kódot, a következőhöz hasonló Parameter set cannot be resolved using the specified named parameters. üzenet jelenik meg: A probléma megoldásához adja meg a paraméter nevét, ahogyan az alábbi példában is látható:

Workflow Get-RunningServices
{
    Get-Service | Where-Object -FilterScript {$_.Status -eq "Running"}
}

Deszerializált objektumok

A munkafolyamatok objektumai deszerializálva vannak, ami azt jelenti, hogy a tulajdonságaik továbbra is elérhetők, a metódusaik azonban nem. Vegyük például a következő PowerShell-kódot, amely leállítja a szolgáltatást az StopService objektum metódusával.

$Service = Get-Service -Name MyService
$Service.Stop()

Ha ezt egy munkafolyamatban próbálja futtatni, hibaüzenet jelenik meg: Method invocation is not supported in a Windows PowerShell Workflow.

Az egyik lehetőség, hogy ezt a két sornyi kódot egy InlineScript-blokkba csomagolja. Ebben az esetben Service egy szolgáltatásobjektumot jelöl a blokkon belül.

Workflow Stop-Service
{
    InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
    }
}

Egy másik lehetőség egy másik parancsmag használata, amely ugyanazokkal a funkciókkal rendelkezik, mint a metódus, ha elérhető. A példánkban a Stop-Service parancsmag ugyanazokat a funkciókat biztosítja, mint a Stop metódus, és az alábbi kódot használhatja egy munkafolyamathoz.

Workflow Stop-MyService
{
    $Service = Get-Service -Name MyService
    Stop-Service -Name $Service.Name
}

InlineScript használata

AInlineScript tevékenység akkor hasznos, ha a PowerShell-munkafolyamat helyett egy vagy több parancsot kell futtatnia hagyományos PowerShell-szkriptként. Míg a munkafolyamat parancsait a rendszer a Windows Workflow Foundationbe továbbítja feldolgozás céljából, az InlineScript-blokkban lévő parancsokat a Windows PowerShell dolgozza fel.

Az InlineScript az alábbi szintaxist használja.

InlineScript
{
    <Script Block>
} <Common Parameters>

Az InlineScript kimenetét visszaadhatja úgy, hogy a kimenetet egy változóhoz rendeli. Az alábbi példa leállítja a szolgáltatást, majd kiállítja a szolgáltatás nevét.

Workflow Stop-MyService
{
    $Output = InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Az értékeket átadhatja egy InlineScript-blokkba, de $Using hatókör-módosítót kell használnia. Az alábbi példa megegyezik az előző példával, azzal a kivétellel, hogy a szolgáltatás nevét egy változó adja meg.

Workflow Stop-MyService
{
    $ServiceName = "MyService"

    $Output = InlineScript {
        $Service = Get-Service -Name $Using:ServiceName
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Bár az InlineScript-tevékenységek kritikus fontosságúak lehetnek bizonyos munkafolyamatokban, nem támogatják a munkafolyamat-szerkezeteket. Csak akkor használja őket, ha az alábbi okok miatt szükséges:

  • Nem használhat ellenőrzőpontokat egy InlineScript-blokkban. Ha a blokkon belül hiba történik, a blokknak a blokk elejétől kell folytatódnia.
  • InlineScript-blokkon belül nem használhat párhuzamos végrehajtást .
  • Az InlineScript hatással van a munkafolyamat méretezhetőségére, mivel a Windows PowerShell-munkamenetet az InlineScript-blokk teljes hosszában tárolja.

Az InlineScript használatával kapcsolatos további információkért lásd : Windows PowerShell-parancsok futtatása munkafolyamatban és about_InlineScript.

Párhuzamos feldolgozás használata

A Windows PowerShell-munkafolyamatok egyik előnye, hogy egy parancskészletet párhuzamosan hajthat végre, nem pedig egymás után, mint egy tipikus szkript esetén.

A kulcsszóval Parallel létrehozhat egy szkriptblokkot, amely egyszerre több parancsot is futtat. Ez az alábbi szintaxist használja. Ebben az esetben az Activity1 és a Activity2 egyszerre indul el. Az Activity3 csak akkor indul el, ha az Activity1 és az Activity2 is befejeződött.

Parallel
{
    <Activity1>
    <Activity2>
}
<Activity3>

Vegyük például az alábbi PowerShell-parancsokat, amelyek több fájlt másolnak egy hálózati célhelyre. Ezek a parancsok egymás után futnak, így az egyik fájlnak be kell fejeznie a másolást a következő indítása előtt.

Copy-Item -Path C:\LocalPath\File1.txt -Destination \\NetworkPath\File1.txt
Copy-Item -Path C:\LocalPath\File2.txt -Destination \\NetworkPath\File2.txt
Copy-Item -Path C:\LocalPath\File3.txt -Destination \\NetworkPath\File3.txt

A következő munkafolyamat ugyanazokat a parancsokat futtatja párhuzamosan, hogy mind egyszerre kezdjenek el másolni. Csak azok másolása után jelenik meg a befejező üzenet.

Workflow Copy-Files
{
    Parallel
    {
        Copy-Item -Path "C:\LocalPath\File1.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File2.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File3.txt" -Destination "\\NetworkPath"
    }

    Write-Output "Files copied."
}

A ForEach -Parallel szerkezettel egyszerre dolgozhatja fel a gyűjtemény egyes elemeihez tartozó parancsokat. A gyűjtemény elemeinek feldolgozása párhuzamosan történik, míg a szkriptblokk parancsai egymás után futnak. Ez a folyamat az alábbi szintaxist használja. Ebben az esetben az 1. tevékenység egyszerre kezdődik a gyűjtemény összes eleménél. Minden elemnél a Tevékenység2 az 1. tevékenység befejezése után kezdődik. Az Activity3 csak akkor indul el, ha az Activity1 és az Activity2 is befejeződött az összes elem esetében. A paraméter használatával ThrottleLimit korlátozzuk a párhuzamosságot. A túl magas értékek ThrottleLimit problémákat okozhatnak. A paraméter ideális értéke ThrottleLimit a környezet számos tényezőjétől függ. Kezdje alacsony értékkel, és próbálkozzon különböző növekvő értékekkel, amíg meg nem találja az adott körülményeknek megfelelőt.

ForEach -Parallel -ThrottleLimit 10 ($<item> in $<collection>)
{
    <Activity1>
    <Activity2>
}
<Activity3>

Az alábbi példa hasonló a fájlok párhuzamos másolására szolgáló előző példához. Ebben az esetben a másolás után minden fájlhoz megjelenik egy üzenet. Csak az összes másolás után jelenik meg a végleges befejezési üzenet.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
    }

    Write-Output "All files copied."
}

Megjegyzés:

Nem javasoljuk a gyermek runbookok párhuzamos futtatását, mivel ez megbízhatatlan eredményt ad. A gyermek runbook kimenete néha nem jelenik meg, és az egyik gyermek runbook beállításai hatással lehetnek a többi párhuzamos gyermek runbookra. Előfordulhat, hogy az olyan változók, mint VerbosePreferencea , WarningPreferenceés mások nem propagálják a gyermek runbookokat. Ha a gyermek runbook módosítja ezeket az értékeket, előfordulhat, hogy a meghívás után nem lesznek megfelelően visszaállítva.

Ellenőrzőpontok használata munkafolyamatban

Az ellenőrzőpont a munkafolyamat aktuális állapotának pillanatképe, amely tartalmazza a változók aktuális értékeit és az arra a pontra generált kimenetet. Ha egy munkafolyamat hibásan végződik vagy fel van függesztve, a következő futtatáskor az utolsó ellenőrzőponttól indul ahelyett, hogy az elején kezdené.

A tevékenységgel rendelkező munkafolyamatban beállíthatja az Checkpoint-Workflow ellenőrzőpontot. Az Azure Automation rendelkezik egy fair share nevű funkcióval, amely esetében a három órán át futó runbookok ki vannak ürítve, hogy más runbookok fussanak. Végül a kipakolt runbook újra betöltődik. Ha igen, akkor a runbook utolsó ellenőrzőpontjától folytatja a végrehajtást.

Annak érdekében, hogy a runbook végül befejeződjön, három óránál rövidebb időközönként kell ellenőrzőpontokat hozzáadnia. Ha minden futtatás során új ellenőrzőpontot ad hozzá, és ha a runbookot egy hiba miatt három óra elteltével kiürítik, a runbook határozatlan ideig folytatódik.

Az alábbi példában kivétel történik a 2. tevékenység után, ami a munkafolyamat végét okozza. A munkafolyamat újrafuttatása a Tevékenység2 futtatásával kezdődik, mivel ez a tevékenység az utolsó ellenőrzőpont-készlet után történt.

<Activity1>
Checkpoint-Workflow
<Activity2>
<Exception>
<Activity3>

Állítson be ellenőrzőpontokat egy munkafolyamatban a kivételre hajlamos tevékenységek után, és ne ismétlődjön meg, ha a munkafolyamat folytatódik. Előfordulhat például, hogy a munkafolyamat létrehoz egy virtuális gépet. A parancsok előtt és után is beállíthat ellenőrzőpontot a virtuális gép létrehozásához. Ha a létrehozás sikertelen, a parancsok ismétlődnek, ha a munkafolyamat újra elindul. Ha a munkafolyamat a létrehozás sikeres befejezése után meghiúsul, a virtuális gép nem jön létre újra a munkafolyamat folytatásakor.

Az alábbi példa több fájlt másol egy hálózati helyre, és minden fájl után beállít egy ellenőrzőpontot. Ha a hálózati hely elveszik, a munkafolyamat hibaüzenetben végződik. Az újrakezdéskor az utolsó ellenőrzőponton folytatódik. A program csak a már másolt fájlokat hagyja ki.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
        Checkpoint-Workflow
    }

    Write-Output "All files copied."
}

Mivel a felhasználónév hitelesítő adatai nem maradnak meg a Suspend-Workflow tevékenység meghívása után vagy az utolsó ellenőrzőpont után, a hitelesítő adatokat null értékre kell állítania, majd újra le kell kérnie őket az eszköztárolóból az ellenőrzőpont meghívása után Suspend-Workflow . Ellenkező esetben a következő hibaüzenet jelenhet meg: The workflow job cannot be resumed, either because persistence data could not be saved completely, or saved persistence data has been corrupted. You must restart the workflow.

Az alábbi kód bemutatja, hogyan kezelheti ezt a helyzetet a PowerShell-munkafolyamat-forgatókönyvekben.

workflow CreateTestVms
{
    $Cred = Get-AzAutomationCredential -Name "MyCredential"
    $null = Connect-AzAccount -Credential $Cred

    $VmsToCreate = Get-AzAutomationVariable -Name "VmsToCreate"

    foreach ($VmName in $VmsToCreate)
        {
        # Do work first to create the VM (code not shown)

        # Now add the VM
        New-AzVM -VM $Vm -Location "WestUs" -ResourceGroupName "ResourceGroup01"

        # Checkpoint so that VM creation is not repeated if workflow suspends
        $Cred = $null
        Checkpoint-Workflow
        $Cred = Get-AzAutomationCredential -Name "MyCredential"
        $null = Connect-AzAccount -Credential $Cred
        }
}

Megjegyzés:

Nem grafikus PowerShell-runbookok esetén, Add-AzAccount és Add-AzureRMAccount Csatlakozás-AzAccount aliasai. Használhatja ezeket a parancsmagokat, vagy frissítheti az Automation-fiókjában lévő modulokat a legújabb verziókra. Előfordulhat, hogy frissítenie kell a modulokat, még akkor is, ha most hozott létre egy új Automation-fiókot.

Az ellenőrzőpontokról további információt az Ellenőrzőpontok hozzáadása parancsfájl-munkafolyamathoz című témakörben talál.

Következő lépések