在Terraform中提取代码块作为变量

时间:2018-11-07 17:09:54

标签: terraform terraform-provider-aws

我目前有一些看起来像这样的地形:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

问题是此代码块非常大,并且多个ASG中共有许多标签,因此,为了将其缩小到更易于管理并减少重复的位置,我想对这些通用标签执行类似的操作:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = "${var.managed_by_tag}"
}

variable "managed_by_tag" {
  type = "map"
  default = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

不幸的是,当我对此运行terraform apply时,出现以下错误:

Error: Error loading C:\path\to\file.tf: Error reading config for aws_autoscaling_group[my_asg]: At 32:9: unknown slice type: *ast.LiteralType

从该错误看来,问题似乎在于它试图将错误类型的东西(在这种情况下为地图)放置在不属于该地方的地方。但是令我感到困惑的是,以下内容可以正常工作,并暗示(至少对我来说是地形新手)这里的地图应该可以:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

所以我的问题是:

  1. 是否可以将这些标签提取到变量中?
  2. 为什么我的方法不能奏效?

2 个答案:

答案 0 :(得分:2)

靠近tag = "${var.managed_by_tag}": 您正在将地图插入一个字符串,然后尝试在Terraform需要地图的地方使用该字符串。

尝试以下方法:

 resource "aws_autoscaling_group" "my_asg" {
   ...
   tag = var.managed_by_tag
 }

答案 1 :(得分:0)

正确地声明了用于通用标签的变量,这就是将其传递到标签代码块的方式。您尝试插入的方式会传递错误的标签类型,如果您使用合并功能,则会以正确的格式返回它。您可以在下面的文档中看到它,

Interpolation - merge

tags = "${merge(var.managed_by_tag)}"