【问题标题】:Best way to get an interpolated value into a Terraform lookup将内插值放入 Terraform 查找的最佳方法
【发布时间】:2018-05-23 19:33:49
【问题描述】:

我正在尝试设置 Terraform 以部署到各个 AWS 区域,我在命令行上发送区域,因为它是脚本中为数不多的更改值之一。我正在使用 -var "region=east" - 例如,它通过正确分配区域在其他模块中工作,我使用此值的 main.tf 设置正确。

在创建资源时,有一个使用区域作为映射值的查找,amis 是区域和不同 ami 值的映射,我只想要与此资源匹配的 ami。我尝试了两种方法,使用命令行插值:

ami = "${lookup(var.amis, $${var.region})}"

或作为中间值

variables "map_region" {
  default = "${var.region}"
}
ami = "${lookup(var.amis, var.map_region)}"

两者都给我语法错误,但在通过查找查看一些文档时,我看不到 terraform 在哪里支持这一点。其他人以某种方式成功地尝试过,或者知道使用命令行变量从地图中提取值的更好方法?

编辑: 部分问题被隐藏了,因为我使用 Bash 脚本运行 Terraform 模块。这是运行破坏力,然后应用。因为我正在考虑将命令行变量作为构建的一部分,所以我没有将它们添加到 destroy 命令中,这是请求它们并提示我输入它们的地方。一旦我将 -var 命令添加到destroy 命令并应用这一切就可以了。

【问题讨论】:

  • 在使用插值时,您只需要一组${} - 其中的任何内容都会被渲染。我不相信您可以在变量中进行插值。 ${lookup(var.amis, 'us-east-1')} 会返回你想要的吗?
  • 是的,它返回我想要的,但我需要以某种方式使用插值,以便我可以重用脚本以在不同区域部署。

标签: amazon-web-services terraform


【解决方案1】:
ami = "${lookup(var.amis, $${var.region})}"

是错误的,因为$$ 仅对inline templates 内的插值​​变量有效。

variables "map_region" {
  default = "${var.region}"
}
ami = "${lookup(var.amis, var.map_region)}"

不起作用,因为您将映射作为键传递给 lookup

Terraform console 是尝试插值表达式的有用工具。假设变量定义如下:

$ cat vars.tf
variable "amis" {
  type = "map"

  default {
    "us-east-2" = "ami-58f5db3d"
    "us-east-1" = "ami-fad25980"
  }
}

variable "region" {}

启动控制台,将值传递给region,以模拟您将使用planapply 等进行的操作:

$ terraform console -var "region=us-east-1"
> var.region
us-east-1
> lookup(var.amis, var.region)
ami-fad25980

希望这会有所帮助。

【讨论】:

  • 我以前试过这个,当我在我的变量文件中使用变量“region”{}时,我仍然会在使用 apply - terraform apply -var "region=us 时收到添加 var.region 的提示-east-1"
  • 玩这个更多看起来像设置变量的bash脚本在某种程度上没有正确设置它们。在 Bash 中使用 terraform apply -var region=${var_region} 不起作用,但在命令行上使用带有变量集的命令可以。很奇怪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多