带有 KeyVault 的 ARM 模板 - SQL 与 VM

ARM Template with KeyVault - SQL vs. VM

我有一个 Azure ARM 模板,它创建了一个 SQL 服务器和一个 VM。两者都参考 KeyVault 以获取管理员密码:

"resources": [
    {
      "type": "Microsoft.Sql/servers",
      "kind": "v12.0",
      "name": "[variables('vSqlServerName')]",
      "tags": {
        "Environment": "[parameters('pEnvironment')]",
        "DisplayName": "SQL Server",
        "UDID": "SQLServer" // Unique Deployment ID (for later reference) 
      },
      "apiVersion": "[variables('vSqlAPIVersion')]",
      "location":  "[resourceGroup().location]",
      "properties": {
        "administratorLogin": "[variables('vSqlAdminUser')]",
        "administratorLoginPassword":{
        "reference": {
          "keyVault": {
            "id": "[concat(resourceGroup().id, '/providers/Microsoft.KeyVault/vaults/', variables('vKeyVaultName'))]"
          },
          "secretName": "SQLDW-AdminPassword"
        }
      },
        "version": "12.0"
      },
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[concat(variables('vSqlVMName'), variables('vSuffixVM'))]",
      "apiVersion": "2015-06-15",
      "location": "[resourceGroup().location]",
      "properties": {
        "hardwareProfile": {
          "vmSize": "Standard_DS5_v2"
        }
        "osProfile": {
          "computerName": "[variables('vSqlVMName')]",
          "adminUsername": "[variables('vWinAdminUser')]",
          "windowsConfiguration": {
            "provisionVMAgent": true,
            "enableAutomaticUpdates": true
          },
          "secrets": [],
          "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "[concat(resourceGroup().id, '/providers/Microsoft.KeyVault/vaults/', variables('vKeyVaultName'))]"
              },
              "secretName": "VM-LocalAdminPassword"
            }
          }
        }
    }
]

这适用于 SQL,但不适用于 VM 我得到的错误是这样的: { 11:16:27 - [错误] "target": "vm.properties.osProfile.adminPassword", 11:16:27 - [错误] "message":“解析值时遇到意外字符:{。 11:16:27 - [错误] 路径 'properties.osProfile.adminPassword',第 1 行,位置 785。” 11:16:27 - [错误] },

您肯定不能直接在带有 VM 的模板中使用 Key Vault 引用。所以你必须为此使用一个参数文件。

因此在您的参数文件中您将拥有:

...
"adminPassword": {
    "reference": {
        "keyVault": {
            "id": "/subscriptions/{}/resourceGroups/{}/providers/Microsoft.KeyVault/vaults/{}"
        },
        "secretName": "secretName"
    }
},
...

并在模板中:

"osProfile": {
  "computerName": "[variables('vSqlVMName')]",
  "adminUsername": "[variables('vWinAdminUser')]",
  "windowsConfiguration": {
    "provisionVMAgent": true,
    "enableAutomaticUpdates": true
  },
  "secrets": [],
  "adminPassword": "[parameters('adminPassword')]"
}

并且您可以使用参数文件为部署提供参数,或者,您可以将 VM 部署转换为嵌套模板部署,这样您就可以直接从父模板传递参数,而无需参数文件。

参考this example。它不涉及虚拟机,但想法是一样的。