Tutorial: Criar runbook do PowerShell de automação usando identidade gerenciada

Este tutorial orienta você na criação de um runbook do PowerShell na Automação do Azure que usa uma identidade gerenciada, em vez da conta Run As para interagir com recursos. Os runbooks do PowerShell baseiam-se no Windows PowerShell. Uma identidade gerenciada do Microsoft Entra ID permite que seu runbook acesse facilmente outros recursos protegidos pelo Microsoft Entra.

Neste tutorial, irá aprender a:

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

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

Pré-requisitos

  • Uma conta da Automatização do Azure com, pelo menos, uma identidade gerida atribuída pelo utilizador. Para obter mais informações, consulte Usando uma identidade gerenciada atribuída pelo usuário para uma conta de Automação do Azure.
  • Az modules: Az.Accounts, , Az.AutomationAz.ManagedServiceIdentity, e Az.Compute importados para a conta de automação. Para mais informações, consulte Importar módulos Az.
  • O módulo Azure Az PowerShell instalado em sua máquina. Para instalar ou atualizar, consulte Como instalar o módulo Azure Az PowerShell. Az.ManagedServiceIdentity é um módulo de visualização e não está instalado como parte do módulo Az. Para instalá-lo, execute Install-Module -Name Az.ManagedServiceIdentity.
  • Uma máquina virtual do Azure. Como você para e inicia essa máquina, ela não deve ser uma VM de produção.
  • Uma familiaridade geral com runbooks de automação.

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 interativamente 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 ao 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. São necessárias permissões adicionais para a identidade gerenciada atribuída pelo sistema 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 qualquer identidade gerenciada. O runbook iniciará uma VM interrompida ou interromperá uma VM em execução.

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

  2. Em Automação de processos, 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 tempo de execução , selecione 7.1 (visualização) 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 $automationAccount variável conforme necessário.

  7. Selecione Salvar e, em seguida, Painel de teste.

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

  9. Selecione Iniciar. Quando o runbook for concluído, 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 METHOD parâmetro para UA.

  11. Selecione Iniciar. O runbook tentará alterar o estado de energia da sua VM usando a identidade gerenciada atribuída pelo usuário nomeado. Quando o runbook for concluído, 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 quaisquer recursos que não sejam 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óximos passos

Neste tutorial, você criou um runbook do PowerShell na Automação do Azure que usava uma identidade gerenciada, em vez da conta Run As para interagir com recursos. Para ver os runbooks do Fluxo de Trabalho do PowerShell, consulte: