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
- Una cuenta de Azure Automation con al menos una identidad administrada asignada por el usuario. Para más información, consulte Uso de una identidad administrada asignada por el usuario para una cuenta de Azure Automation.
- Los módulos de az
Az.Accounts
,Az.Automation
,Az.ManagedServiceIdentity
yAz.Compute
importados en la cuenta de Automation. Para más información, consulte Importación de módulos Az. - El módulo Azure Az de PowerShell instalado en la máquina. Para instalar o actualizar, vea Instalación del módulo Azure Az de PowerShell.
Az.ManagedServiceIdentity
es un módulo en versión preliminar y no se instala como parte del módulo Az. Para instalarlo, ejecuteInstall-Module -Name Az.ManagedServiceIdentity
. - Una máquina virtual de Azure. Dado que va a detener e iniciar esta máquina, no debería ser una máquina virtual de producción.
- Familiaridad general con los runbooks de Automation.
Asignación de permisos a las identidades administradas
Asigne permisos a las identidades administradas para permitirles detener e iniciar una máquina virtual.
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>
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"
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
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
La identidad administrada asignada por el sistema necesita permisos adicionales para ejecutar los cmdlets
Get-AzUserAssignedIdentity
yGet-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.
Inicie sesión en Azure Portal y vaya a la cuenta de Automation.
En Automatización de procesos, seleccione Runbooks.
Seleccione Crear un runbook.
- Asigne al runbook el nombre
miTesting
. - En la lista desplegable Tipo de Runbook, seleccione PowerShell.
- En la lista desplegable Versión del entorno de ejecución, seleccione 7.1 (versión preliminar) o 5.1.
- Escriba una descripción correspondiente.
- Asigne al runbook el nombre
Haga clic en Crear para crear el runbook.
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
En el editor, en la línea 8, modifique el valor de la variable
$automationAccount
según sea necesario.Seleccione Guardar y, luego, Panel de prueba.
Rellene los parámetros
RESOURCEGROUP
yVMNAME
con los valores adecuados. EscribaSA
en el parámetroMETHOD
yxUAMI
en el parámetroUAMI
. El runbook intentará cambiar el estado de energía de la máquina virtual mediante la identidad administrada asignada por el sistema.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
Cambie el valor del parámetro
METHOD
aUA
.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: