【问题标题】:Use output value in terraform object在 terraform 对象中使用输出值
【发布时间】:2020-12-07 04:32:34
【问题描述】:

我有多个输出变量,我想制作一个父输出变量,然后将其他输出放入其中。我已经搜索过它,发现我们可以为它使用 terraform 对象,但无法获得正确的语法。 输出.tf

output "public_subnet" {
  value = "${module.my_vpc.public_subnets_ids}"
}
output "vpc_id" {
  value = "${module.my_vpc.vpc_id}"
}
output "private_subnet" {
  value = "${module.my_vpc.private_subnets_ids}"
}

我希望我的输出在一个对象中,或者您可以说具有所有子输出值的父输出变量,我想出了几行我知道语法不正确但会让您了解我的图片我在想。

output "vpc" {
  value = {
    vpc_id         = "${module.my_vpc.vpc_id}"
    public_subnet  = "${module.my_vpc.public_subnets_ids}"
    private_subnet = "${module.my_vpc.private_subnets_ids}"
  }
  type = object({ vpc_id = string, public_subnet = string, private_subnet = string })
}

【问题讨论】:

    标签: amazon-web-services terraform amazon-vpc terraform-provider-aws


    【解决方案1】:

    Terraform output 没有 type。因此,您的vpc 应该是:

    output "vpc" {
      value = {
        vpc_id         = "${module.my_vpc.vpc_id}"
        public_subnet  = "${module.my_vpc.public_subnets_ids}"
        private_subnet = "${module.my_vpc.private_subnets_ids}"
      }  
    }
    

    但问题是子模块无法访问其父模块的输出。因此,我不确定您希望通过输出实现什么。通常,您会使用variable 将变量从父级传递给子级,然后您可以从子模块中的这些变量生成新的输出。

    更新

    根据您之前的问题,main.tf

    module "my_vpc" {
      source            = "./modules/vpc"
      vpc_cidr          = var.vpc_cidr
      public_subnet     = var.public_subnet
      private_subnet    = var.private_subnet
      availability_zone = data.aws_availability_zones.azs.names
    }
    

    因此,您必须有一个文件夹./modules/vpc。在文件夹中,可能有一个名为./modules/vpc/vpc.tf 的文件。该文件将包含类似的内容(变量也可以在单独的文件中):

    variable "vpc_cidr" {}
    
    variable "public_subnet" {}
    
    variable "private_subnet" {}
    
    variable "availability_zone" {}
    
    # the rest of the VPC definition. Since the file is not given,
    # i can only speculate on the exact details of the content
    
    resource "aws_subnet" "public" {
    
      count  = length(var.public_subnet)
    
      vpc_id = aws_vpc.my_vpc.id
    
      # other attributes
    }
    
    resource "aws_subnet" "private" {
    
      count  = length(var.private_subnet)
    
      vpc_id = aws_vpc.my_vpc.id
    
      # other attributes
    }
    

    如果是这样,那么您可以创建一个名为 ./modules/vpc/output.tf 的新文件,其内容为:

    output "vpc" {
      value = {
        vpc_id         = my_vpc.vpc_id
        public_subnet  = aws_subnet.public.*.id
        private_subnet = aws_subnet.private.*.id
      }  
    }
    

    【讨论】:

    • 如何使用 terraform 对象?
    • @Shifa 嗨。你能澄清一下“做吗?”做什么?
    • 嗨 Marcin,我的主管让我在 output.tf 文件 terraform.io/docs/configuration/types.html 中使用 terraform 对象,这样如果我想引用输出,我可以使用 "${module.vpc.vpc_id}" "${module.vpc.public_subnet}" 就像输出变量的名称保持不变,我们可以访问不同的属性,如 vpc_id public_subnet
    • 你明白我的意思了吗?我做了很多搜索,没有找到任何有用的材料
    • @Shifa 我正在努力解决这个难题。我记得昨天的 VPC。我想我知道你的意思。给我几分钟验证一下。
    猜你喜欢
    • 2021-10-04
    • 2018-06-19
    • 2021-02-08
    • 2022-01-09
    • 2017-12-24
    • 2021-04-26
    • 1970-01-01
    • 2021-12-18
    • 2019-12-12
    相关资源
    最近更新 更多