在ARM模板输出中使用条件语句生成SQL数据库连接字符串
ARM模板动态输出连接字符串实现方案
完全可以通过ARM内置的if()条件函数配合参数实现动态输出,具体实现步骤如下:
第一步:先定义身份验证方式参数
在模板的parameters段新增如下参数,限制可选值避免非法输入:
"parameters": { "authentication_method": { "type": "string", "allowedValues": [ "SQLAuth", "ADPassword", "ADIntegrated" ], "metadata": { "description": "选择SQL数据库的身份验证方式" } }, // 保留你原来的其他参数,比如serverName、dbnameName等 }
第二步:改造outputs段实现动态输出
用嵌套的if()函数做分支判断,同时修正你原有代码里的语法错误(比如AD集成连接字符串的拼接错误、引号转义问题),示例代码如下:
"outputs": { "SqlConnectionString": { "type": "object", "value": { "type": "string", "value": "[if(equals(parameters('authentication_method'), 'SQLAuth'), concat('Server=tcp:', reference(parameters('serverName')).fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('dbnameName'), ';Persist Security Info=False;User ID=', reference(parameters('serverName')).administratorLogin, ';Password=', reference(parameters('serverName')).administratorLoginPassword, ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;'), if(equals(parameters('authentication_method'), 'ADPassword'), concat('Server=tcp:', reference(parameters('serverName')).fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('dbnameName'), ';Persist Security Info=False;User ID=', reference(parameters('serverName')).administratorLogin, ';Password=', reference(parameters('serverName')).administratorLoginPassword, ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication=\"Active Directory Password\";'), concat('Server=tcp:', reference(parameters('serverName')).fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('dbnameName'), ';Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication=\"Active Directory Integrated\";Connection Timeout=30;') ) )]" } } }
针对多数据库数组场景的优化建议
如果你是用copy循环批量创建多个数据库,可以把动态拼接逻辑封装成变量,再配合循环输出所有数据库的连接字符串即可:
- 先在variables段定义连接字符串拼接的通用逻辑,减少重复代码
- outputs段用copy循环输出每个数据库对应的连接字符串
额外优化建议
如果最终要把连接字符串存入Key Vault,推荐直接在ARM模板中新增Key Vault机密的资源声明,直接把生成的连接字符串写入KV,不需要通过outputs返回,避免敏感信息在部署日志中泄露。
内容的提问来源于stack exchange,提问作者kat
相关产品推荐
相关产品推荐

