【问题标题】:Azure CLI ARM parameters json using variables to retrieve keyvault secretsAzure CLI ARM 参数 json 使用变量检索 keyvault 机密
【发布时间】:2019-06-11 10:37:39
【问题描述】:

我们创建了一个 bash 脚本来部署基于 Azure CLI 和 ARM 模板的 Azure 基础架构。

我们还使用 keyvault 来存储我们的秘密,我们在部署资源时需要它作为参考。

示例(这适用于参数 json 中的静态值):

templateUri="armdeploymysql.json"
az group deployment create \
    --name $Environment \
    --resource-group $RSGName \
    --template-file $templateUri \
    --parameters @armdeploymysql-parameters.json

在 armdeploymysql-parameters.json 中你会发现:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "administratorLogin": {
            "value": "termysqladmin"
        },
        "administratorLoginPassword": {
            "reference": {
              "keyVault": {
                "id": "/subscriptions/xxx-xxx-xxx-xxx--xx/resourceGroups/resourcegroupname/providers/Microsoft.KeyVault/vaults/keyvaultname"
              },
              "secretName": "WORDPRESSDBPASSWORD"
            }
        },

如您所见,我们使用的是静态值。但是我们需要为多个环境(Test、Acc 和 Prod)部署这个模板,所以我们希望使用变量而不是静态值。

它适用于大多数 ARM 参数,我们使用如下配置:

templateUri="armdeploymysql.json"
az group deployment create \
    --name $Environment \
    --resource-group $RSGName \
    --template-file $templateUri \
    --parameters "version=$version" \
                 "location=$location" \
                 "administratorLogin=$SQLAdmin" \
                 "administratorLoginPassword=$SQLPass"

所以问题是:

  1. 我们能否像上一个示例一样进行参数引用以指向密钥库?
  2. 如何解析参数json中的变量?

【问题讨论】:

    标签: json azure azure-cli


    【解决方案1】:

    您为什么不使用 az 获取秘密,然后将其传递给您的模板。

    WpPwd = az keyvault secret show --vault-name "keyvaultname" --name "WORDPRESSDBPASSWORD"
    
    templateUri="armdeploymysql.json"
    az group deployment create \
        --name $Environment \
        --resource-group $RSGName \
        --template-file $templateUri \
        --parameters "version=$version" \
                     "location=$location" \
                     "administratorLogin=$SQLAdmin" \
                     "administratorLoginPassword=$SQLPass"
                     "wordpresspassword=$WpPwd"
    

    【讨论】:

    • 不幸的是,这不起作用:az keyvault key show --vault-name "keyvaultname" --name "WORDPRESSDBPASSWORD" 找不到密钥:WORDPRESSDBPASSWORD 此命令检索密钥而不是密钥。我也找不到检索秘密的命令。
    • 这似乎有效:az keyvault secret show --vault-name "keyvaultname" --name "WORDPRESSDBPASSWORD" :D
    • 这样更好:az keyvault secret show --vault-name "keyvaultname" --name "WORDPRESSDBPASSWORD" --query value
    • 谢谢。我很快就写好了,很抱歉弄乱了我的钥匙和秘密!我已经相应地更新了答案。
    【解决方案2】:

    这个特定案例的最终修复(感谢@Murray Foxcroft),来自代码的sn-p:

    keyVaultName="keyvaultname-$Environment"
    keyVaultsecret="WORDPRESSDBPASSWORD"
    SQLPass=$(az keyvault secret show --vault-name $keyVaultName --name $keyVaultsecret --query value -o tsv)
    
    az group deployment create \
        --name $Environment \
        --resource-group $RSGName \
        --template-file $templateUri \
        --parameters "version=$version" \
                     "location=$location" \
                     "administratorLogin=$SQLAdmin" \
                     "administratorLoginPassword=$SQLPass" \
    

    -o tsv 对于避免添加普通命令传递给变量的额外字符很重要。

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2022-01-22
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多