无法在同一ARM模板部署

时间:2018-02-02 22:27:41

标签: azure azure-resource-manager azure-keyvault arm-template

作为部署的一部分我正在做我想要将Key保险库部署到资源组,创建一些秘密,然后使用其中一个秘密作为管理员密码将SQL服务器部署到另一个资源组。以下是我用来执行此操作的资源片段:

{
  "type": "Microsoft.KeyVault/vaults",
  "name": "[variables('KeyVaultName')]",
  "apiVersion": "2015-06-01",
  "location": "[resourceGroup().location]",
  "properties": {
    "enabledForTemplateDeployment": "true",
    "accessPolicies": "[variables('KeyVaultAccessPolicies')]",
    "tenantId": "[parameters('TenantId')]",
    "sku": {
      "name": "Standard",
      "family": "A"
    }
  }
},
{
  "type": "Microsoft.KeyVault/vaults/secrets",
  "name": "[concat(variables('KeyVaultName'), '/secretname')]",
  "apiVersion": "2015-06-01",
  "properties": {
    "value": "<a randomised value>"
  },
  "dependsOn": [
    "[concat('Microsoft.KeyVault/vaults/', variables('KeyVaultName'))]"
  ]
},
{
  "apiVersion": "2017-05-10",
  "name": "deploy",
  "type": "Microsoft.Resources/deployments",
  "resourceGroup": "<another resource group>",
  "properties": {
    "mode": "Incremental",
    "templateLink": {
      "uri": "<my linked template>",
      "contentVersion": "1.0.0.0"
    },
    "parameters": {
      "SQLServerAdminPasswordSecretName": {
        "value": "secretname"
      }
    }
  },
  "dependsOn": [
    "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('KeyVaultName'), 'secretname')]"
  ]
}

我的链接模板也有一个类似于以下内容的部署:

{
    "apiVersion": "2017-05-10",
    "name": "sql-server-deployment",
    "type": "Microsoft.Resources/deployments",
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "<another linked tempalate>",
            "contentVersion": "1.0.0.0"
        },
        "parameters": {
            "SQLServerName": {
                "value": "[variables('SQLServerName')]"
            },
            "SQLServerAdminPassword": {
                "reference": {
                    "keyVault": {
                        "id": "[resourceId(parameters('ParentResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('ParentKeyVaultName'))]"
                    },
                    "secretName": "[parameters('SQLServerAdminPasswordSecretName')]"
                }
            }
        }
    }
}

此引用目前正在杀死我的整个部署:

  

&#34;指定的KeyVault&#39; / subscriptions / [订阅   id] / resourceGroups / [父资源   group] /providers/Microsoft.KeyVault/vaults/ [my keyvault]&#39;不可能   实测值&#34;

如果我删除链接模板中的Keyvault参考,则错误消失。

令我感到困惑的是,链接模板部署依赖于密钥保管库密钥,而密钥保管库密钥又依赖于密钥保管库,但没有任何部署,因为密钥保管库引用正试图在其他任何事情之前解决。 / p>

我是否遗漏了一些明显的东西,或者这是ARM模板中的缺陷?

提前致谢

1 个答案:

答案 0 :(得分:0)

参数引用在&#34; compile&#34;时间(即验证),因此在验证模板时确实需要存在库。您可能能够通过嵌套几个级别并使用嵌套部署中的输出引用来解决此问题。你需要做这样的事情:

  • 嵌套保险库设置并输出vaultId
  • 将SQL Server部署嵌套到&#34;级别1&#34;嵌套
  • 在上述项目符号的参数中,参考步骤1中的输出
  • 使用参数引用嵌套另一个部署,该参数引用是从&#34; level 1&#34;中的vaultId构建的。嵌套

那就是说,我对您为什么要这样做感兴趣...通常,保险库参考用于保留纯文本/ json的秘密。由于您将秘密值传递到顶级部署,因此您已拥有该值。因为你已经拥有它,所以没有理由从保险库中引用它......