在 hcl 扩展中使用 terraform 变量 ( vault )

Using terraform variable in hcl extention ( vault )

我正在尝试在 Vault 中实现路径和策略创建的自动化。 你知道我该如何进行吗? 在 terraform 中声明的变量未在 .hcl 文件中重新识别。 我试图将我的文件 client-ro-policy.hcl 重命名为 client-ro-policy.tf 但我有同样的问题 Varibales 在扩展名为 .tf 的文件中被识别

谢谢

main.tf

# Use Vault provider
provider "vault" {



# It is strongly recommended to configure this provider through the
  # environment variables:
  #    - VAULT_ADDR
  #    - VAULT_TOKEN
  #    - VAULT_CACERT
  #    - VAULT_CAPATH
  #    - etc.  

}

acl-ro-policy.hcl

    path "${var.client[0]}/k8s/preprod/*" {
  capabilities = ["read"]
}

policies.tf

    #---------------------
# Create policies
#---------------------

# Create 'client' policy
resource "vault_policy" "ro-client" {
  name   = "${var.client[0]}_k8s_preprod_ro"
  policy = file("./hcl-ro-policy.tf")
}

variables.tf

    variable "client" {
      type    = list(string)

}

variables.tf变量

client = ["titi", "toto","itutu"]

保险库结果:

尽管 Terraform 和 Vault 都使用 HCL 作为其各自配置语言的基础语法,但它们的语言解释器是完全独立的,因此 Vault 策略语言实现不能直接使用 Terraform 语言中定义的任何值。

相反,您需要使用 Terraform 语言来构建 适合 Vault 的配置。 Vault 支持其策略语言的 JSON 变体,以便更容易以编程方式生成它,因此您可以使用 Terraform's jsonencode function 从Terraform 表达式,它本身可能包含对 Terraform 中其他地方的值的引用。

例如:

locals {
  vault_ro_policy = {
    path = {
      "${var.client[0]}/k8s/preprod/*" = {
        capabilities = ["read"]
      }
    }
  }
}

resource "vault_policy" "ro-client" {
  name   = "${var.client[0]}_k8s_preprod_ro"
  policy = jsonencode(local.var_ro_policy)
}

local.vault_ro_policy 的值应编码为 JSON 如下,假设 var.client[0] 的值为 "example":

{
  "path": {
    "example/k8s/preprod/*": {
      "capabilities": ["read"]
    }
  }
}

假设这是有效的 Vault JSON 策略语法(我尚未验证),这应该被 Vault 接受为有效策略。如果我没有完全正确地理解 JSON 策略语法,那么希望您能看到如何调整它以使其有效;我的专长是 Terraform,所以我在这里专注于 Terraform 语言部分。