如何使用Terraform Grafana提供程序将仪表板动态放置在正确的文件夹中

如何使用Terraform Grafana提供程序将仪表板动态放置在正确的文件夹中,terraform,grafana,Terraform,Grafana,我有以下用例:我使用Azure DevOps管道和Terraform的组合来同步我们对Grafana(v7.4)的TAP。其目的是我们可以在测试时调整仪表盘,并通过管道将更改推向验收(和生产) 我有一个管道,它拉入测试环境的状态,并将其写入一组json文件(用于仪表板)和一个json数组(用于文件夹)。 第二个管道应该使用这些资源来同步验收环境 这对仪表板来说是完美的,但是我遇到了一个难题,就是如何将仪表板动态地放在正确的文件夹中。以下是我最新的工作代码: resource "graf

我有以下用例:我使用Azure DevOps管道和Terraform的组合来同步我们对Grafana(v7.4)的TAP。其目的是我们可以在测试时调整仪表盘,并通过管道将更改推向验收(和生产)

我有一个管道,它拉入测试环境的状态,并将其写入一组json文件(用于仪表板)和一个json数组(用于文件夹)。 第二个管道应该使用这些资源来同步验收环境

这对仪表板来说是完美的,但是我遇到了一个难题,就是如何将仪表板动态地放在正确的文件夹中。以下是我最新的工作代码:

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执行此操作。所以我想从grafana_文件夹资源中获取输出,并在grafana_仪表板资源中使用它。我正在尝试以下方法:

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]
}
  folder = grafana_folder.folders[SOMETHING].id
如果我正确读取了Grafana提供程序github,Grafana_文件夹资源应该输出[uid,title]的映射。所以我想,如果我转置这个映射,并且(通过测试)查找一个我知道存在的文件夹标题,我就可以测试这个概念

这会产生以下错误:

在main.tf第38行的资源“grafana_dashboard”“dashboards”中: 38:folder=lookup(转置(grafana_folder.folders), “车站详细信息”、“车站详细信息”)

“default”参数的值无效:默认值必须具有 与贴图元素的类型相同

Uid和Title都应该是字符串,所以我显然忽略了一些东西


有没有人知道我哪里出了问题和/或对我如何做(更好)有什么建议?

我认为这个错误试图报告的问题是
grafana_folder.folders
是一个对象地图,因此,将其传递给没有意义,但似乎取得了成功,因为Terraform找到了一些聪明的方法来进行自动类型转换以产生一些结果,但结果(由于
转置的签名)是列表的映射,而不是字符串的映射,因此
站的详细信息
(字符串,而不是列表)不是该查找的有效回退值

我对Grafana中文件夹的熟悉程度有限,因此我不确定该提出什么建议,但我希望最终的表达形式如下所示:

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]
}
  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
}

这是一张物体的地图。我应该考虑到这一点。这至少给了我一些可以进一步实验的东西。谢谢!