如何在Terraform中输出一种类型的所有资源?

时间:2018-06-13 13:55:16

标签: amazon-web-services terraform

我的Terraform代码中定义了一堆aws_ecr_repositories

resource "aws_ecr_repository" "nginx_images" {
  name = "nginx-test"
}

resource "aws_ecr_repository" "oracle_images" {
  name = "oracle-test"
}

我希望能够拥有一个可以将所有aws_ecr_repository资源列入一个输出的输出。这就是我试过的:

output "ecr_repository_urls" {
  value = "[${aws_ecr_repository.*.repository_url}]"
}

这不起作用,因为Terraform似乎不允许在资源名称上使用通配符。是否有可能有这样的输出?我目前的解决方案是只列出每个定义资源的输出。

2 个答案:

答案 0 :(得分:2)

Terraform's splat syntax用于使用count meta parameter跟踪资源创建的每件事物。

如果您希望能够获取所有相关的网址,则可以拥有一个count资源,并使用variable "images" { default = [ "nginx-test", "oracle-test", ] } resource "aws_ecr_repository" "images" { count = "${length(var.images)}" name = "${var.images[count.index]}" } output "ecr_repository_urls" { value = "[${aws_ecr_repository.images.*.repository_url}]" } 元参数,例如:

x

答案 1 :(得分:1)

您可以手动将它们组合为一个列表:

output "ecr_repository_urls" {
  value = ["${aws_ecr_repository.nginx_images.repository_url}", "${aws_ecr_repository.oracle_images.repository_url}"]
}

尽管代码可能不太好。

您也可以这样做:

variable "ecr_repos" {
  default = {
    "0" = "foo"
    "1" = "bar"
  }
}

resource "aws_ecr_repository" "images" {
  count = "${length(var.ecr_repos)}"
  name  = "${lookup(var.ecr_repos,count.index)}-test"
}

output "ecr_repository_urls" {
  value = "${aws_ecr_repository.images.*.repository_url}"
}

但问题是,如果列表顺序发生变化,它会重新创建资源,并且因为每个仓库都被分配给索引号,所以非常快速变得非常丑陋。