#azure-devops #azure-keyvault #azure-yaml-pipelines
#azure-devops #azure-конвейеры #azure-keyvault #azure-yaml-конвейеры
Вопрос:
У меня есть хранилище ключей Azure с разными ключами (например, Key1, Key2, Key3). В некотором параметре, который динамически считывается в одной задаче конвейера, у меня есть значение, указывающее, какой ключ использовать (пусть ключевой переменной будет ‘Key2’). Как я могу прочитать секретное значение Key2 в конвейере?
Я пробовал разные комбинации, и ни одна из них не работает для меня.
Тестовый конвейер № 1 — использование групповой переменной, подключенной к хранилищу ключей (чтобы упростить задачу, ключевое имя здесь статично, но на самом деле оно задается с помощью сценария powershell во время конвейера):
jobs:
- job: JobA
variables:
- &roup: KeyVaultGroup #Key vault have secret values "Key1,Key2,Key3..."
- name: KeyName
value: Key2
- name: MyValue
value: $[ variables[variables.KeyName] ]
steps:
- powershell: |
Write-Host "Var1 $($env:VARENV1)"
Write-Host "Var2 $($env:VARENV2)"
env:
VarEnv1: $(MyValue)
VarEnv2: $($(KeyName))
Результатом является:
Var1
Var2 $(Key2)
myValue не работает, поскольку переменная вычисляется до загрузки переменных хранилища ключей. И когда имя ключа задается во время конвейера, это тоже не сработает (но это можно решить с помощью отдельного задания и использования выходных переменных для установки имени ключа, как в тестовом примере № 2).
Выражение $($(keyName)) не работает, поскольку оно не будет рекурсивно расширять переменную (ошибка?).
Та же проблема возникает, когда для считывания значений хранилища ключей используется задача AzureKeyVault, поскольку она запускается слишком поздно.
Тест № 2 — два отдельных задания: я использовал 2 задания — одно для чтения хранилища ключей и имени ключа (задание A), а второе для остальных (задание B). Проблема в том, что нет способа получить доступ к секретным значениям хранилища ключей, загруженным в задание A, из задания B. Я могу использовать только выходные переменные из задания A в задании B через зависимости.JobA … но задача AzureKeyVault не экспортирует значения в качестве выходных переменных. Для этого мне нужно будет использовать, например, задачу Powershell, но в этом случае мне нужно будет сопоставить секретные значения в качестве переменных среды с задачей powershell, но это означает, что я потеряю необходимую мне динамическую часть, потому что она будет сопоставлена статически (мне нужно иметь возможность добавлять / удалять значения в хранилище ключей без необходимости изменять конвейер). Это бесполезно, или я не знаю, как получить доступ к секретным переменным между заданиями без использования выходных переменных.
Вопрос: Как прочитать защищенное значение из ключа «Key2», когда Key2 сохраняется как значение переменной keyName и загружается во время конвейера?
Ответ №1:
В этом случае лучшим способом является использование задачи CLI Azure с командой azure keyvault:
- task: AzureCLI@2
inputs:
azureSubscription: 'r&-the-code-manual'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
$secretValue = az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value
echo $secretValue
Содержимое этого скрипта оценивается во время выполнения, поэтому вы можете установить keyName
непосредственно перед этой задачей, и все будет в порядке. И если вам нужно значение secret в качестве переменной, вы можете использовать команду lo&&in& для ее создания.
Самый простой способ избавиться от двойных кавычек — изменить вывод на tsv
.
$secretValue = az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv
Комментарии:
1. Просто хочу добавить, что команда az вернет значение, заключенное в двойные кавычки, это означает что-то вроде «myvalue». Это дает мне некоторое время, чтобы понять, в чем проблема … 🙂 Просто для людей, читающих это, чтобы сэкономить им немного времени…
2. @Kine Спасибо, что указали на это. Я отредактировал свой ответ, приведя пример того, как мы можем избавиться от
"
.3. Если у кого-либо возникнут какие-либо проблемы с приведенной выше командой в командной оболочке, используйте ее как secretValue=$(az keyvault secret show —vault-name tcm-kv —name $ (ключевое имя) —значение запроса -o tsv) это сработает