Tutorial: Criar manual powershell de automação utilizando identidade gerida

Este tutorial acompanha-o através da criação de um livro de administração powerShell em Automatização do Azure que usa uma identidade gerida, em vez da conta Run As para interagir com recursos. Os livros powerShell são baseados em Windows PowerShell. Uma identidade gerida do Azure Ative Directory (Azure AD) permite que o seu runbook aceda facilmente a outros recursos protegidos por Azure AD.

Neste tutorial, ficará a saber como:

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

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

Pré-requisitos

Atribuir permissões a identidades geridas

Atribua permissões às identidades geridas para permitir que parem e liguem uma máquina virtual.

  1. Inscreva-se no Azure interativamente utilizando 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. Fornecer um valor adequado para as variáveis abaixo e, em seguida, executar o script.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Use a assinatura do Comandante PowerShell New-AzRole para atribuir uma função à identidade gerida 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 função é necessária para a identidade gerida atribuída pelo utilizador

    $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 gerida atribuída ao sistema para executar cmdlets Get-AzUserAssignedIdentity e Get-AzAutomationAccount como usado neste tutorial.

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

Criar runbook do PowerShell

Crie um livro de execução que permita a execução por uma das identidades geridas. O livro de execução iniciará um VM parado ou impedirá um VM em funcionamento.

  1. Inscreva-se no portal do Azure e navegue para a sua conta Demôm automação.

  2. Em Automatização de Processos, selecione Runbooks.

  3. Selecione Criar um livro de execução.

    1. Diga o nome do livro de bordo miTesting.
    2. A partir do drop-down do tipo Runbook , selecione PowerShell.
    3. A partir da versão Runtime , selecione 7.1 (pré-visualização) ou 5.1.
    4. Introduza 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
    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. No editor, na linha 8, revê o valor da $automationAccount variável conforme necessário.

  7. Selecione Guardar e, em seguida, testar o painel.

  8. Povoar os parâmetros RESOURCEGROUP e VMNAME com os valores apropriados. Introduza SA para o METHOD parâmetro e xUAMI para o UAMI parâmetro. O livro de bordo tentará alterar o estado de potência do seu VM utilizando a identidade gerida atribuída pelo sistema.

  9. Selecione Iniciar. Uma vez concluído o livro de execução, a saída deve 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 livro de aplicação tentará alterar o estado de potência do seu VM utilizando a identidade gerida atribuída pelo utilizador. Uma vez concluído o livro de execução, a saída deve 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 já não são necessários, execute o seguinte livro de bordo.

#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

Passos seguintes

Neste tutorial, criou um livro de administração powerShell em Automatização do Azure que usou uma identidade gerida, em vez da conta Run As para interagir com recursos. Para ver os livros de fluxo de trabalho powerShell, consulte: