带有 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。它不涉及虚拟机,但想法是一样的。
我有一个 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。它不涉及虚拟机,但想法是一样的。