适用于VMware VM的Terraform模块

时间:2018-03-07 15:22:18

标签: terraform vsphere

在VMware中创建用于VM创建的模块。希望克隆VM模板。

因此,当需要添加更多磁盘时,需要添加模板提供的单个磁盘,或者在将来需要时添加磁盘

我不知道在虚拟机资源中添加另一个磁盘部分并使用插值语法将变量类型设置为映射是否有效?

如果有办法使用像jinja这样的东西进行模板化,那会很好。

正在进行的模块工作:

data "vsphere_datacenter" "dc" {
  name = "${var.vmw_dc}"
}

data "vsphere_datastore" "datastore" {
  name          = "${var.vmw_datastore}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_resource_pool" "pool" {
  name          = "${var.vmw_cluster}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_network" "network" {
  name          = "${var.vmw_network}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

resource "vsphere_virtual_machine" "vm" {
  name             = "${var.vm_name}"
  resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
  datastore_id     = "${data.vsphere_datastore.datastore.id}"

  num_cpus = "${var.vm_cpu}"
  memory   = "${var.vm_mem}"
  guest_id = "${var.vm_GuestType}"

  network_interface {
    network_id = "${data.vsphere_network.network.id}"
  }

  disk {
    label = "disk0"
    size  = 20
  }
  disk {
    label = "${var.vm_disk.*.label, count.index}"
  }
}

这样做非模块很容易。只需拥有一堆资源声明,如上面的代码。或者创建一个模块,只需在每个需要创建的VM的模块中传递变量。

如果忽略第二个磁盘声明,上面的内容适用于单个磁盘VM。但是如果我需要添加第二个磁盘,则需要第二个磁盘声明,第三个磁盘声明等等。

所以我想确定如果创建一个包含Disk2到X的映射或映射变量列表,那么在第二个磁盘声明中,其他磁盘将在执行terraform计划时被渲染。

"vm_disk" = {
  Disk2 = {label=X,Size=X,Position=X},
  Disk3 = {label=X,Size=X,Position=X},
  Disk4 = {label=X,Size=X,Position=X},
}

2 个答案:

答案 0 :(得分:1)

目前还没有办法在Terraform中拥有动态数量的子资源,因此您无法使用以下内容:

resource "vsphere_virtual_machine" "vm" {
  ...
  disk {
    count = "${length(var.disks)}"
    ...
  }
}

在AWS等其他提供商中,您的模块可以创建一个没有ebs_block_device资源的aws_instance子资源的实例,但是然后使用单独的aws_ebs_volume资源创建单独的磁盘,然后附加aws_volume_attachment资源,因为它们都是顶级资源,允许您使用count元参数动态设置每个实例获得的卷数。

虽然VSphere提供程序确实提供了单独的vsphere_virtual_disk资源,但是将这些单独的磁盘资源附加到VM的唯一方法是使用attach子资源的disk参数,这样您就可以了将无法在模块中动态附加不同数量的磁盘。

答案 1 :(得分:1)

任何具有相同名称的terraform子资源,例如disk的{​​{1}}和network,都只是一个对象数组。所以你可以改变

vsphere_virtual_machine

类似

disk {
  label = "disk0"
  size  = 20
}
disk {
  label = "disk1"
  size  = 20
}

从那里很容易看出,您可以创建一个变量或其他一些逻辑来构建阵列并将其分配给磁盘。

disk = [
  {
    label = "disk0"
    size = 20
  },
  {
    label = "disk0"
    size = 20
  }
]