# 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.
}
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.tfvars
client = ["titi", "toto","itutu"]
在保险库中的回归:
即使Terraform和Vault都使用HCl作为其各自配置语言的基础语法,但其语言解释器是完全分开的,因此保险库策略语言实现无法直接使用Terraform语言中定义的任何值。
Instead,您需要使用Terraform语言来构建合适的金库配置。保险库支持其策略语言的JSON变体,以使其更易于编程生成它,因此您可以使用Terraform表达式的结果使用terraform的jsonencode
函数
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
具有值var.client[0]
::
"example"
评估这是有效的Vault JSON策略语法(我尚未验证),这应该被Vault作为有效的策略接受。如果我没有得到JSON策略语法完全正确的说法,那么希望您能看到如何将其调整以有效;我的专业知识是在Terraform上,所以我专注于Terraform语言部分。
我也无法在包含的HCl文件中使用变量。但是,如果您要在.tf语法中执行所有操作,则此解决方案似乎比其他答案要简单一些:您需要定义策略内联,而不是包括外部文件
{
"path": {
"example/k8s/preprod/*": {
"capabilities": ["read"]
}
}
}