无法用地形创建地图变量



我试图在我的变量文件中创建一个变量,我认为我可以用映射来做,但它不起作用。

在变量中。我有:

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

最新更新