【问题标题】:How do I get outputs for multiple modules?如何获得多个模块的输出?
【发布时间】:2019-03-29 01:33:22
【问题描述】:

我有一个模块,我在一个 tf 文件中多次调用。它所做的其中一件事是创建一个 S3 存储桶。我在它的输出中定义了这个:

output "mybucket" {
  value = "${aws_s3_bucket.mybucket.id}"
}

为了查看这个输出,因为我使用的是模块,所以范围是特定模块,这意味着这样做:

terraform output -module=module1 mybucket

这意味着如果我只想要通过 tf 文件创建的所有存储桶的列表,我必须以编程方式循环它们。遗憾的是,通配符不起作用:

terraform output -module=* mybucket

那么现在,我该怎么做呢?我可以遍历所有模块并多次调用输出,但我找不到列出当前正在使用的所有模块的 terraform 命令。

通过状态列表,我得到模块名称,但我必须解析格式:

terraform state list aws_s3_bucket.mybucket

module.module1.aws_s3_bucket.mybucket
module.module2.aws_s3_bucket.mybucket

有没有办法查询状态和检索所有已创建的存储桶或查看所有模块的输出?


编辑:所以看来我可以从调用模块的 tf 文件中输出一个列表。 tf 文件将多个模块调用的输出收集到一个列表中:

module "mod1" {..do stuff, create s3 bucket, output{mybucket} ...}
module "mod2" {..do stuff, create s3 bucket, output{mybucket} ...}
module "mod3" {..do stuff, create s3 bucket, output{mybucket} ...}

output "my-buckets" {
  value = ["${module.mod1.mybucket}","${module.mod2.mybucket}"]
}

但令人失望的是我必须手动输入每个模块的名称。 splat 运算符在这里没有工作来扩展模块——我用错了吗?:

output "my-buckets" {
  value = ["${module.*.mybucket}"]
}

我得到的错误是:

* output 'my-buckets': unknown module referenced: *
    output 'my-buckets': undefined module referenced *

【问题讨论】:

  • splat 运算符仅在您具有资源的count 属性时才可用(请注意,模块仍然不支持count),因为它会查看正在使用的资源列表.每个模块彼此完全分开,因此您不能在此处使用它。可能值得尝试在更高的层次上解释您在此处尝试实现的目标,因为没有比您已经探索过的更好的选择了。

标签: terraform


【解决方案1】:

还跟进@ydaetskcoR 的回答,您的案例的 splat 符号看起来有点像:

output "output-s3-buckets" {
  value       = "${aws_s3_bucket.mybuckets.*.id}"
  description = "List of buckets created"
}

可以在模块声明级别读取为

list_of_buckets = ["${modules.s3_module.output-s3-buckets}"]

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2015-03-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多