[英]Validating through terraform that a vault policy exists before using it in a group
我有以下结构
module "policies" {
source = "../../../../path/to/my/custom/modules/groups"
for_each = var.config.policies
name = each.key
policy = each.value
}
module "groups" {
source = "../../../../path/to/my/custom/modules/groups"
for_each = var.config.groups
name = each.key
type = each.value.type
policies = each.value.policies
depends_on = [
module.policies
]
}
策略和组在yaml
文件中声明,通过yamldecode
创建与for_each
对应的变量。
有什么方法可以确保传递给policies = each.value.policies
groups
模块的策略确实存在?
我的意思是,好的,我有depends_on
子句,但我还想为yaml
文件和其他类似情况中的错别字做好准备。
在 Terraform 中声明对外部 object(在别处管理)的依赖的通常方法是使用data
块,该数据块使用由负责该 object 的提供者定义的数据源。如果目标只是验证 object 是否存在,那么它就足够了声明数据源,然后让下游对象的配置引用有关其结果的任何内容,这样 Terraform 就可以看到数据源是一个依赖项,因此应该首先解决。
不幸的是,似乎hashicorp/vault
提供者目前没有用于声明对策略的依赖性的数据源,尽管它有一个功能请求。
假设它确实存在,那么模式可能看起来像这样:
data "vault_policy" "needed" {
for_each = var.config.policies
name = each.value
}
module "policies" {
source = "../../../../path/to/my/custom/modules/groups"
for_each = var.config.policies
name = each.key
# Accessing this indirectly via the data resource tells
# Terraform that it must complete the data lookup before
# planning anything which depends on this "policy" argument.
policy = data.vault_policy.needed[each.key].name
}
如果没有这种特定 object 类型的数据源,我认为不会有一种优雅的方法来解决这个问题,但您可以通过使用更通用的数据源(例如hashicorp/external
的external
数据源)来解决它通过运行打印 JSON 的外部程序收集数据。
同样,因为您实际上似乎并不需要策略中的任何特定数据,而只想检查它是否存在,所以编写一个查询保险库的外部程序就足够了,如果请求失败则存在不成功状态,或者如果请求成功,打印一个空的 JSON object {}
。
data "external" "vault_policy" {
for_each = var.config.policies
program = ["${path.module}/query-vault"]
query = {
policy_name = each.value
}
}
module "policies" {
source = "../../../../path/to/my/custom/modules/groups"
for_each = var.config.policies
name = each.key
policy = data.external.vault_policy.query.policy_name
}
我对 Vault 不够熟悉,无法建议此query-vault
-vault 程序的具体实现,但如果您遵循在 shell 脚本中处理 JSON 中的建议,您可以使用包装vault
CLI 程序的 shell 脚本。 您只需要执行其中的输入解析部分,因为您的结果将通过exit 1
表示失败或echo '{}'
然后成功退出表示成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.