ARM模板如何根据参数动态配置appSettings数组
ARM模板动态生成App Service应用设置实现方案
需求说明
现有ARM模板定义了PrivateKeyCertificateThumbprint字符串参数(默认值为空),需要实现以下逻辑:
- 参数传入非空值时,向App Service的
appSettings中添加WEBSITE_LOAD_CERTIFICATES配置项,值为传入的证书指纹 - 参数为空时,不添加该配置项
- 部署过程不能清空/覆盖App Service上已有的其他应用设置
之前尝试单独声明Microsoft.Web/sites/config/appsettings子资源单独配置证书项,部署后会清空所有其他应用设置,不符合预期。
问题原因
Microsoft.Web/sites/config/appsettings资源的部署是全量覆盖行为:只要模板中声明了该资源,无论部署模式选增量还是完整,所有未写在模板配置里的应用设置都会被资源提供程序清空,因此不能用这种方式单独更新单条配置。
实现方法
直接在Microsoft.Web/sites主资源的properties.siteConfig.appSettings节点中,使用ARM模板内置的concat、if、createArray函数动态拼接配置数组,不需要单独拆分appsettings子资源。
修改后的appSettings节点配置如下:
"appSettings": "[concat( // 固定存在的基础配置项数组 createArray( { 'name': 'APPINSIGHTS_INSTRUMENTATIONKEY', 'value': '[if(empty(parameters('AppinsResourceName')), '', reference(resourceId('microsoft.insights/components/', parameters('AppinsResourceName')), '2015-05-01').InstrumentationKey)]' }, { 'name': 'ApplicationInsightsAgent_EXTENSION_VERSION', 'value': '~2' }, { 'name': 'WEBSITE_HEALTHCHECK_MAXPINGFAILURES', 'value': '5' } ), // 按参数值判断是否追加证书配置项 if( empty(parameters('PrivateKeyCertificateThumbprint')), createArray(), createArray( { 'name': 'WEBSITE_LOAD_CERTIFICATES', 'value': '[parameters('PrivateKeyCertificateThumbprint')]' } ) ) )]"
逻辑说明
- 把所有固定需要存在的应用设置放在第一个
createArray块中,作为基础配置 - 用
if函数判断PrivateKeyCertificateThumbprint参数是否为空:- 参数为空时,返回空数组,最终拼接出的appSettings里不会包含
WEBSITE_LOAD_CERTIFICATES项 - 参数非空时,返回只包含证书配置项的单元素数组,追加到基础配置后
- 参数为空时,返回空数组,最终拼接出的appSettings里不会包含
- 所有配置都在站点主资源的siteConfig节点下声明,只要把需要保留的模板管控配置都写在基础数组里,就不会出现配置被意外清空的问题。
内容的提问来源于stack exchange,提问作者Dommicentl
相关产品推荐
相关产品推荐

