将多行文件拆分为 Terraform 变量以通过键访问值

kiv*_*ant 3 terraform hcl

我有一个包含很多行的第三方维护文件,它看起来像:

# a comment lines
aaa.bbb.cc 423 
ddd.ee.fff 452
...
tons.like.them 111
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将文件加载到本地地图并使用以下语法在 Terraform 中访问其键?:

"${lookup(var.locals.mylist, 'ddd.ee.fff', 0)}"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 8

使用以通用编程语言编写的单独程序来预处理这样的文件通常会更好,因为 Terraform 的 DSL 不太适合这种特殊的解析逻辑。

Terraform v0.11 及更早版本缺乏在语言本身内实现这样的解析所需的原语。该v0.12.0发布(这是处于测试阶段,在写作的时候)介绍了一些原语允许这种解析来实现,但我仍然会一般喜欢对terraform之外做它作为一个预处理步骤,如果在所有可能的.

话虽如此,下面是一个使用 Terraform v0.12 功能将像您的示例一样的文件解析为地图的示例:

locals {
  raw_lines = [
    for line in split("\n", file("${path.module}/input.txt")) :
    split(" ", trimspace(line))
  ]
  lines = [
    for line in local.raw_lines :
    line if length(line[0]) > 0 && substr(line[0], 0, 1) != "#"
  ]
  records = { for line in local.lines : line[0] => line[1] }
}

output "result" {
  value = local.records
}
Run Code Online (Sandbox Code Playgroud)

给定以下输入文件:

# a comment line
aaa.bbb.cc 423 
ddd.ee.fff 452
tons.like.them 111

# another comment
another.record abc
Run Code Online (Sandbox Code Playgroud)

使用 Terraform v0.12.0-beta1 会产生以下结果:

$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

result = {
  "aaa.bbb.cc" = "423"
  "another.record" = "abc"
  "ddd.ee.fff" = "452"
  "tons.like.them" = "111"
}
Run Code Online (Sandbox Code Playgroud)