【问题标题】:Iterate over a list of json objects in terraforms 0.12.23迭代 terraforms 0.12.23 中的 json 对象列表
【发布时间】:2020-03-06 14:39:58
【问题描述】:

我在一个 json 文件中有两个对象数组,我通过 cli 命令将它们作为 tfvar 文件传递​​。一个是风味列表,另一个是图像列表。我想做的是为每种风格和图像创建一个 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.

【问题讨论】:

  • 您能分享您收到的错误消息吗?
  • 已经编辑了完整错误的问题,但基本上是Error: Reference to undeclared resource

标签: terraform openstack terraform-provider-openstack


【解决方案1】:

我可以通过浏览您的 terraform 看到几个错误。

所有变量在使用时必须使用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

【讨论】:

  • 感谢您的回答。我完全错过了嵌套content 块的必要性。但即使在更改之后,由于dynamic 块,我也会遇到错误。 ```
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多