如何使用 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 数据源

如何将用户和团队导入 grafana?

如何使用 Terraform 将 GKE 凭证传递给 Kubernetes 提供者?

如何使 Terraform 提供程序依赖于正在创建的资源

Terraform:如何安装多个版本的提供程序插件? [复制]

如何在同一个 terraform 配置中使用 2 个提供程序?