能否用单ARM模板结合参数文件分别部署Azure MySQL与PostgreSQL?
这个方案完全可行!ARM模板的条件部署功能刚好能解决你的需求,我来给你梳理具体怎么调整模板和参数文件:
1. 先给模板加个「数据库类型」参数
首先在deploy.json的parameters节点里新增一个参数,用来指定要部署的数据库类型,限制只能选MySQL或PostgreSQL:
"parameters": { "databaseType": { "type": "string", "allowedValues": [ "MySQL", "PostgreSQL" ], "metadata": { "description": "指定本次要部署的数据库类型:MySQL或PostgreSQL" } }, // 这里保留你原本的所有参数,比如MySQL服务器名、PostgreSQL管理员账号之类的 }
2. 给两个数据库资源加部署条件
接下来在resources数组里,分别给MySQL和PostgreSQL资源加上condition属性,只有当参数匹配时才会部署对应的资源:
MySQL资源的条件配置
{ "type": "Microsoft.DBforMySQL/servers", "apiVersion": "2020-01-01", "name": "[parameters('mysqlServerName')]", "location": "[parameters('location')]", "condition": "[equals(parameters('databaseType'), 'MySQL')]", // 仅当指定MySQL时部署 "properties": { // 你的MySQL服务器原有配置,比如管理员用户名、密码、版本等 } }
PostgreSQL资源的条件配置
{ "type": "Microsoft.DBforPostgreSQL/servers", "apiVersion": "2020-01-01", "name": "[parameters('postgreSqlServerName')]", "location": "[parameters('location')]", "condition": "[equals(parameters('databaseType'), 'PostgreSQL')]", // 仅当指定PostgreSQL时部署 "properties": { // 你的PostgreSQL服务器原有配置 } }
3. 配置两个参数文件
接下来创建两个独立的参数文件,分别指定对应的数据库类型:
PostgreSQL参数文件(比如params-postgre.json)
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "databaseType": { "value": "PostgreSQL" }, // 这里只需要填PostgreSQL相关的参数值,比如postgreSqlServerName、管理员账号等 // MySQL的参数可以完全省略,因为条件不满足时ARM不会校验它们 } }
MySQL参数文件(比如params-mysql.json)
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "databaseType": { "value": "MySQL" }, // 这里只需要填MySQL相关的参数值 // PostgreSQL的参数可以省略 } }
4. 部署时指定对应参数文件
最后部署的时候,用对应的参数文件就能实现只部署目标资源了:
- 部署PostgreSQL:
az deployment group create --resource-group <你的资源组名> --template-file deploy.json --parameters @params-postgre.json
- 部署MySQL:
az deployment group create --resource-group <你的资源组名> --template-file deploy.json --parameters @params-mysql.json
额外注意点
- 如果模板里还有依赖这两个数据库的其他资源(比如防火墙规则),记得也要给这些资源加上对应的
condition,避免部署时因为依赖资源不存在而报错 - 可以在
outputs节点也添加条件,只输出当前部署的数据库的信息,比如FQDN,这样部署完成后只会看到对应数据库的输出
内容的提问来源于stack exchange,提问作者Mattias
相关产品推荐
相关产品推荐

