在 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 语言部分。
我正在尝试在 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 语言部分。