在 hcl 扩展 ( vault ) 中使用 terraform 变量
Posted
技术标签:
【中文标题】在 hcl 扩展 ( vault ) 中使用 terraform 变量【英文标题】:Using terraform variable in hcl extention ( vault ) 【发布时间】:2022-01-16 01:52:13 【问题描述】:我正在尝试在 Vault 中自动创建路径和策略。 你知道我该怎么做吗? 在 terraform 中声明的变量不会在 .hcl 文件中重新整理。 我试图将我的文件 client-ro-policy.hcl 重命名为 client-ro-policy.tf 但我有同样的问题 在扩展名为 .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")
变量.tf
variable "client"
type = list(string)
变量.tfvars
client = ["titi", "toto","itutu"]
保险库中的结果:
【问题讨论】:
我会尝试使用 json 格式,但也许我应该考虑 Ansible ? 【参考方案1】:尽管 Terraform 和 Vault 都使用 HCL 作为其各自配置语言的底层语法,但它们的语言解释器是完全独立的,因此 Vault 策略语言实现不能直接使用 Terraform 语言中定义的任何值。
相反,您需要使用 Terraform 语言构建适合 Vault 的配置。 Vault 支持其策略语言的 JSON 变体,以便更轻松地以编程方式生成它,因此您可以使用 Terraform's jsonencode
function 从 Terraform 表达式的结果构建基于 JSON 的策略,该表达式本身可能包含对值的引用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)
假设var.client[0]
的值为"example"
,local.vault_ro_policy
的值应编码为 JSON,如下所示:
"path":
"example/k8s/preprod/*":
"capabilities": ["read"]
假设这是有效的 Vault JSON 策略语法(我尚未验证),这应该被 Vault 接受为有效策略。如果我没有完全正确地获得 JSON 策略语法,那么希望您能看到如何将其调整为有效;我的专长是 Terraform,所以我在这里专注于 Terraform 语言部分。
【讨论】:
非常感谢,我会尝试的。我使用安装了 cli 并在 localhost 的 env 中配置了 VAULT* var 的 ansible(我的保险库是一个 pod)完成了它以上是关于在 hcl 扩展 ( vault ) 中使用 terraform 变量的主要内容,如果未能解决你的问题,请参考以下文章