如何使用 Terraform Grafana 提供程序动态地将仪表板放在正确的文件夹中
Posted
技术标签:
【中文标题】如何使用 Terraform Grafana 提供程序动态地将仪表板放在正确的文件夹中【英文标题】:How to put Dashboards in the right folder dynamically using the Terraform Grafana provider 【发布时间】:2021-06-13 17:08:02 【问题描述】:我有以下用例:我正在使用 Azure DevOps 管道和 Terraform 的组合来同步我们的 TAP for Grafana (v7.4)。目的是我们可以在测试中调整和调整仪表板,并通过管道将更改推送到验收(和生产)。
我有一个管道可以提取测试环境的状态并将其写入一组 json 文件(用于仪表板)和一个 json 数组(用于文件夹)。 第二个管道应该使用这些资源来同步 Acceptance 环境。
这对于仪表板来说完美无缺,但我遇到了一个障碍,将仪表板动态地放在正确的文件夹中。这是我最新的工作代码:
resource "grafana_folder" "folders"
for_each = toset(var.grafana_folders)
title = each.key
resource "grafana_dashboard" "dashboards"
for_each = fileset(path.module, "../dashboards/*.json")
config_json = file("$path.module/$each.key")
文件夹资源根据我通过变量传递的名称变量列表推送文件夹。这会正确生成文件夹。
仪表板资源根据指定文件夹中的所有仪表板文件正确推送仪表板。
但现在我想确保仪表板最终位于正确的文件夹中。提供者指定我需要根据文件夹 UID 执行此操作,该 UID 是在创建文件夹时生成的。所以我想从 grafana_folder 资源中获取输出并在 grafana_dashboard 资源中使用它。我正在尝试以下方法:
resource "grafana_folder" "folders"
for_each = toset(var.grafana_folders)
title = each.key
resource "grafana_dashboard" "dashboards"
for_each = fileset(path.module, "../dashboards/*.json")
config_json = file("$path.module/$each.key")
folder = lookup(transpose(grafana_folder.folders), "Station_Details", "Station_Details")
depends_on = [grafana_folder.folders]
如果我正确阅读了 Grafana Provider github,grafana_folder 资源应该输出 [uid, title] 的映射。所以我想如果我转置该地图,并(通过测试)查找我知道存在的文件夹标题,我可以测试这个概念。
这会产生以下错误:
在 main.tf 第 38 行,在资源“grafana_dashboard”“dashboards”中: 38:文件夹=查找(转置(grafana_folder.folders), "Station_Details", "Station_Details")
“默认”参数的值无效:默认值必须具有 与地图元素的类型相同。
Uid 和 Title 都应该是字符串,所以我显然忽略了一些东西。
有没有人知道我哪里出了问题和/或有关于我如何才能做到这一点(更好)的建议?
【问题讨论】:
【参考方案1】:我认为这个错误试图报告的问题是 grafana_folder.folders
是对象的映射,因此将其传递给 transpose
并没有真正意义,但似乎成功了,因为 Terraform 找到了一些聪明的方法进行自动类型转换以产生 some 结果,但是该结果(由于transpose
的签名)是列表映射而不是字符串映射,因此"Station_Details"
(a字符串,而不是列表)不是该查找的有效后备值。
我对 Grafana 中的文件夹的熟悉程度有限,这让我不确定该建议什么,但我希望最终的表达式看起来像以下 something:
folder = grafana_folder.folders[SOMETHING].id
SOMETHING
这里将是一个表达式,可让您知道给定仪表板应该属于哪个文件夹键。我没有从您在问题中分享的内容中看到答案,但只是作为一个占位符,以使其成为一个完整的答案,我建议一种选择是制作从仪表板文件名到文件夹名称的本地映射:
locals
# a local value probably isn't actually the right answer
# here, but I'm just showing it as a placeholder for one
# possible way to map from dashboard filename to folder
# name. These names should all be elements of
# var.grafana_folders in order for this to work.
dashboard_folders =
"example1.json" = "example-folder"
"example2.json" = "example-folder"
"example3.json" = "another-folder"
resource "grafana_dashboard" "dashboards"
for_each = fileset("$path.module/dashboards", "*.json")
config_json = file("$path.module/dashboards/$each.key")
folder = grafana_folder.folders[local.dashboard_folders[each.key]].id
【讨论】:
一个非常公平的观点是它是一个对象地图。应该考虑到的。至少,这给了我一些可以进一步试验的东西。谢谢!以上是关于如何使用 Terraform Grafana 提供程序动态地将仪表板放在正确的文件夹中的主要内容,如果未能解决你的问题,请参考以下文章
通过 helm / terraform 安装自定义 grafana 数据源
如何使用 Terraform 将 GKE 凭证传递给 Kubernetes 提供者?