我正在配置Terraform以在VMware中配置虚拟机。将为每个VM分配第二个与特定VLAN连接的网络适配器。根据虚拟机的名称分配VLAN
数据源似乎可以很好地查询,因为它们都存在。但是,我无法将count.index传递到network_interface部分的network_id中。 我已经尝试了以下方法:
network_id = "${data.vsphere_network.network1."${var.policy_name}".id}"
network_id = "${"${format("%s", "data.vsphere_network.network1.${count.index}.id")}"}"
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数量)
答案 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。