繁体   English   中英

在组中使用之前通过 terraform 验证保险库策略是否存在

[英]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/externalexternal数据源)来解决它通过运行打印 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM