如何将输出变量从子模块传递到调用者模块

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

真实的例子很复杂,我尝试简化一下:

variable "input" {
    type = string
    default  "In Xanadu did Khubla Khan"
}

module "child" {
    source = "./child
    input = var.input
}

output "output" {
    value = module.child.output
}

现在是子模块

variable "input" {
    type = string
}

output "output" {
    value = "${var.input} a stately pleasure dome decree"
}

结果我得到了

╷
│ Error: Unsupported attribute
│
│   on output.tf line 122, in output "output":
│  122:   value       =  module.child.output
│     ├────────────────
│     │ module.child is a object, known only after apply
│
│ This object does not have an attribute named "output".

更新:我在这里使用了一个带有“输入”和“输出”等变量名称的抽象示例,并从引用变量“aws_s3_cxrossaccount_iam_role_arn”的真实 terraform 脚本中复制了错误消息。这显然让本文的一些读者感到困惑。因此,我将错误消息中的真实姓名替换为我在本示例中使用的名称“output”。

当然,错误消息是从真实的脚本中获取的,但我希望通过上面的示例,我会得到类似的结果

我已经用谷歌搜索过这个问题,但没有得到任何线索。 Terraform 提供程序版本是

C:\Databricks\dbx_tpch> terraform -version
Terraform v1.2.2
on windows_amd64
+ provider registry.terraform.io/databricks/databricks v1.14.2
+ provider registry.terraform.io/hashicorp/aws v4.62.0
+ provider registry.terraform.io/hashicorp/random v3.4.3
+ provider registry.terraform.io/hashicorp/time v0.9.1

Your version of Terraform is out of date! The latest version
is 1.4.4. You can update by downloading from https://www.terraform.io/downloads.html

我当然可以升级,但我不认为这会有帮助

terraform databricks terraform-provider-aws
1个回答
1
投票
  1. 解决方法 不要重新定义根模块中子模块的每个输出变量,而是引用整个子模块
output "single_child_output" {
    description = "Do not use it"
    value = module.child.child_output
}

output "all_child_outputs" {
    description = "use this instead"
    value = module.child
}

结果你会得到一张地图

输出:

all_child_outputs = {
     "variable1" = "value1"
     "variable2" = "value2"
     "variable3" = "value3"
}

重要 - 这个解决方法甚至在我升级 terraform 之前就有效了

  1. 解决方案?

但是,发生了这样的情况,我在故障排除的一个步骤中升级了 terraform 本身

dbx_tpch> terraform version
Terraform v1.4.4
on windows_amd64
+ provider registry.terraform.io/databricks/databricks v1.14.2
+ provider registry.terraform.io/hashicorp/aws v4.62.0
+ provider registry.terraform.io/hashicorp/random v3.5.1
+ provider registry.terraform.io/hashicorp/time v0.9.1

错误消失了,我可以使用上面的两种变体 - 寻址子模块或整个输出块中的单个输出变量。两者都有效。 恕我直言,寻址整个块有时更容易,但如果您想使用“terraform output”的输出作为某些脚本的输入 - 通过单个变量寻址可能会更好。

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