地形插值数据源

时间:2019-08-13 14:41:52

标签: terraform

我正在配置Terraform以在VMware中配置虚拟机。将为每个VM分配第二个与特定VLAN连接的网络适配器。根据虚拟机的名称分配VLAN

数据源似乎可以很好地查询,因为它们都存在。但是,我无法将count.index传递到network_interface部分的network_id中。 我已经尝试了以下方法:

  1. network_id = "${data.vsphere_network.network1."${var.policy_name}".id}"

  2. network_id = "${"${format("%s", "data.vsphere_network.network1.${count.index}.id")}"}"

  3. network_id = "${format("%s", "$${data.vsphere_network.network1.${count.index}.id")}"

唯一可行的方法是直接分配:

network_id = "${data.vsphere_network.network1.0.id}"

其中0是实例。

 data "vsphere_network" "network1" {
  count = "${var.count}"
  name = "${var.network_name1}-${format("%02d", count.index + var.start_index)}"
  datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
 }


 network_interface {
    network_id = "${data.vsphere_network.network1.0.id}" 
    adapter_type = "vmxnet3"
    use_static_mac = "${var.static_mac}"
 }

我希望将VLAN 01分配给VM01。要分配给VM02的VLAN 02,一直到48(由于我拥有的VLAN数量)

1 个答案:

答案 0 :(得分:0)

以下示例使用Terraform 0.12功能声明每个网络应有一个实例,并通过其网络ID标识每个实例,以便将来添加和删除网络也将导致相应实例的添加/删除: / p>

data "vsphere_network" "network1" {
  count = var.count
  name = "${var.network_name1}-${format("%02d", count.index + var.start_index)}"
  datacenter_id = data.vsphere_datacenter.datacenter.id
}

resource "vsphere_virtual_machine" "per_network" {
  # Create one VM per network and identify them using the
  # id value of each one.
  for_each = { for net in data.vsphere_network.network1 : net.id => net }

  # (...other virtual machine arguments...)

  network_interface {
    # each.key is the key from the map in for_each, which is
    # the network id in this case
    network_id = each.key
  }
}

在这里使用for_each有两个主要优点:

  • 对于将来的读者来说,它的目的是为每个网络创建一个VM,因为在for_each表达式中直接引用了网络数据资源。

  • 它允许您选择按键,Terraform在状态下跟踪它们时将通过它们识别每个实例。由于在这种情况下虚拟机由其网络唯一标识,因此我们使用网络接口ID,因此Terraform将能够正确地推断出例如添加新网络应导致创建新的VM,而删除网络应仅导致破坏相应 VM。