Руководство. Создание модуля runbook PowerShell для службы автоматизации с помощью управляемого удостоверения

В этом руководстве описывается создание последовательности runbook PowerShell в службе автоматизации Azure. Для взаимодействия с ресурсами эта последовательность использует управляемые удостоверения, а не учетную запись запуска от имени. Модули Runbook PowerShell используют Windows PowerShell. Управляемое удостоверение от Azure Active Directory (Azure AD) позволяет приложению легко получать доступ к другим ресурсам, защищенным Azure AD.

В этом руководстве описано следующее:

  • Назначение разрешений управляемым удостоверениям
  • Создание модуля runbook в PowerShell

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

Предварительные требования

Назначение разрешений управляемым удостоверениям

Назначьте разрешения управляемым удостоверениям, чтобы они могли запускать и останавливать виртуальную машину.

  1. Войдите в Azure в интерактивном режиме с помощью командлета Connect-AzAccount и следуйте инструкциям.

    # 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. Укажите соответствующие значения для перечисленных ниже переменных, а затем выполните скрипт.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Примените командлет PowerShell New-AzRoleAssignment, чтобы назначить роль управляемому удостоверению, назначаемому системой.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. Для управляемого удостоверения, назначаемого пользователем, нужно создать такое же назначение роли.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Для выполнения командлетов Get-AzUserAssignedIdentity и Get-AzAutomationAccount, которые используются в этом руководстве, управляемое удостоверение, назначаемое системой, должно иметь дополнительные разрешения.

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

Создание модуля Runbook PowerShell

Создайте runbook с возможностью выполнения любым из наших управляемых удостоверений. Эта последовательность runbook будет запускать виртуальную машину, если она остановлена, или останавливать, если виртуальная машина работает.

  1. Войдите на портал Azure перейдите к учетной записи службы автоматизации.

  2. В разделе Автоматизация процессов щелкните Модули Runbook.

  3. Нажмите кнопку Создать Runbook.

    1. Присвойте новому модулю runbook имя miTesting.
    2. В раскрывающемся меню Тип runbook выберите PowerShell.
    3. В раскрывающемся списке Версия среды выполнения выберите 7.1 (предварительная версия) или 5.1.
    4. Введите соответствующее описание.
  4. Щелкните Создать, чтобы создать runbook.

  5. В редакторе runbook вставьте следующий код:

    Param(
     [string]$resourceGroup,
     [string]$VMName,
     [string]$method,
     [string]$UAMI 
    )
    
    $automationAccount = "xAutomationAccount"
    
    # Ensures you do not inherit an AzContext in your runbook
    Disable-AzContextAutosave -Scope Process | Out-Null
    
    # Connect using a Managed Service Identity
    try {
            $AzureContext = (Connect-AzAccount -Identity).context
        }
    catch{
            Write-Output "There is no system-assigned user identity. Aborting."; 
            exit
        }
    
    # set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
        -DefaultProfile $AzureContext
    
    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
            if ((Get-AzAutomationAccount -ResourceGroupName $resourceGroup `
                    -Name $automationAccount `
                    -DefaultProfile $AzureContext).Identity.UserAssignedIdentities.Values.PrincipalId.Contains($identity.PrincipalId))
                {
                    $AzureContext = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context
    
                    # set and store context
                    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
                }
            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. В редакторе измените значение для переменной $automationAccount в строке 8, если необходимо.

  7. Щелкните Сохранить и Тестовая область.

  8. Заполните параметры RESOURCEGROUP и VMNAME соответствующими значениями. Введите SA для параметра METHOD и xUAMI для параметра UAMI. Runbook попытается изменить состояние работы указанной виртуальной машины, используя управляемое удостоверение, назначаемое системой.

  9. Щелкните Запуск. После завершения работы runbook возвращает примерно такие выходные данные:

     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. Для параметра METHOD укажите новое значение UA.

  11. Щелкните Запуск. Runbook попытается изменить состояние работы указанной виртуальной машины, используя управляемое удостоверение, назначаемое пользователем. После завершения работы runbook возвращает примерно такие выходные данные:

    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
    

Очистка ресурсов

Чтобы удалить все ресурсы, которые вам не нужны, выполните следующую последовательность 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

Дальнейшие действия

В этом руководстве вы создали модуль Runbook PowerShell в служба автоматизации Azure, который использовал управляемое удостоверение, а не учетную запись запуска от имени для взаимодействия с ресурсами. Дополнительные сведения о runbook рабочих процессов PowerShell см. в следующей статье: