Condividi tramite


Esercitazione: Creare un runbook PowerShell di Automazione usando l'identità gestita

Questa esercitazione illustra come creare un runbook di PowerShell in Automazione di Azure che usa un'identità gestita per interagire con le risorse. I runbook di PowerShell sono basati su Windows PowerShell. Un'identità gestita da Microsoft Entra ID consente al runbook di accedere facilmente ad altre risorse protette di Microsoft Entra.

In questa esercitazione verranno illustrate le procedure per:

  • Assegnare le autorizzazioni alle identità gestite
  • Creare un runbook di PowerShell

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Prerequisiti

Prima di assegnare le autorizzazioni alle identità gestite, assicurarsi di soddisfare questi prerequisiti:

Assegnare le autorizzazioni alle identità gestite

Assegnare autorizzazioni alle identità gestite per consentire l'arresto e l'avvio di una macchina virtuale.

Per assegnare le autorizzazioni alle identità gestite, seguire questa procedura:

  1. Accedere ad Azure in modo interattivo usando il cmdlet Connect-AzAccount e seguire le istruzioni:

    # 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. Immettere un valore appropriato per le variabili seguenti e quindi eseguire lo script.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Usare il cmdlet di PowerShell New-AzRoleAssignment per assegnare un ruolo all’identità gestita assegnata dal sistema.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. Per l'identità gestita assegnata dall'utente è necessaria la stessa assegnazione di ruolo.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Per eseguire i cmdlet Get-AzUserAssignedIdentity e Get-AzAutomationAccount come usato in questa esercitazione sono necessarie autorizzazioni aggiuntive per l'identità gestita assegnata dal sistema.

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

Creare un runbook PowerShell

Creare un runbook che consentirà l'esecuzione da una delle due identità gestite. Il runbook avvia una macchina virtuale arrestata o arresta una macchina virtuale in esecuzione.

Per creare un runbook di PowerShell, seguire questa procedura:

  1. Accedere al portale di Azure e passare all'account di Automazione.

  2. Nella pagina Panoramica selezionare Prova esperienza dell'ambiente di runtime, se non è già presente nella nuova esperienza.

  3. In Automazione processi selezionare Runbook.

  4. Selezionare Crea un runbook ed eseguire le operazioni seguenti:

    1. Assegnare un nome al runbook miTesting.
    2. Nell'elenco a discesa Tipo di runbook selezionare PowerShell.
    3. Nell'elenco a discesa Ambiente di runtime, seleziona l'ambiente esistente di runtime o crea un nuovo Ambiente di runtime con PowerShell e versione 7.4.
    4. Immettere una descrizione applicabile.
  5. Selezionare Crea per creare il runbook.

  6. Nell'editor dei runbook incollare il codice seguente:

    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
    
  7. Nell'editor, alla riga 8, rivedere il valore per la variabile $automationAccount, in base alle esigenze.

  8. Selezionare Salva e quindi Riquadro di test.

  9. Popolare i parametri RESOURCEGROUP e VMNAME con i valori appropriati. Immettere SA per il parametro METHOD e xUAMI per il parametro UAMI. Il runbook tenterà di modificare lo stato di potenza della macchina virtuale usando l'identità gestita assegnata dal sistema.

  10. Selezionare Start. Al termine del runbook, l'output dovrebbe essere simile al seguente:

     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
    
  11. Modificare il valore per il parametro METHOD in UA.

  12. Selezionare Start. Il runbook tenterà di modificare lo stato di potenza della macchina virtuale usando l'identità gestita assegnata dall'utente denominata. Al termine del runbook, l'output dovrebbe essere simile al seguente:

    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
    

Eseguire la pulizia delle risorse

Per rimuovere le risorse non più necessarie, eseguire il runbook seguente:

#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

Passaggi successivi

In questa esercitazione è stato creato un runbook di PowerShell in Automazione di Azure che ha usato un'identità gestita, anziché l'account Run As per l'interazione con le risorse. Per un'analisi dei runbook del flusso di lavoro PowerShell, vedere: