Tutoriel : Créer un runbook PowerShell Automation avec une identité managée

Ce tutoriel vous guide dans la création d’un runbook PowerShell dans Azure Automation qui utilise une identité managée, plutôt que le compte d’identification, pour interagir avec les ressources. Les Runbooks PowerShell sont basés sur Windows PowerShell. Une identité managée depuis Microsoft Entra ID permettant à votre runbook d’accéder facilement à d’autres ressources protégées par Microsoft Entra.

Dans ce tutoriel, vous allez apprendre à :

  • Attribuer des autorisations aux identités managées
  • Créer un runbook PowerShell

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

Attribuer des autorisations aux identités managées

Affectez des autorisations aux identités managées pour leur permettre d’arrêter et de démarrer une machine virtuelle.

  1. Connectez-vous à Azure de manière interactive à l’aide de la cmdlet Connect-AzAccount et suivez les instructions.

    # 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. Fournissez une valeur appropriée pour les variables ci-dessous, puis exécutez le script.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Utilisez la cmdlet PowerShell New-AzRoleAssignment pour affecter un rôle à l’identité managée affectée par le système.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. La même attribution de rôle est nécessaire pour l’identité managée affectée par l’utilisateur

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Des autorisations supplémentaires pour l’identité gérée affectée par le système sont nécessaires pour exécuter les cmdlets Get-AzUserAssignedIdentity et Get-AzAutomationAccount comme dans ce tutoriel.

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

Mon premier Runbook PowerShell

Créez un runbook qui autorise l’exécution par l’une des identités managées. Le runbook démarre une machine virtuelle arrêtée ou arrête une machine virtuelle en cours d’exécution.

  1. Connectez-vous au portail Azure et accédez à votre compte Automation.

  2. Sous Automatisation de processus, sélectionnez Runbooks.

  3. Sélectionnez Créer un runbook.

    1. Nommez le runbook miTesting.
    2. Dans la liste déroulante Type de runbook, sélectionnez PowerShell.
    3. Dans la liste déroulante Version du runtime, sélectionnez 7.1 (préversion) ou 5.1.
    4. Entrez une Description applicable.
  4. Cliquez sur Créer pour créer le runbook.

  5. Dans l’éditeur de runbook, collez le code suivant :

    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. Dans l’éditeur, sur la ligne 8, modifiez la valeur de la variable $automationAccount si nécessaire.

  7. Sélectionnez Enregistrer, puis volet Test.

  8. Renseignez les paramètres RESOURCEGROUP et VMNAME avec les valeurs appropriées. Entrez SA pour le paramètre METHOD, et xUAMI pour le paramètre UAMI. Le runbook va tenter de modifier l’état d’alimentation de votre machine virtuelle à l’aide de l’identité managée affectée par le système.

  9. Sélectionnez Démarrer. Une fois le runbook terminé, la sortie doit ressembler à ce qui suit :

     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. Modifiez la valeur du paramètre METHOD en UA.

  11. Sélectionnez Démarrer. Le runbook va tenter de modifier l’état d’alimentation de votre machine virtuelle à l’aide de l’identité managée affectée par l’utilisateur. Une fois le runbook terminé, la sortie doit ressembler à ce qui suit :

    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
    

Suppression des ressources

Pour supprimer toutes les ressources qui ne sont plus nécessaires, exécutez le runbook suivant.

#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

Étapes suivantes

Dans ce tutoriel, vous avez créé un runbook PowerShell dans Azure Automation qui utilise une identité managée, plutôt que le compte d’identification, pour interagir avec les ressources. Pour obtenir un aperçu des runbooks PowerShell Workflow, consultez :