【问题标题】:How can i replace the value of a variable dynamically in terraform based on a condition如何根据条件在 terraform 中动态替换变量的值
【发布时间】:2020-12-12 02:09:26
【问题描述】:

我有两个模块:

module "vpc" {
..
..
}

module "subnet" {
 vpc = "${module.vpc.id}"
}

以及相应的变量和输出文件。

基于一个条件,我想动态地改变模块子网中 vpc 的值。 即 vpc 的值可以是 "${module.vpc.id}""${var.vpcid}"。 当我这样做时,我可以创建一个新的 vpc 和子网,当 vpc 的值设置为 - "${module.vpc.id}" 应用所有 terrform 模块时, 并且当 vpc 的值为"${var.vpcid}"(此处 terraform 应用不包括 vpc 模块)时,还可以使用现有的 vpc

我尝试使用表达式,在这两个模块之外使用了带有条件的本地块,但它最终创建了一个新的 vpc。

locals {
vpctake = "${var.vpcch ? element(module.vpc.id, 0) : var.vpcid}"
}

其中 vpcch 可以为真或假 在子网模块中:

vpc = "${local.vpctake}"

有没有办法实现这个。

【问题讨论】:

  • 您能否实际显示您尝试过的代码和错误消息。可能更容易看到您要执行的操作。

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


【解决方案1】:

你的代码有错误:

  • vpcch 应该是 vpcid
  • local 块中缺少条件

下面是我如何做的一个例子:

# vpcid with default value of empty string
variable "vpcid" {
  default = ""
}

# correctly defined local variable vpctake
locals {
  vpctake = "${var.vpcid == "" ? element(module.vpc.id, 0) : var.vpcid}"
}

module "subnet" {
 vpc = "${local.vpctake}"
}

这样,如果vpcid 是从命令行提供的:

terraform apply -var="vpcid=some-id"

local.vpctake 将是 some-id。否则将使用来自element(module.vpc.id, 0) 的值。

【讨论】:

  • 感谢@Marcin 但是在这种情况下 - “local.vpctake 将是一些 ID”,当我运行 terraform plan --target module.subnet 时,它会创建一个新的 vpc,而我想利用现有的我作为变量传递的 vpc id,而不是创建新的 vpc。
  • @Dilip 嗨。要使用现有 VPC,您可以使用 data aws_vpc。我的回答旨在修复您的状况,因为它不正确。您可以使用 aws_vpc 数据源使示例适应您的要求。
  • 好的,好的,再次感谢@Marcin,感谢您的更正和提示。
  • @Dilip 没问题。如果答案有帮助,我们将不胜感激。
猜你喜欢
  • 2020-07-16
  • 2021-08-16
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多