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



我有以下用例:我使用Azure DevOps管道和Terraform的组合来同步Grafana(7.4版(的TAP。目的是我们可以在测试中调整和调整我们的仪表板,并通过管道将更改推送到验收(和生产(。

我有一个管道,它拉入测试环境的状态,并将其写入一组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来执行此操作。因此,我想从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]的映射。所以我想,如果我转换映射,并(通过测试(查找我知道存在的文件夹标题,我就可以测试这个概念。

这会产生以下错误:

在主.tf第38行,在资源"中;grafana_dashboard"仪表板":
38:folder=lookup(transpose(grafana_folder.folders(,"Station_Details"Station_Details"(

"的值无效;默认";参数:默认值必须具有与地图元素的类型相同。

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

有人知道我哪里错了吗?和/或对我如何做(更好(有建议吗?

我认为这个错误试图报告的问题是grafana_folder.folders是对象的映射,因此将其传递给transpose实际上没有意义,但似乎很成功,因为Terraform找到了一些巧妙的方法来进行自动类型转换,以产生一些结果,但结果(由于transpose的签名(是列表的映射,而不是字符串的映射,因此"Station_Details"(字符串,而不是列表(不是该查找的有效回退值。

我对Grafana中文件夹的熟悉程度有限,这让我不确定该建议什么,但我希望最后的表达式看起来像下面这样:

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
}

最新更新