在Terraform中将代码块提取为变量
我现在有一些地形,看起来像这样:在Terraform中将代码块提取为变量,terraform,terraform-provider-aws,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 {
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
从这个错误来看,问题在于它试图把一个错误类型的东西——在这个例子中是一张地图——放在一个不属于它的地方。但让我感到困惑的是,以下内容是正确的,并且暗示(至少对我来说,作为一个地形noob)地图在这里应该是正确的:
resource "aws_autoscaling_group" "my_asg" {
...
tag = {
key = "ManagedBy"
value = "Terraform"
propagate_at_launch = true
}
}
因此,我的问题是:
您用于公共标记的变量是正确声明的,这取决于您如何将其传递给标记代码块。尝试插入过程标记的方式是错误的类型,如果使用merge函数,将以正确的格式返回。您可以在下面的文档中看到这一点
tags=“${merge(var.managed\u by\u tag)}”
仔细查看tag=“${var.managed\u by\u tag}”
:
您将地图插入到一个字符串中,然后尝试在Terraform需要地图的地方使用该字符串
请尝试以下方法:
resource "aws_autoscaling_group" "my_asg" {
...
tag = var.managed_by_tag
}
谢谢,但这会产生与以前完全相同的错误。问题是,尽管看起来标记块需要一个映射,但传入映射变量失败。如果merge函数可以工作,那么通过下面的map函数分配它也可以工作,但事实并非如此
tag=“${map(“key”,“ManagedBy”,“value”,“Terraform”,“propagate_at_launch”,true)}”
(我最初尝试过,但显然忘记了在原始问题中包括这一点-我对此表示歉意)嗨,不确定。我用Azure提供商(资源组)做了一个快速测试,结果很好。