Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于VMware虚拟机的Terraform模块_Terraform_Vsphere - Fatal编程技术网

用于VMware虚拟机的Terraform模块

用于VMware虚拟机的Terraform模块,terraform,vsphere,Terraform,Vsphere,我正在VMware中创建一个用于VM创建的模块,并希望克隆一个VM模板。挂起是指在模板提供的单个磁盘之外添加更多磁盘,或者在将来需要时添加一个磁盘 我不知道在虚拟机资源中添加另一个磁盘部分并使用插值语法将变量类型设置为映射是否有效 如果有一种方法可以使用像jinja这样的东西作为模板,那就太好了 正在进行的模块工作: data "vsphere_datacenter" "dc" { name = "${var.vmw_dc}" } data "vsphere_datastore" "dat

我正在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的映射或映射变量列表,那么在第二个磁盘声明中,其他磁盘将在执行
地形平面图时呈现

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

目前还没有一种方法可以在地形中拥有动态数量的子资源,因此您不能简单地使用以下内容:

resource "vsphere_virtual_machine" "vm" {
  ...
  disk {
    count = "${length(var.disks)}"
    ...
  }
}
在其他提供商(如AWS)中,您的模块可以创建一个实例,而不使用
AWS\u实例
资源的任何
ebs\u块
子资源,但随后使用单独的
AWS\u ebs\u卷
资源创建单独的磁盘,然后使用
AWS\u卷附件
资源进行连接,因为它们都是顶级资源,所以允许您使用
count
元参数动态设置每个实例获得的卷数量


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

任何子资源对于
vsphere\u virtual\u machine
,具有相同名称的terraform中的资源,如
磁盘
网络
,只是一个对象数组。所以你可以改变

disk {
  label = "disk0"
  size  = 20
}
disk {
  label = "disk1"
  size  = 20
}
差不多

disk = [
  {
    label = "disk0"
    size = 20
  },
  {
    label = "disk0"
    size = 20
  }
]
从这里很容易看出,您可以创建一个变量或其他逻辑来构建阵列,然后将其分配给磁盘

disk = ${var.disks}

您能否发布您编写的代码,并解释它如何不执行您希望它执行的操作?@ydaetskcoR编辑了这篇文章以包含更多信息。我只是想看看我所想的作为一个模块是否可行。这就是我得到的att。我考虑了sperate虚拟磁盘资源,但正如您所说的,仍然需要一个带有attach的磁盘子资源,所以仍然是相同的问题。只是在terraform上学习,所以不确定在某种程度上是否可行。您可以提出一个功能请求问题,或者,如果您愿意编写Go并熟悉VSphere,甚至可以编写一个pull请求来添加
VSphere\u磁盘\u附件
资源。这种方法对我很有效,将“附加磁盘”作为变量传入自定义vsphere模块,然后使用
disk0
本地变量进行压缩。