Självstudie: Skapa En Automation PowerShell-runbook med hanterad identitet

Den här självstudien visar dig hur du skapar en PowerShell-runbook i Azure Automation som använder en hanterad identitet istället för Kör som-kontot för att interagera med resurser. PowerShell-runbooks baseras på Windows PowerShell. En hanterad identitet från Azure Active Directory (Azure AD) gör att din runbook enkelt kan komma åt andra Azure AD-skyddade resurser.

I den här guiden får du lära dig att:

  • Tilldela behörigheter till hanterade identiteter
  • Skapa en PowerShell-runbook

Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

Förutsättningar

Tilldela behörigheter till hanterade identiteter

Tilldela behörigheter till de hanterade identiteterna så att de kan stoppa och starta en virtuell dator.

  1. Logga in på Azure interaktivt med hjälp Anslut-AzAccount-cmdleten och följ instruktionerna.

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. Ange ett lämpligt värde för variablerna nedan och kör sedan skriptet.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Använd PowerShell-cmdleten New-AzRoleAssignment för att tilldela en roll till den systemtilldelade hanterade identiteten.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. Samma rolltilldelning krävs för den användar tilldelade hanterade identiteten

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Ytterligare behörigheter för den system tilldelade hanterade identiteten krävs för att köra cmdlets och som Get-AzUserAssignedIdentity används i den här Get-AzAutomationAccount självstudien.

    $role2 = "Reader"
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role2
    

Skapa PowerShell-runbook

Skapa en runbook som tillåter körning av antingen hanterad identitet. Runbooken startar en stoppad virtuell dator eller stoppar en virtuell dator som körs.

  1. Logga in på Azure Portaloch gå till ditt Automation-konto.

  2. Under Processautomatisering väljer du Runbooks.

  3. Välj Skapa en runbook.

    1. Ge runbooken namnet miTesting .
    2. Välj PowerShell i listrutan Typ av runbook.
    3. I listrutan Körningsversion väljer du antingen 7.1 (förhandsversion) eller 5.1.
    4. Ange en tillämplig Beskrivning.
  4. Skapa runbooken genom att klicka på Skapa.

  5. Klistra in följande kod i runbook-redigeraren:

    Param(
     [string]$resourceGroup,
     [string]$VMName,
     [string]$method,
     [string]$UAMI 
    )
    
    $automationAccount = "xAutomationAccount"
    
    # Ensures you do not inherit an AzContext in your runbook
    Disable-AzContextAutosave -Scope Process | Out-Null
    
    # Connect using a Managed Service Identity
    try {
            $AzureContext = (Connect-AzAccount -Identity).context
        }
    catch{
            Write-Output "There is no system-assigned user identity. Aborting."; 
            exit
        }
    
    # set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
        -DefaultProfile $AzureContext
    
    if ($method -eq "SA")
        {
            Write-Output "Using system-assigned managed identity"
        }
    elseif ($method -eq "UA")
        {
            Write-Output "Using user-assigned managed identity"
    
            # Connects using the Managed Service Identity of the named user-assigned managed identity
            $identity = Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup `
                -Name $UAMI -DefaultProfile $AzureContext
    
            # validates assignment only, not perms
            if ((Get-AzAutomationAccount -ResourceGroupName $resourceGroup `
                    -Name $automationAccount `
                    -DefaultProfile $AzureContext).Identity.UserAssignedIdentities.Values.PrincipalId.Contains($identity.PrincipalId))
                {
                    $AzureContext = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context
    
                    # set and store context
                    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
                }
            else {
                    Write-Output "Invalid or unassigned user-assigned managed identity"
                    exit
                }
        }
    else {
            Write-Output "Invalid method. Choose UA or SA."
            exit
         }
    
    # Get current state of VM
    $status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName `
        -Status -DefaultProfile $AzureContext).Statuses[1].Code
    
    Write-Output "`r`n Beginning VM status: $status `r`n"
    
    # Start or stop VM based on current state
    if($status -eq "Powerstate/deallocated")
        {
            Start-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext
        }
    elseif ($status -eq "Powerstate/running")
        {
            Stop-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext -Force
        }
    
    # Get new state of VM
    $status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName -Status `
        -DefaultProfile $AzureContext).Statuses[1].Code  
    
    Write-Output "`r`n Ending VM status: $status `r`n `r`n"
    
    Write-Output "Account ID of current context: " $AzureContext.Account.Id
    
  6. I redigeraren, på rad 8, ändrar du värdet för $automationAccount variabeln efter behov.

  7. Välj Spara och sedan Testfönster.

  8. Fyll i RESOURCEGROUP parametrarna VMNAME och med lämpliga värden. Ange SA för METHOD parametern och för xUAMI UAMI parametern . Runbooken försöker ändra energispartillståndet för den virtuella datorn med hjälp av den system tilldelade hanterade identiteten.

  9. Välj Starta. När runbooken har slutförts bör utdata se ut ungefär så här:

     Beginning VM status: PowerState/deallocated
    
    OperationId : 5b707401-f415-4268-9b43-be1f73ddc54b
    Status      : Succeeded
    StartTime   : 8/3/2021 10:52:09 PM
    EndTime     : 8/3/2021 10:52:50 PM
    Error       : 
    Name        : 
    
     Ending VM status: PowerState/running 
    
    Account ID of current context: 
    MSI@50342
    
  10. Ändra värdet för METHOD parametern till UA .

  11. Välj Starta. Runbooken försöker ändra energitillståndet för den virtuella datorn med hjälp av den namngivna användar tilldelade hanterade identiteten. När runbooken har slutförts bör utdata se ut ungefär så här:

    Using user-assigned managed identity
    
     Beginning VM status: PowerState/running 
    
    OperationId : 679fcadf-d0b9-406a-9282-66bc211a9fbf
    Status      : Succeeded
    StartTime   : 8/3/2021 11:06:03 PM
    EndTime     : 8/3/2021 11:06:49 PM
    Error       : 
    Name        : 
    
     Ending VM status: PowerState/deallocated 
    
    Account ID of current context: 
    9034f5d3-c46d-44d4-afd6-c78aeab837ea
    

Rensa resurser

Om du vill ta bort alla resurser som inte längre behövs kör du följande runbook.

#Remove runbook
Remove-AzAutomationRunbook `
    -ResourceGroupName $resourceGroup `
    -AutomationAccountName $automationAccount `
    -Name "miTesting" `
    -Force

# Remove role assignments
Remove-AzRoleAssignment `
    -ObjectId $UAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role1

Remove-AzRoleAssignment `
    -ObjectId $SAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role2

Remove-AzRoleAssignment `
    -ObjectId $SAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role1

Nästa steg

I den här självstudien skapade du en PowerShell-runbook i Azure Automation som använde en hanterad identitetistället för Kör som-kontot för att interagera med resurser. En titt på PowerShell Workflow-runbooks finns i: