如何解决Terraform条件指定某些文本
在Terraform中,我试图提出一个条件,该条件正在搜索特定的键以稍后执行操作。以下是我定义的map变量的示例。我想做的是让Terraform“过滤”某些键并执行某些操作。有关如何实现此目标的任何建议都将有所帮助。
variable "volumes" {
type = map(object({
size = string
availability_zone = string
}))
default = {
"Primary" = {
size = "200"
availability_zone = "us-west-2a"
}
"PrimarySecondary" = {
size = "100"
availability_zone = "us-west-2a"
}
"Worker1" = {
size = "200"
availability_zone = "us-west-2b"
}
"Worker1Secondary" = {
size = "100"
availability_zone = "us-west-2b"
}
"Worker2" = {
size = "200"
availability_zone = "us-west-2c"
}
"Worker2Secondary" = {
size = "100"
availability_zone = "us-west-2c"
}
}
}
resource "aws_ebs_volume" "partition" {
for_each = var.volumes
availability_zone = each.value.availability_zone
size = each.value.size
tags = {
Name = each.key
}
}
resource "aws_volume_attachment" "ebs_att" {
for_each = aws_ebs_volume.partition
device_name = each.key == ("Primary" || "Worker1" || "Worker2") ? "/dev/sdf" : "/dev/sdg"
volume_id = each.value.id
instance_id = aws_instance.private[each.key].id
}
错误
Error: Invalid operand
on vpc.tf line 49,in resource "aws_volume_attachment" "ebs_att":
49: device_name = each.key == ("Primary" || "Worker1" || "Worker2") ? "/dev/sdf" : "/dev/sdg"
Unsuitable value for right operand: a bool is required.
解决方法
这里的表达式"Primary" || "Worker1" || "Worker2"
被Terraform拒绝,因为||
是布尔OR运算符,只能与布尔值一起使用,不能与字符串一起使用。
您似乎打算在这里说“如果each.key
是这些值之一”,在这种情况下,一种使用方法是使用the contains
function:
device_name = contains(["Primary","Worker1","Worker2"],each.key) ? "/dev/sdf" : "/dev/sdg"
我考虑的另一种选择是创建一个带有映射的本地值,该映射显示每个密钥的设备名称,如下所示:
locals {
volume_device_names = {
Primary = "/dev/sdf"
Worker1 = "/dev/sdf"
Worker2 = "/dev/sdf"
PrimarySecondary = "/dev/sdg"
Worker1Secondary = "/dev/sdg"
Worker2Secondary = "/dev/sdg"
}
}
然后您的条件表达式可以成为地图查找:
device_name = local.volume_device_names[each.key]
这有一些不同的权衡取舍,根据您的需要,这可能是优势,也可能不是优势:
- 如果调用方在变量值中指定了意外的键名称,则第一个示例将默认为
/dev/sdg
,而第二个示例将产生映射查找错误。如果您的有效密钥集是固定集,那么如果呼叫者不小心输入错误,则返回错误可能会有所帮助。 - 在第一个示例中,为卷密钥选择设备名称的规则内嵌在
aws_ebs_volume_attachment
资源配置中,这意味着我们可以查看该资源名称并直接了解它将如何选择资源名称。但是,这意味着规则与variable "volumes"
的定义相比(从阅读模块的人的角度来看)“更远”,这可能使我们很难看出该映射的键对于确定设备已连接。将其分解为locals
块意味着可以将其放置在variable "volumes"
块附近,这样对于阅读该变量的定义的人来说更容易找到它。
还有其他一些变体在这两者之间达成不同的折衷,但是这个答案已经足够长了,因此除非您对此有特定疑问,否则我将把它们作为练习。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。