如何在BICEP中用loadjsoncontext加载多订阅NSG参数文件?
问题
我正尝试使用BICEP的loadTextContent部署带有流量分析(Traffic Analytics)的Azure NSG流日志。当前模板已加载两个参数文件:一个是流水线参数文件,用于获取现有NSG的值;另一个通过loadTextContent加载,用于获取networkWatcherName、networkWatcherLocation、storageId等参数(替代流水线变量)。当前模板如下:
param nsgs array = [] param allowedVNetPrefixes array = [] param logRetentionDays int = 0 param subscriptionId string = subscription().subscriptionId var nsgFlowLog = json(loadTextContent('./nsgFlowLogParameters/nsgFlowLogCLE_WESTEUROPE.json')) var networkWatcherName = '${nsgFlowLog.networkWatcherName}' var location = '${nsgFlowLog.location}' var storageId = '${nsgFlowLog.storageId}' var nsgResourceGroupName = '${nsgFlowLog.nsgResourceGroupName}' var workspaceId = '${nsgFlowLog.workspaceId}' var workspaceRegion = '${nsgFlowLog.workspaceRegion}' var workspaceResourceId = '${nsgFlowLog.workspaceResourceId}' resource flowLog 'Microsoft.Network/networkWatchers/flowLogs@2022-01-01' = [for nsg in nsgs: { name: '${networkWatcherName}/Microsoft.Network${nsgResourceGroupName}NSG_${replace(nsg.subnet, '/', '_')}' location: location properties: { targetResourceId: '/subscriptions/${subscriptionId}/resourceGroups/${nsgResourceGroupName}/providers/Microsoft.Network/networkSecurityGroups/NSG_${replace(nsg.subnet, '/', '_')}' storageId: storageId enabled: true format: { type: 'JSON' version: 2 } retentionPolicy: { days: logRetentionDays enabled: true } flowAnalyticsConfiguration: { networkWatcherFlowAnalyticsConfiguration: { enabled: true workspaceId: workspaceId workspaceRegion: workspaceRegion workspaceResourceId: workspaceResourceId } } } }]
现在我想为每个订阅测试多个参数文件,每个订阅都有包含NSG和存储账户信息的资源组,请问如何在BICEP中使用loadTextContent加载所有这些参数文件?
解决方案
要实现加载多个参数文件并对应不同订阅/资源组部署NSG流日志,按以下步骤调整模板即可:
1. 定义参数文件路径列表
先声明变量,把所有需要加载的参数文件路径列出来,示例:
var paramFilePaths = [ './nsgFlowLogParameters/nsgFlowLogCLE_WESTEUROPE.json' './nsgFlowLogParameters/nsgFlowLogCLE_EASTUS.json' './nsgFlowLogParameters/nsgFlowLogCLE_SOUTHEASTASIA.json' ]
2. 批量加载解析所有参数文件
用数组循环把所有文件内容加载并解析成JSON对象,得到每个订阅的配置集合:
var subscriptionConfigs = [for path in paramFilePaths: json(loadTextContent(path))]
3. 嵌套循环部署对应流日志
因为每个配置对应一组NSG,需要用嵌套循环:外层遍历每个订阅配置,内层遍历该配置对应的NSG。如果流水线传入的nsgs数组需要和配置关联,要么把NSG列表整合到每个参数文件里,要么通过订阅ID、资源组名称等标识做匹配。
调整后的资源部署代码示例:
resource flowLog 'Microsoft.Network/networkWatchers/flowLogs@2022-01-01' = [for config in subscriptionConfigs: { name: '${config.networkWatcherName}/Microsoft.Network${config.nsgResourceGroupName}NSG_${replace(nsg.subnet, '/', '_')}' location: config.location properties: { targetResourceId: '/subscriptions/${config.subscriptionId}/resourceGroups/${config.nsgResourceGroupName}/providers/Microsoft.Network/networkSecurityGroups/NSG_${replace(nsg.subnet, '/', '_')}' storageId: config.storageId enabled: true format: { type: 'JSON' version: 2 } retentionPolicy: { days: logRetentionDays enabled: true } flowAnalyticsConfiguration: { networkWatcherFlowAnalyticsConfiguration: { enabled: true workspaceId: config.workspaceId workspaceRegion: config.workspaceRegion workspaceResourceId: config.workspaceResourceId } } } }]
注:如果每个订阅的NSG列表不同,建议把nsgs数组放到对应参数文件里,或者让流水线传递分订阅的NSG列表,再通过配置里的标识做匹配。
4. 可选:流水线动态指定参数文件
要是需要在流水线里动态选要加载的文件,把paramFilePaths改成参数,默认值设常用文件,流水线运行时再覆盖:
param paramFilePaths array = [ './nsgFlowLogParameters/nsgFlowLogCLE_WESTEUROPE.json' ]
内容的提问来源于stack exchange,提问作者CharismaticDevelop
相关产品推荐
相关产品推荐

