Tutorial: Creación de un runbook de PowerShell de Automation mediante una identidad administrada

Este tutorial le guía a través de la creación de un runbook de PowerShell en Azure Automation que usa una identidad administrada, en lugar de la cuenta de ejecución, para interactuar con los recursos. Los runbooks de PowerShell están basados en Windows PowerShell. Una identidad administrada de Microsoft Entra ID permite al runbook acceder fácilmente a otros recursos protegidos por Microsoft Entra.

En este tutorial, aprenderá a:

  • Asignación de permisos a las identidades administradas
  • Creación de un runbook de PowerShell

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Prerrequisitos

Asignación de permisos a las identidades administradas

Asigne permisos a las identidades administradas para permitirles detener e iniciar una máquina virtual.

  1. Inicie sesión en Azure de forma interactiva con el cmdlet Connect-AzAccount y siga las instrucciones.

    # 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. Proporcione un valor adecuado para las variables siguientes y, a continuación, ejecute el script.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Use el cmdlet de PowerShell New-AzRoleAssignment para asignar un rol a la identidad administrada asignada por el sistema.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. Se necesita la misma asignación de roles para la identidad administrada asignada por el usuario.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. La identidad administrada asignada por el sistema necesita permisos adicionales para ejecutar los cmdlets Get-AzUserAssignedIdentity y Get-AzAutomationAccount tal como se usan en este tutorial.

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

Creación de runbook de PowerShell

Cree un runbook que permita la ejecución por cualquiera de las identidades administradas. El runbook iniciará una máquina virtual detenida o detendrá una máquina virtual en ejecución.

  1. Inicie sesión en Azure Portal y vaya a la cuenta de Automation.

  2. En Automatización de procesos, seleccione Runbooks.

  3. Seleccione Crear un runbook.

    1. Asigne al runbook el nombre miTesting.
    2. En la lista desplegable Tipo de Runbook, seleccione PowerShell.
    3. En la lista desplegable Versión del entorno de ejecución, seleccione 7.1 (versión preliminar) o 5.1.
    4. Escriba una descripción correspondiente.
  4. Haga clic en Crear para crear el runbook.

  5. En el editor de runbooks, pegue el código siguiente:

    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. En el editor, en la línea 8, modifique el valor de la variable $automationAccount según sea necesario.

  7. Seleccione Guardar y, luego, Panel de prueba.

  8. Rellene los parámetros RESOURCEGROUP y VMNAME con los valores adecuados. Escriba SA en el parámetro METHOD y xUAMI en el parámetro UAMI. El runbook intentará cambiar el estado de energía de la máquina virtual mediante la identidad administrada asignada por el sistema.

  9. Seleccione Inicio. Una vez completado el runbook, la salida debería ser similar a la siguiente:

     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. Cambie el valor del parámetro METHOD a UA.

  11. Seleccione Inicio. El runbook intentará cambiar el estado de energía de la máquina virtual mediante la identidad administrada asignada por el usuario con nombre. Una vez completado el runbook, la salida debería ser similar a la siguiente:

    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
    

Limpieza de recursos

Para quitar los recursos que ya no son necesarios, ejecute el siguiente 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

Pasos siguientes

En este tutorial, ha creado un runbook de PowerShell en Azure Automation que usa una identidad administrada, en lugar de la cuenta de ejecución, para interactuar con los recursos. Para ver los runbooks de flujo de trabajo de PowerShell, consulte: