我试图在我的变量文件中创建一个变量,我认为我可以用映射来做,但它不起作用。
在变量中。我有:
boot_disk = list(string)
在我的vars文件中,我提供了这些值:
boot_disk = {
image = "string"
size = 1000
type = "string"
}
自"size"是一个整数,我想这就是问题所在。有人能帮我解决这个问题吗?我的Jenkins工作总是失败。
我也在我的vars文件中定义了这个:
attached_disks = {
name = "string"
size = 100
image = "string"
},
{
name = "string"
size = 200
image = "string"
},
{
name = "string"
size = 100
image = "disk"
}
但是我不知道如何在变量中声明它。现在它看起来像:
attached_disks = map(object({
name = string
size = number
image = string}))
对于boot_disk,列表类型变量的值必须在方括号中给出[]这样做:https://www.terraform.io/language/values/variables
对于attached_disks尝试如下:
attached_disks = list(object({
name = string
size = number
image = string}))
同样,修改你的tfvars文件如下:
attached_disks = [{
name = "string"
size = 100
image = "string"
},
{
name = "string"
size = 200
image = "string"
},
{
name = "string"
size = 100
image = "disk"
}
]
您提供的代码有几个问题。例如,你说你想要一个map
作为变量,但是你把它定义为一个字符串列表,也就是list(string)
。这意味着terraform将期望这些值类似于boot_disk = ["string1", "string2", "string3"]
。对于赋值,你有:
boot_disk = {
image = "string"
size = 1000
type = "string"
}
你确实在创建一个地图。这当然不会像预期的那样工作,因为您正在尝试将映射分配给list(string)
类型的变量。
list有索引和值,map有键和值。这意味着你可以通过指定索引来访问列表元素,例如,如果boot_disk
真的是一个列表,那么你可以得到位于第二的值:var.boot_disk[1]
。注意,索引从0开始,因此对于包含三个元素的列表,索引将是0、1和2。使用映射,您可以通过访问元素的键来获得元素的值。如果boot_disk
是一个映射,那么您可以使用:var.boot_disk["size"]
访问size
。或者,您可以使用不同的方法通过var.boot_disk.size
访问相同的值。关于不同类型变量的更多信息可以在[1]中找到。在[2]中可以找到一个如何使用变量的例子。
要将boot_disk
定义为map
,您需要执行以下操作:
variable "boot_disk" {
type = map(object({
image = string
size = number
type = string
}))
description = "Boot disk features."
default = {
image = "imagename"
size = 1000
type = "disktype"
}
}
attached_disks
变量看起来很好,如果这是你打算用它做的。
[1] https://www.terraform.io/language/expressions/types
[2] https://learn.hashicorp.com/tutorials/terraform/aws-variables