Как проверить, существует ли ключ с данным именем в хранилище ключей?

У меня есть хранилище ключей с именем myKeyVault, и внутри может быть ключ с именем myKey. Я читаю документацию по Azure CLI: https://docs.microsoft.com/en-us/cli/azure/keyvault/key?view=azure-cli-latest#az_keyvault_key_list, но я не могу понять, как проверить, ключ с данным именем действительно существует.

Если я пойду с этим:

az keyvault key show --vault-name myKeyVault --name keythatdoesntexist Я получаю сообщение об ошибке ResourceNotFoundError: (KeyNotFound), но мне нужно получить значение true или false, если ключ существует.


person Yoda    schedule 27.11.2020    source источник
comment
Команда CLI не вернет вам логическое значение. Вам нужно судить себя. Возможно, лучше использовать list и проверить, есть ли данное имя в списке.   -  person Charles Xu    schedule 30.11.2020


Ответы (3)


Нет прямого API «если существует». Но один простой способ — просто записать вывод az keyvault key show --vault-name myKeyVault --name keythatdoesntexist в переменную и проверить null. Ниже приведен пример в powershell.

$key = az keyvault key show --vault-name myKeyVault --name keythatdoesntexist
if ($key -ne $null) {
  write-host 'Exists'
}
else {
  write-host 'Does not exist'
}
person krishg    schedule 27.11.2020
comment
Если ключ не найден, выдает ошибку KeyNotFound - person Yoda; 27.11.2020
comment
Ошибка печатается в консоли. Но если ваша цель программно сделать что-то на основе того, существует ли ключ или нет, код в моем ответе работает нормально, и ошибка не останавливает выполнение. Просто если какой-то красный текст вас сильно напрягает, это другое дело :). - person krishg; 27.11.2020

Вы можете попробовать ниже

#To suppress the error
$ErrorActionPreference= 'silentlycontinue'

#if($(output), exists,not exists)

If($(az keyvault key show --vault-name YOURVAULTNAME --name YOURKEYNAME))
{
$exist = True
write-host 'Exists'
}
else

{
$exist = False
write-host 'Not Exists'
}
#Setting the ErrorActionPrefence to the Default
$ErrorActionPreference= 'Continue'
person Satya V    schedule 27.11.2020
comment
@Yoda - помог ли описанный выше подход? - person Satya V; 30.11.2020

Хотя вышеперечисленные способы могут работать, но это делается путем проверки null значения, возвращаемого неудачной командой az keyvault show <none existent secret>, я считаю, что следующий способ является лучшим способом справиться с этим сценарием, особенно в автоматизированных конвейерах инфра-релиза.

# get Command Line Args
keyVaultName=$1
secretName=$2

# Check if secret exists
secret_exists=$(az keyvault secret list --vault-name $keyVaultName --query "contains([].id, 'https://$keyVaultName.vault.azure.net/secrets/$secretName')")


if [ $secret_exists == true ]; then
    echo "Secret '$secretName' exists! fetching..."
    secret_val=$(az keyvault secret show --name $secretName --vault-name $keyVaultName --query "value")
    echo "##vso[task.setvariable variable=ssh_value]$secret_val"
else
    echo "Secret '$secretName' do not exist! creating..."
    ssh-keygen  -f ~/.ssh/id_rsa_infra -q -P ""
    ssh_value=$(<~/.ssh/id_rsa_infra.pub)
    echo "##vso[task.setvariable variable=ssh_value]$ssh_value"
    az keyvault secret set --vault-name $keyVaultName --name $secretName -f ~/.ssh/id_rsa_infra.pub >/dev/null
fi
person Roozbeh    schedule 14.07.2021
comment
ОБНОВЛЕНИЕ: для автоматических конвейеров используйте -o tsv, чтобы избавиться от кавычек secret_val=$(az keyvault secret show --name $secretName --vault-name $keyVaultName --query "value") -o tsv - person Roozbeh; 14.07.2021