Terraform 并行虚拟机创建

Terraform 并行虚拟机创建

我正在尝试在 Terraform v0.10.7 上执行一项非常基本的任务。

我最多需要使用 terraform + vSphere provisionner 配置 100 台虚拟机,我希望能够同时启动多个资源创建,而不是一个接一个地启动。目前,只有前一个虚拟机完成后才会创建第二个虚拟机。

我尝试阅读文档,但没有找到任何答案,有人可以帮助我吗?

variable "user" {}
variable "password" {}
variable "vsphere_server" {}


provider "vsphere" {

 user           = "${var.user}"

 password       = "${var.password}"

 vsphere_server = "${var.vsphere_server}"

 allow_unverified_ssl = "true"

}

resource "vsphere_virtual_machine" "dum03" {
  name          = "dum03"
  hostname      = "dumHN"
  folder        = "Ansible VM"
  vcpu          = 2
  memory        = 4096
  domain        = "MYDOMAIN"
  datacenter    = "myDatacenter"
  cluster       = "NET-TEST"

  network_interface {
    label              = "NET-TEST"
    ipv4_address       = "10.20.30.40"
    ipv4_prefix_length = "24"
    ipv4_gateway       = "10.20.30.254"
  }
  disk {
    datastore = "datastore"
    template  = "mytemplate"
  }
}

resource "vsphere_virtual_machine" "dum04" {
  name          = "dum4"
  hostname      = "dumHN2"
  folder        = "Ansible VM"
  vcpu          = 2
  memory        = 4096
  domain        = "MYDOMAIN"
  datacenter    = "myDatacenter"
  cluster       = "test"

  network_interface {
    label              = "NET-TEST"
    ipv4_address       = "15.25.35.45"
    ipv4_prefix_length = "24"
    ipv4_gateway       = "10.20.30.254"
  }
  disk {
    datastore = "mydatastore"
    template  = "mytemplate"
  }
}

答案1

您需要在一个vsphere_virtual_machine资源使用count语句内启动所有虚拟机。计数从 0 开始。

它应该是这样的:

variable "vm_count" = 2

resource "vsphere_virtual_machine" "dum" {
  name          = "dum${format("%02d", count.index+3)}"
  hostname      = "dumHN${count.index+1}"
  count         = "${var.vm_count}"
  folder        = "Ansible VM"
  vcpu          = 2
  memory        = 4096
  domain        = "MYDOMAIN"
  datacenter    = "myDatacenter"
  cluster       = "NET-TEST"

  network_interface {
    label              = "NET-TEST"
    ipv4_address       = "10.20.30.${40 + count.index * 5)}"
    ipv4_prefix_length = "24"
    ipv4_gateway       = "10.20.30.254"
  }
  disk {
    datastore = "datastore"
    template  = "mytemplate"
  }
}

答案2

一些提供商(例如 AWS)通过在各自的 API 客户端中实现优雅退避/重试来在较低级别处理 API 速率限制问题。因此,Terraform 不使用此并行功能直接解决 API 速率限制问题。

查看 terraform 的官方文档

答案3

这是我的解决方案:

我使用 Ansible 生成我的 terraform 文件。

为每台机器创建一个新目录,并且我在每个目录中为仅一台机器生成脚本。

最后,仍然使用 Ansible,我为每个脚本位置命令一个异步“terraform apply -var-file=XXX.tvars”,并为每个位置/每台机器命令一个 with_items 并注册此命令。

所有虚拟机均同时触发。

通过之前注册我的命令,我现在可以访问 job_id,因此现在我可以控制之后的结果。

- name: Apply ressource creation
  command: "terraform apply -var-file=./{{environment_name}}.tfvars 
-var-file=./instance.tfvars"
 args:
    chdir: /appli/terraform/{{item.name}}/
 async: 3600
 poll: 0
 with_items: "{{VM_provide}}"
 ignore_errors: yes
 register: creation


- name: Wait for the creation job to complete
  async_status: jid="{{creation_item.ansible_job_id}}"
  with_items: "{{creation.results}}"
  loop_control:
    loop_var: "creation_item"
  register: job_result
  until: job_result.finished
  retries: 200
  poll: 10

答案4

我尝试了这个并且有效:

在这个例子中,我在同一个文件中部署了 3 个具有不同资源(如主机名)的虚拟机。

将变量资源“vsphere_virtual_machine”“vm(number)”更改为要部署的虚拟机数量:

resource "vsphere_virtual_machine" "vm"
resource "vsphere_virtual_machine" "vm1"
resource "vsphere_virtual_machine" "vm2"

以下是完整配置的链接: terraform配置

相关内容