Tutorial: Criar um runbook de Automação do PowerShell usando uma identidade gerenciada

Este tutorial explica como criar um runbook do PowerShell na Automação do Azure que usa uma identidade gerenciada em vez da conta Executar como para interagir com recursos. Os runbooks do PowerShell se baseiam no Windows PowerShell. Uma identidade gerenciada do Microsoft Entra ID permite que seu runbook acesse facilmente outros recursos protegidos pelo Microsoft Entra.

Neste tutorial, você aprenderá a:

  • Atribuir permissões a identidades gerenciadas
  • Criar runbook do PowerShell

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Pré-requisitos

Atribuir permissões a identidades gerenciadas

Atribua permissões às identidades gerenciadas para permitir que elas parem e iniciem uma máquina virtual.

  1. Entre no Azure de modo interativo usando o cmdlet Connect-AzAccount e siga as instruções.

    # 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. Forneça um valor apropriado para as variáveis abaixo e, em seguida, execute o script.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Use o cmdlet do PowerShell New-AzRoleAssignment para atribuir uma função à identidade gerenciada atribuída pelo sistema.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. A mesma atribuição de função é necessária para a identidade gerenciada atribuída pelo usuário

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Permissões adicionais para a identidade gerenciada atribuída pelo sistema são necessárias para executar cmdlets Get-AzUserAssignedIdentity e Get-AzAutomationAccount, conforme usado neste tutorial.

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

Criar runbook do PowerShell

Crie um runbook que permitirá a execução por uma das identidades gerenciadas. O runbook iniciará uma VM parada ou interromperá uma VM em execução.

  1. Entre no portal do Azure e navegue até sua conta da Automação.

  2. Em Automação de Processo, selecione Runbooks.

  3. Selecione Criar um runbook.

    1. Nomeie o runbook miTesting.
    2. Na lista suspensa Tipo de runbook, selecione PowerShell.
    3. Na lista suspensa Versão do runtime, selecione 7.1 (versão prévia) ou 5.1.
    4. Insira uma Descrição aplicável.
  4. Clique em Criar para criar o runbook.

  5. No editor de runbook, cole o seguinte código:

    Param(
        [string]$ResourceGroup,
        [string]$VMName,
        [string]$Method,
        [string]$UAMI 
    )
    
    $automationAccount = "xAutomationAccount"
    
    # Ensures you do not inherit an AzContext in your runbook
    $null = Disable-AzContextAutosave -Scope Process
    
    # Connect using a Managed Service Identity
    try {
        $AzureConnection = (Connect-AzAccount -Identity).context
    }
    catch {
        Write-Output "There is no system-assigned user identity. Aborting." 
        exit
    }
    
    # set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureConnection.Subscription -DefaultProfile $AzureConnection
    
    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
        $AzAutomationAccount = Get-AzAutomationAccount -ResourceGroupName $ResourceGroup -Name $automationAccount -DefaultProfile $AzureContext
        if ($AzAutomationAccount.Identity.UserAssignedIdentities.Values.PrincipalId.Contains($identity.PrincipalId)) {
            $AzureConnection = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context
    
            # set and store context
            $AzureContext = Set-AzContext -SubscriptionName $AzureConnection.Subscription -DefaultProfile $AzureConnection
        }
        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. No editor, na linha 8, revise o valor da variável $automationAccount conforme necessário.

  7. Selecione Salvar e Testar painel.

  8. Preencha os parâmetros RESOURCEGROUP e VMNAME com os valores apropriados. Insira SA para o parâmetro METHOD e xUAMI para o parâmetro UAMI. O runbook tentará alterar o estado de energia da VM usando a identidade gerenciada atribuída pelo sistema.

  9. Selecione Iniciar. Após a conclusão do runbook, a saída deverá ser semelhante à seguinte:

     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. Altere o valor do parâmetro METHOD para UA.

  11. Selecione Iniciar. O runbook tentará alterar o estado de energia da VM usando a identidade gerenciada nomeada atribuída pelo usuário. Após a conclusão do runbook, a saída deverá ser semelhante à seguinte:

    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
    

Limpar recursos

Para remover os recursos que não são mais necessários, execute o runbook a seguir.

#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

Próximas etapas

Neste tutorial, você criou um runbook do PowerShell na Automação do Azure que usou uma identidade gerenciada em vez de “Executar como conta” para interagir com recursos. Para ver os runbooks de fluxo de trabalho do PowerShell, confira: