Samouczek: tworzenie Runbooka PowerShell do automatyzacji z wykorzystaniem tożsamości zarządzanej

Ten samouczek przeprowadzi Cię przez proces tworzenia runbooka PowerShell w Azure Automation, który korzysta z zarządzanej tożsamości aby wchodzić w interakcję z zasobami. Runbooki programu PowerShell są oparte na Windows PowerShell. Zarządzana tożsamość z Microsoft Entra ID umożliwia runbookowi łatwe uzyskiwanie dostępu do chronionych zasobów Microsoft Entra.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Przypisywanie uprawnień do tożsamości zarządzanych
  • Tworzenie elementu runbook programu PowerShell

Jeśli nie masz subskrypcji Azure, przed rozpoczęciem utwórz konto free.

Wymagania wstępne

Przed przypisaniem uprawnień do tożsamości zarządzanych upewnij się, że zostały spełnione następujące wymagania wstępne:

Przypisywanie uprawnień do tożsamości zarządzanych

Przypisz uprawnienia do tożsamości zarządzanych, aby umożliwić im zatrzymywanie i uruchamianie maszyny wirtualnej.

Aby przypisać uprawnienia do tożsamości zarządzanych, wykonaj następujące kroki:

  1. Zaloguj się do Azure interaktywnie przy użyciu polecenia cmdlet Connect-AzAccount i postępuj zgodnie z instrukcjami:

    # 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. Wprowadź odpowiednią wartość dla poniższych zmiennych, a następnie wykonaj skrypt.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Użyj cmdletu PowerShell New-AzRoleAssignment, aby przypisać rolę do tożsamości zarządzanej przypisanej przez system.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. To samo przypisanie roli jest wymagane dla tożsamości zarządzanej przypisanej przez użytkownika.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Dla tożsamości zarządzanej przypisanej przez system potrzebne są dodatkowe uprawnienia do wykonywania poleceń cmdlet Get-AzUserAssignedIdentity i Get-AzAutomationAccount używanych w tym samouczku.

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

Stwórz Runbook programu PowerShell

Utwórz runbook, który umożliwi wykonanie przy użyciu dowolnej tożsamości zarządzanej. Element Runbook uruchomi zatrzymaną maszynę wirtualną lub zatrzyma uruchomioną maszynę wirtualną.

Aby utworzyć Runbook programu PowerShell, wykonaj następujące kroki:

  1. Zaloguj się do portalu Azure i przejdź do konta usługi Automation.

  2. Na stronie Przegląd wybierz pozycję Wypróbuj nowe środowisko uruchomieniowe, jeśli jeszcze z niego nie korzystasz.

  3. W obszarze Automatyzacja procesów wybierz Runbooki.

  4. Wybierz Utwórz Runbook i wykonaj następujące czynności:

    1. Nadaj elementowi runbook miTestingnazwę .
    2. Z rozwijanej listy Typ Runbook wybierz PowerShell.
    3. Z listy rozwijanej Środowisko uruchomieniowewybierz istniejące środowisko uruchomieniowe lub Utwórz nowe za pomocą środowiska uruchomieniowego programu PowerShell i wersji 7.4.
    4. Wprowadź odpowiedni opis.
  5. Wybierz pozycję Utwórz , aby utworzyć element Runbook.

  6. W edytorze Runbook wklej następujący kod:

    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. W edytorze w wierszu 8 popraw wartość zmiennej $automationAccount zgodnie z potrzebami.

  8. Wybierz opcję Zapisz, a następnie Okienko testowe.

  9. Wypełnij parametry RESOURCEGROUP i VMNAME odpowiednimi wartościami. Wprowadź SA dla parametru METHOD i xUAMI parametru UAMI . Runbook podejmie próbę zmiany stanu zasilania Twojej maszyny wirtualnej przy użyciu zarządzanej tożsamości przypisanej przez system.

  10. Wybierz Start. Po zakończeniu działania elementu Runbook dane wyjściowe powinny wyglądać podobnie do następujących:

     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. Zmień wartość parametru na METHODUA.

  12. Wybierz Start. Element Runbook podejmie próbę zmiany stanu zasilania maszyny wirtualnej przy użyciu nazwanej tożsamości zarządzanej przypisanej przez użytkownika. Po zakończeniu działania elementu Runbook dane wyjściowe powinny wyglądać podobnie do następujących:

    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
    

Czyszczenie zasobów

Aby usunąć zasoby, które nie są już potrzebne, uruchom następujący element 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

Następne kroki

W tym samouczku utworzono element runbook PowerShell w Azure Automation, w którym użyto tożsamości zarządzanej zamiast konta Uruchom jako do interakcji z zasobami. Aby zapoznać się z Runbookami przepływu pracy programu PowerShell, zobacz: