Azure DevOps - пользовательская задача - PowerShell с аутентификацией Azure

До сих пор я использовал задачу Azure PowerShell для выполнения сценариев PowerShell в контексте Azure ( https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-powershell?view=vsts). Из-за усилий по обобщению я хочу теперь создать пользовательское задание (см., Например, http://www.donovanbrown.com/post/how-do-i-upload-a-custom-task-for-build), которое запускает скрипт PowerShell в контексте Azure, т. е. проверяет подлинность на конечной точке подключения в DevOps Azure.

Как мне этого добиться?

1 ответ

Решение

Прежде всего вам нужен участник службы (см., Например, https://docs.microsoft.com/en-us/powershell/azure/create-azure-service-principal-azureps?view=azps-1.1.0) и служба подключение (см., например, https://docs.microsoft.com/en-us/azure/devops/pipelines/library/connect-to-azure?view=vsts).

В пользовательской задаче в task.json Добавьте вход, чтобы иметь возможность выбрать подключение к услуге:

"inputs": [
        {
            "name": "ConnectedServiceName",
            "type": "connectedService:AzureRM",
            "label": "Azure RM Subscription",
            "defaultValue": "",
            "required": true,
            "helpMarkDown": "Select the Azure Resource Manager subscription for the deployment."
        }
]

В задаче (скрипт powershell) вы получаете этот ввод через

$serviceNameInput = Get-VstsInput -Name ConnectedServiceNameSelector -Default 'ConnectedServiceName'
$serviceName = Get-VstsInput -Name $serviceNameInput -Default (Get-VstsInput -Name DeploymentEnvironmentName)

Затем подтвердите:

try {
    $endpoint = Get-VstsEndpoint -Name $serviceName -Require
    if (!$endpoint) {
        throw "Endpoint not found..."
    }
    $subscriptionId = $endpoint.Data.SubscriptionId
    $tenantId = $endpoint.Auth.Parameters.TenantId
    $servicePrincipalId = $endpoint.Auth.Parameters.servicePrincipalId
    $servicePrincipalKey = $endpoint.Auth.Parameters.servicePrincipalKey

    $spnKey = ConvertTo-SecureString $servicePrincipalKey -AsPlainText -Force
    $credentials = New-Object System.Management.Automation.PSCredential($servicePrincipalId,$spnKey)

    Add-AzureRmAccount -ServicePrincipal -TenantId $tenantId -Credential $credentials
    Select-AzureRmSubscription -SubscriptionId $subscriptionId -Tenant $tenantId

    $ctx = Get-AzureRmContext
    Write-Host "Connected to subscription '$($ctx.Subscription)' and tenant '$($ctx.Tenant)'..."
} catch {
    Write-Host "Authentication failed: $($_.Exception.Message)..." 
}

Редактировать:

Полезно очистить контекст в начале и конце скрипта. Вы можете сделать это через

Clear-AzureRmContext -Scope Process
Disable-AzureRmContextAutosave

в начале и

Disconnect-AzureRmAccount -Scope Process
Clear-AzureRmContext -Scope Process

в конце.

Другие вопросы по тегам