Kılavuz: Yönetilen kimliği kullanarak bir Otomasyon PowerShell runbook oluşturma

Bu öğretici, Azure Otomasyonu'da kaynaklarla etkileşime geçmek için yönetilen kimlik kullanan bir PowerShell çalışma kitabı oluşturma konusunda size yol gösterir. PowerShell runbook'ları Windows PowerShell'i temel alır. Microsoft Entra ID yönetilen kimliği, runbook'unuzun diğer Microsoft Entra korumalı kaynaklara kolayca erişmesini sağlar.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Yönetilen kimliklere izin atama
  • PowerShell runbook’u oluşturun

Azure aboneliğiniz yoksa başlamadan önce free hesabı oluşturun.

Önkoşullar

Yönetilen kimliklere izin atamadan önce şu önkoşulları karşıladığınızdan emin olun:

Yönetilen kimliklere izin atama

Sanal makineyi durdurmalarına ve başlatmalarına izin vermek için yönetilen kimliklere izinler atayın.

Yönetilen kimliklere izin atamak için şu adımları izleyin:

  1. Connect-AzAccount cmdlet'ini kullanarak etkileşimli olarak Azure oturum açın ve yönergeleri izleyin:

    # 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. Aşağıdaki değişkenler için uygun bir değer girin ve betiği yürütün.

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. Sistem tarafından atanan yönetilen kimliğe rol atamak için New-AzRoleAssignment PowerShell cmdlet'ini kullanın.

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. Kullanıcı atamalı yönetilen kimlik için aynı rol ataması gerekir.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. Bu öğreticide kullanılan cmdlet'leri yürütmek için Get-AzUserAssignedIdentity ve Get-AzAutomationAccount sistem tarafından atanan yönetilen kimlik için ek izinler gereklidir.

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

PowerShell runbook’u oluşturma

Yönetilen kimliklerden herhangi biri tarafından yürütülmesine izin verecek bir runbook oluşturun. Runbook durdurulmuş bir VM'yi başlatır veya çalışan bir VM'yi durdurur.

PowerShell runbook'u oluşturmak için şu adımları izleyin:

  1. Azure portalında oturum açın ve Otomasyon hesabınıza gidin.

  2. Genel Bakış sayfasında, eğer yeni deneyimde değilseniz Çalışma Zamanı Ortamı deneyimini deneyin seçeneğini seçin.

  3. İşlem Otomasyonu altında Runbook'ları seçin.

  4. Runbook oluştur seçeneğini seçin ve aşağıdakileri yapın:

    1. Runbook'u miTesting olarak adlandırın.
    2. Runbook türü açılan listesinden PowerShell'i seçin.
    3. Çalışma Zamanı Ortamı açılan listesinden var olan çalışma zamanı ortamını seçin veya Çalışma Zamanı PowerShell ve sürüm 7.4 ile çalıştırmak için yeni oluştur seçeneğini seçin.
    4. Uygun bir Açıklama girin.
  5. 'Oluştur'u seçin ve runbook'u oluşturun.

  6. Runbook düzenleyicisine aşağıdaki kodu yapıştırın:

    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. Düzenleyicide, 8. satırda değişkenin değerini gerektiği gibi düzeltin $automationAccount .

  8. Kaydet'i ve ardından Test bölmesini seçin.

  9. Parametreleri RESOURCEGROUP ve VMNAME uygun değerlerle doldurun. SA parametresi için METHOD ve xUAMI parametresi için UAMI girin. Runbook, sistem tarafından atanan yönetilen kimliği kullanarak VM'nizin güç durumunu değiştirmeye çalışır.

  10. Başlat'ı seçin. Runbook tamamlandıktan sonra çıktı aşağıdakine benzer görünmelidir:

     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. parametresinin METHOD değerini olarak UAdeğiştirin.

  12. Başlat'ı seçin. Runbook, kullanıcı tarafından atanan adlandırılmış yönetilen kimliği kullanarak VM'nizin güç durumunu değiştirmeye çalışır. Runbook tamamlandıktan sonra çıktı aşağıdakine benzer görünmelidir:

    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
    

Kaynakları Temizleme

Artık gerekli olmayan kaynakları kaldırmak için aşağıdaki runbook'u çalıştırın:

#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

Sonraki adımlar

Bu öğreticide, kaynaklarla etkileşime geçmek için Çalıştırma Olarak Hesabı yerine yönetilen kimlik kullanan Azure Otomasyonu PowerShell çalıştırma kitabı oluşturdunuz. PowerShell İş Akışı runbook'larına göz atın: