Невозможно создать пул Azure Devops через API, нулевой параметр

Я пытаюсь создать самостоятельный пул Azure Devops из CLI с помощью powershell...

Предполагается, что целевой пул будет использоваться для уже подготовленного масштабируемого набора виртуальных машин.

Пытаюсь следовать документам здесь: https://learn.microsoft.com/en-us/rest/api/azure/devops/distributedtask/pools/add?view=azure-devops-rest-7.1

до сих пор у меня есть

$org = "myorg"
$pat = "MY_PAT"
$headers = @{
    Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))
}
$url = "https://dev.azure.com/$org/_apis/distributedtask/pools?api-version=7.1-preview.1"

$body = @{
    autoProvision = $false  
    autoSize      = $true   
    autoUpdate    = $true   

    options       = "elasticPool, singleUseAgents"

    owner         = @{
        displayName = "My Name"  # Example value, replace with your actual value
        id          = "MY_ID"      # Example value, replace with your actual value
        uniqueName  = "[email protected]"  # Example value, replace with your actual value
    }
    isHosted =  $false
    isLegacy = $false
    pool = "myPool"

    name          = "NewAgentPool"  # Example value, replace with your actual value
    poolType      = "automation"  # Example value, replace with your actual value
    scope = "my-scope"  # of the form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX

    size          = 1  # Example value, replace with your actual value
}

когда я запускаю его, я получаю ошибку

 Invoke-RestMethod -Uri $url -Headers $headers -Method Post  `
                             -Body ($body | ConvertTo-Json) `
                             -ContentType "application/json"
Invoke-RestMethod:
{
  "$id": "1",
  "innerException": null,
  "message": "Value cannot be null.\r\nParameter name: pool",
  "typeName": "System.ArgumentNullException, mscorlib",
  "typeKey": "ArgumentNullException",
  "errorCode": 0,
  "eventId": 0
}

Керлинг с теми же аргументами показывает код состояния ответа 400.

Я не вижу упоминания о параметре «Пул» в документации, поэтому я немного не понимаю, куда идти дальше. Есть «poolType» и «name»... но нет «pool».

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

после некоторой отладки с помощью Curl проходит простое тело json, подобное следующему, но не связывается ни с каким проектом, а только с организацией

{
  "autoProvision": false,
  "name": "myvmsspool5",
  "poolType": "automation",
  "options": "elasticPool"
}

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

Редактировать 2: Кажется, API не предоставляет возможности настройки параметров пула

Я могу создать пул, но не могу назначить ему ни соединение службы, ни масштабируемый набор виртуальных машин через API.

Редактировать 4: Кажется, правильной абстракцией для настройки является «Эластичный пул», как описано здесь: https://registry.terraform.io/providers/microsoft/azuredevops/latest/docs/resources/elastic_pool

Затем мне нужно было прикрепить его к моему проекту с помощью объекта Agent_Queue.

🤔 А знаете ли вы, что...
PowerShell предоставляет доступ к средствам шифрования для обеспечения безопасности данных.


75
1

Ответ:

Решено

Учитывая требование по настройке собственного пула агентов VMSS, вместо этого нам следует использовать этот API. Для этой операции необходимо использовать подключение к службе Azure Resource Manager для аутентификации доступа к ресурсу VMSS в подписке Azure.

Ниже приведен пример для справки, предполагающий, что вы создали ресурс ARM service connection и VMSS в Azure. Обратите внимание, что $serviceEndpointId — это идентификатор ресурса ARM service connection, по которому мы аутентифицируем доступ к ресурсу VMSS в подписке Azure, а $serviceEndpointScope обычно является идентификатором проекта , где генерируется подключение к службе ARM.

#Elasticpools - Create POST https://dev.azure.com/{organization}/_apis/distributedtask/pools?api-version=7.1-preview.1

$organization = "TheAzureDevOpsOrgName"
$MyPat = 'xxxxxx'
$B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$MyPat"))
$poolName= "AZVMSSPool"
$serviceEndpointId = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee' # The resource Id of the ARM service connection, against which we authenticate access to the VMSS resource in Azure subscription
$serviceEndpointScope = 'pppppppp-pppp-pppp-pppp-pppppppppppp' # Typically the Id of the project where the ARM service connection is generated

$azureSubId = "ssssssss-ssss-ssss-ssss-ssssssssssss"
$vmssResourceId = "/subscriptions/$azureSubId/resourceGroups/RG-AZVM-LINUX/providers/Microsoft.Compute/virtualMachineScaleSets/azvmss-ubuntu-22.04"

$URL = "https://dev.azure.com/$organization/_apis/distributedtask/elasticpools?poolName=$poolName&authorizeAllPipelines=true&autoProvisionProjectPools=true&api-version=7.1-preview.1"

$headers = @{
    'Authorization' = 'Basic ' + $B64Pat
    'Content-Type' = 'application/json'
}

$body = @{
    agentInteractiveUI = $false
    azureId = $vmssResourceId
    desiredIdle = 0
    maxCapacity = 1
    osType = 1
    maxSavedNodeCount = 0
    recycleAfterEachUse = $false
    serviceEndpointId = $serviceEndpointId
    serviceEndpointScope = $serviceEndpointScope
    timeToLiveMinutes = 30
} | ConvertTo-Json

$response = Invoke-RestMethod -Method Post -Uri $URL -Headers $headers -Body $body
$response | ConvertTo-Json -Depth 10

# Projects - List GET https://dev.azure.com/{organization}/_apis/projects?api-version=7.1-preview.4
$projectsURL = "https://dev.azure.com/$organization/_apis/projects?api-version=7.1-preview.4"
$projects = Invoke-RestMethod -Method Get -Uri $projectsURL -Headers $headers
$projects | ConvertTo-Json -Depth 10

# Endpoints - Get GET https://dev.azure.com/{organization}/{project}/_apis/serviceendpoint/endpoints/{endpointId}?api-version=7.1-preview.4
$endpointURL = "https://dev.azure.com/$organization/$project/_apis/serviceendpoint/endpoints/$serviceEndpointId?api-version=7.1-preview.4"
$endpoint = Invoke-RestMethod -Method Get -Uri $endpointURL -Headers $headers
$endpoint | ConvertTo-Json -Depth 10