Terraform能否从远程文件引入newrelic_one_dashboard资源的page块配置
可以实现,你可以通过Terraform的http数据源拉取远程配置文件,配合dynamic动态块渲染page嵌套块的方式满足需求,具体实现方案如下:
准备工作
先把page块的配置内容转为结构化的JSON/YAML格式,存储到你的远程文件服务(比如对象存储、私有配置中心等)。单页面配置的JSON示例如下:
// page1.json 示例内容 { "name": "Page1", "widget_bar": [ { "title": "Average transaction duration, by application", "row": 1, "column": 1, "filter_current_dashboard": true, "nrql_query": "FROM Transaction SELECT count(1) FACET appName" } ], "widget_line": [ { "title": "response time view", "row": 2, "column": 1, "width": 4, "height": 4, "nrql_query": "FROM Transaction SELECT average(duration) FACET appName" } ] }
如果是多页面统一存储的文件,直接把上面的结构包在一个数组里即可。
方案1:单独存储每个page的配置(对应第一种期望写法)
# 拉取所有远程page配置文件 data "http" "page_config" { for_each = toset(["page1", "page2", "page3"]) url = "https://你的远程文件地址前缀/${each.key}.json" # 私有文件可在请求头加鉴权信息 # request_headers = { # Authorization = "Bearer ${var.config_token}" # } } locals { # 解析所有page的配置内容 page_list = [for k in data.http.page_config : jsondecode(data.http.page_config[k].response_body)] } resource "newrelic_one_dashboard" "exampledash" { name = "New Relic Terraform Example with three pages" # 动态渲染所有page块 dynamic "page" { for_each = local.page_list content { name = page.value.name # 渲染bar组件 dynamic "widget_bar" { for_each = page.value.widget_bar content { title = widget_bar.value.title row = widget_bar.value.row column = widget_bar.value.column filter_current_dashboard = widget_bar.value.filter_current_dashboard nrql_query { account_id = var.account_id query = widget_bar.value.nrql_query } } } # 渲染line组件 dynamic "widget_line" { for_each = page.value.widget_line content { title = widget_line.value.title row = widget_line.value.row column = widget_line.value.column width = widget_line.value.width height = widget_line.value.height nrql_query { account_id = var.account_id query = widget_line.value.nrql_query } } } } } }
方案2:所有page配置统一存储在单个远程文件(对应第二种期望写法)
# 拉取包含所有page配置的单个远程文件 data "http" "all_page_config" { url = "https://你的远程文件地址/all_pages.json" } locals { all_pages = jsondecode(data.http.all_page_config.response_body) } resource "newrelic_one_dashboard" "exampledash" { name = "New Relic Terraform Example with three pages" # 动态渲染所有page块,逻辑和方案1完全一致 dynamic "page" { for_each = local.all_pages content { name = page.value.name # 后续widget_bar、widget_line的渲染逻辑和方案1完全相同,这里省略 } } }
注意事项
- 如果远程配置需要使用Terraform变量,可以将远程文件存为模板格式,拉取后通过
templatefile函数或字符串替换逻辑完成变量插值 - 注意管控远程文件的访问权限,避免敏感配置泄露
- 远程配置的字段结构需要和动态块中引用的字段完全匹配,否则会出现解析报错
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

