模块中的 Terraform for_each

问题描述 投票:0回答:1

我正在创建一些

policies
,并且
policies
位于
my_pol
目录中。

resource "vault_policy" "rules" {
  for_each = fileset("${path.module}/my_pol", "*.hcl")
    
  name = trimsuffix(each.key, ".hcl")
  policy = file("my_pol/${each.key}")
}

我里面有几个警察

my_pol
dir

    my_pol
    -> pol1.hcl
    -> pol2.hcl

如何在模块内调用

pol2.hcl

module "my_module" {
  source             = "./dir/something"
  policy_two         = vault_rules.rules[each.value."pol2.hcl"] <- Here I want policy2.hcl
}

vault_policy.rules[each.value."pol2.hcl"]
这样正确吗?

编辑:

给定值不适合在 ../../variables.tf:36,1-24 声明的 module.my_module.module.my_resources.var.policy_two:需要字符串。

terraform hashicorp-vault
1个回答
0
投票

建议的代码在很多层面上都是错误的:

  • 首先您需要了解 for_each 的正确用法:您不能引用资源中使用的循环之外的索引。 在您的情况下,您在资源上使用 for_each ,并且在作为独立资源的模块中,您仍在使用 [each.value.x]
  • 其次,如果您想在模块中引用 pol2.hcl,只需通过其名称引用即可。但是,如果您正在创建该模块的多个实例,其中可能包含策略文件列表作为输入,那么您可以获取文件夹下的文件名列表,如下所示:
locals {
  all_policies = toset(fileset("${path.module}/my_pol", "*.hcl"))
}

然后您可以迭代此列表并传递模块的文件名称:

module "my_module" {
  for_each = local.policy_files

  source    = "./dir/something"
  policy    = file("${path.module}/my_pol/${each.value}")
}

请注意,第二个选项仅在您尝试创建模块的多个实例时才有效,否则您只需传递文件名即可。

© www.soinside.com 2019 - 2024. All rights reserved.