我在json文件中有两个对象数组,我将它们作为tfvar文件通过cli命令传递。一个是口味列表,另一个是图像列表。我想做的是为每种口味和图像创建一个VM,并将它们组合在一起。
这是图像数组的示例:
{
"image_list" : [
{
"ID": "e7d95104-4d15-4087-ab32-4a33f580d664",
"Name": "CentOS-7-x86_64",
"Status": "active"
},
{
"ID": "d266a91a-9bfb-4b32-b0de-f9940adc4017",
"Name": "Debian-8-x86_64",
"Status": "active"
},
{
"ID": "912967ae-4ee8-4aab-ad6d-b97aeeac3526",
"Name": "Debian-9-x86_64",
"Status": "active"
}
]
}
这是风味列表的示例:
{
"flavor_list": [
{
"ID": "00000000-0000-000A-0001-000000001024",
"Name": "T1-1vCPU-1GB-RAM",
"RAM": 1024,
"Disk": 50,
"Ephemeral": 0,
"VCPUs": 1,
"Is_Public": true
},
{
"ID": "00000000-0000-000A-0002-000000002048",
"Name": "T1-2vCPU-2GB-RAM",
"RAM": 2048,
"Disk": 50,
"Ephemeral": 0,
"VCPUs": 2,
"Is_Public": true
},
{
"ID": "01829284-4e5e-4bf8-a753-525dc59e8476",
"Name": "M1-4vCPU-32GB-RAM",
"RAM": 32768,
"Disk": 50,
"Ephemeral": 0,
"VCPUs": 4,
"Is_Public": true
}
]
}
我已按照https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/的说明进行操作,但是它不起作用,并且错误消息也无济于事。
这是我的tf文件:
# Configure the OpenStack Provider
provider "openstack" {
# I have ommited the content here
}
variable "image_list" {
type = list(object({
ID = string
Name = string
Status = string
}))
default = [
{
ID = "912967ae-4ee8-4aab-ad6d-b97aeeac3526",
Name = "Debian-9-x86_64",
Status = "active"
}
]
}
variable "flavor_list" {
type = list(object({
ID = string
Name = string
RAM = number
Disk = number
Ephemeral = number
VCPUs = number
Is_Public = bool
}))
}
# Create a web server
resource "openstack_compute_instance_v2" "Odin_test_VMs" {
for_each = var.flavor_list
dynamic "flavor" {
for_each = var.flavor_list
content {
name = flavor_list.value.Name
}
}
dynamic "image" {
for_each = var.image_list
content {
id = image.value.ID
}
}
name = "VM_${flavor.value.name}"
flavor_name = flavor.value.name
image_id = image.value.id
network {
name = "1234362-network"
uuid = "cb7be82b-e521-4b21-b82c-fb084abe8d3b"
}
}
即使在提出了mjpgpy3建议之后,我仍然收到相同的错误消息:
Error: Reference to undeclared resource
on odin_test.tf line 61, in resource "openstack_compute_instance_v2" "Odin_test_VMs":
61: name = "VM_${flavor.value.name}"
A managed resource "flavor" "value" has not been declared in the root module.
Error: Reference to undeclared resource
on odin_test.tf line 62, in resource "openstack_compute_instance_v2" "Odin_test_VMs":
62: flavor_name = flavor.value.name
A managed resource "flavor" "value" has not been declared in the root module.
Error: Reference to undeclared resource
on odin_test.tf line 63, in resource "openstack_compute_instance_v2" "Odin_test_VMs":
63: image_id = image.value.id
A managed resource "image" "value" has not been declared in the root module.
答案 0 :(得分:0)
我瞥了一眼您的地形会看到一些错误。
所有变量(使用时)必须使用var.
访问。例如,使用var.flavor_list
而不是flavor_list
。
dynamic
块需要嵌套的content
块,这是实际分配属性的位置。 for_each
仅指定您要迭代的集合。
所以,而不是像这样的用法
dynamic "image" {
for_each = [for i in image_list: {
id = i.ID
}]
}
您可能需要类似以下内容(请注意,其中包含var
更改)
dynamic "image" {
for_each = var.image_list
content {
id = image.value.ID
}
}
有关dynamic
块如何工作的更多信息,请参见terraform docs。