Azure CLI ARM参数json使用变量来检索密钥库机密

时间:2019-01-17 09:07:37

标签: json azure azure-cli

我们已经创建了一个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"
            }
        },

如您所见,我们正在使用静态值。但是我们需要将该模板部署到多个环境(测试,加速和生产),因此我们想使用变量而不是静态值。

它适用于大多数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中的变量?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

针对此特定情况的最终修正(归功于@Murray Foxcroft),代码中的摘录:

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对于避免添加普通命令传递给变量的多余字符很重要。

感谢您的帮助!