Как добавить агенту новую возможность динамического обнаружения?
Обновления
Я собираюсь предложить поставщика возможностей здесь в качестве обновления моего сообщения. Если вам нужна дополнительная информация, дайте мне знать.
В настоящее время у нас есть несколько поставляемых поставщиков возможностей в исходном коде агента:
- Агент
- Среда
- Nix
- PowerShell
Предлагается еще один поставщик, названный ExecutableCapabilitiesProvider
.
Этот новый ExecutableCapabilitiesProvider, вероятно, будет иметь файл конфигурации, который можно будет редактировать на машине агента. Формат этого файла, вероятно, мог быть следующим:
#name,executable
pip,pip3 freeze
xyz,/usr/bin/xyz-runner
abc,sh -C "ls -l /blah/blah"
Как специалист по обслуживанию собственного пула, я бы настроил этот файл с подходящими мне записями и заставил бы агент запускать его при запуске. Таким образом, я не кодирую жестко какие-либо значения своих возможностей, а скорее определяю их при запуске.
И я бы пошел еще дальше и добавил новый вызов API для добавления возможностей, который является более гибким, чем текущий, запрашивающий имя / значения. Например, можно изменить параметры наName, Provider, Params
:
efg, NixProvider, /path/to/file/efg
klm, ExecutableCapabilitiesProvider, /usr/bin/klm -a -b -c
Исходный пост
Я бы хотел, чтобы мои агенты сообщали о новых возможностях, которые не являются статическими, а являются результатом выполнения команды или чего-то подобного? Как я могу это сделать? Наши агенты работают на Linux-боксах. Чтобы быть конкретным, я хотел бы иметь новую возможность под названиемpip-packages
и значение для этого является результатом команды pip freeze
выполнен на оболочке.
1 ответ
Если вы хотите добавить возможности, определяемые пользователем, вы можете написать сценарий для вызова REST API для обновления возможностей агента.
PUT https://dev.azure.com/{organization}/_apis/distributedtask/pools/{poolid}/agents/{agentid}/usercapabilities?api-version=5.0
Request body:
{"pip-packages": "xxxx"}
Например, вы можете установить переменную и запустить команду pip freeze
и экспортируйте ответ как значение этой переменной, затем обновите возможности агента, вызвав REST API:
Ниже образец PowerShell для справки:
Param(
[string]$collectionurl = "https://dev.azure.com/{organization}",
[string]$poolid = "14",
[string]$agentid = "16",
[string]$user = "user",
[string]$token = "PAT/Password"
)
# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
# Run pip freeze command and get response as the value of the variable $pipfreeze (Just for your reference here, you need to extract the value with running the commands)
$pipfreeze = "response of pip freeze"
# Create json body with that value
$baseUri = "$collectionurl/_apis/distributedtask/pools/$poolid/agents/$agentid/usercapabilities?api-version=5.0"
function CreateJsonBody
{
$value = @"
{"pip-packages":"$pipfreeze"}
"@
return $value
}
$json = CreateJsonBody
# Update the Agent user capability
$agentcapability = Invoke-RestMethod -Uri $baseUri -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
write-host "=========================================================="
Write-host "userCapabilities :" $agentcapability.userCapabilities.'pip-packages'
write-host "=========================================================="