1

地形模块:

resource "netbox_device" "device" {
  name     = var.name
  site     = var.site
  tenant   = var.tenant
  rack     = var.rack
  position = var.position
  type     = var.type
  role     = var.role
  status   = var.status
}


resource "netbox_interface" "device_interface" {
  for_each = var.connections
  name     = each.key
  device   = netbox_device.device.id
}

resource "netbox_cable" "device_connections" {
  for_each         = var.connections
  device_a_name    = netbox_device.device.name
  interface_a_name = each.key
  device_b_name    = each.value.device
  interface_b_name = each.value.interface
}

主要清单:

 19 module "cmp1_test" {
 20   source   = "../../modules/device"
 21   name     = "cmp1"
 22   site     = "example.site"
 23   rack     = "111"
 24   position = 15
 25   type     = "Generic-1U"
 26   role     = "cmp"
 27   connections = {
 28     "eth0" = { device = "san-s1-1", interface = "Ethernet 5" },
 29     "eth1" = { device = "san-s1-2", interface = "Ethernet 6" },
 30     "ipmi" = { device = "san-s1-1", interface = "Ethernet 7" }
 31   }
 32 }

需要导入资源状态:

  1. 导入设备状态——好的

terraform import module.cmp1_test.netbox_device.device 2828 - 工作正常

  1. 导入相关接口:

terraform import module.cmp1_test.netbox_interface.device_interface["eth0"] 330033

出错了

未找到匹配项:module.cmp1_test.netbox_interface.device_interface[eth0]

哪种是导入所有资源的正确方法?


创建后的 tfstate 如下所示:

 {
      "module": "module.cmp1_test",
      "mode": "managed",
      "type": "netbox_device",
      "name": "device",
      "provider": "provider.netbox",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "face": 0,
            "id": "2828",
            "name": "cmp1",
            "position": 15,
            "rack": "111",
            "role": "cmp",
            "serial": "",
            "site": "example.site",
            "status": "Planned",
            "tenant": "VPC",
            "type": "Generic-1U"
          },
          "private": "bnVsbA=="
        }
      ]
    },
    {
      "module": "module.cmp1_test",
      "mode": "managed",
      "type": "netbox_interface",
      "name": "device_interface",
      "each": "map",
      "provider": "provider.netbox",
      "instances": [
        {
          "index_key": "eth0",
          "schema_version": 0,
          "attributes": {
            "description": null,
            "device": 2828,
            "enabled": null,
            "form_factor": null,
            "id": "31303",
            "lag": null,
            "mgmt_only": null,
            "mode": null,
            "mtu": null,
            "name": "eth0",
            "type": 1200
          },
          "private": "bnVsbA==",
          "dependencies": [
            "module.cmp1_test.netbox_device.device"
          ]
        },

4

1 回答 1

3

您的 shell 正在解释资源地址中的引号,因此在 Terraform 可以解释它们之前删除它们。

如果您使用的是类 Unix 系统(例如 Linux、Mac OS X),您可以使用单引号将双引号逐字传递给 Terraform:

terraform import 'module.cmp1_test.netbox_interface.device_interface["eth0"]' 330033

如果您使用的是 Windows,请使用普通的 Windows 命令提示符(不是PowerShell)并使用反斜杠转义将双引号逐字传递给 Terraform:

terraform import module.cmp1_test.netbox_interface.device_interface[\"eth0\"] 330033

如果您使用的是 PowerShell,则必须禁用PowerShell 的解析器以确保它不会尝试将参数解释为 PowerShell 表达式,使用 "Stop Parsing" 符号--%,然后使用与上述普通 Windows 命令提示符相同的转义:

terraform --% import module.cmp1_test.netbox_interface.device_interface[\"eth0\"] 330033
于 2020-06-30T02:09:11.640 回答