Terraform parallel VM creation

I'm trying to do a very basic task on Terraform v0.10.7.

I have up to 100 VM to be povisionned using terraform + vSphere provisionner and I want to be able to launch several resource creations in the same time and not one after the other. For the moment the second VM is created only if the previous one is finished.

I've tried to read the doc but I didn't found any answer, could somebody help me ?

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"
  }
}
0
задан 20 October 2017 в 16:56
4 ответа

Это мое решение:

Я генерирую файлы терраформирования с помощью Ansible.

Новый каталог создается для каждой машины, и я генерирую свои скрипты в каждой директории для ОДНОЙ и только ОДНОЙ машина.

Наконец, все еще используя 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
0
ответ дан 4 December 2019 в 13:29

Вам необходимо запустить все свои виртуальные машины в одном ресурсе vsphere_virtual_machine , используя счетчик заявление. Счетчик начинается с 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
ответ дан 4 December 2019 в 13:29

Я пробую это и работает:

В этом примере я развертываю 3 виртуальных машины в одном файле с разными ресурсами, такими как имя хоста.

Измените ресурс переменной "vsphere_virtual_machine" "vm (number ) "количество виртуальных машин для развертывания:

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

Вот ссылка с полной конфигурацией: terraformconfig

0
ответ дан 4 December 2019 в 13:29

Некоторые поставщики (например, AWS) решают проблемы ограничения скорости API на более низком уровне, реализуя плавную отсрочку / повторную попытку в своих соответствующих клиентах API. По этой причине Terraform не использует эту функцию параллелизма для прямого обращения к ограничениям скорости API.

Проверьте официальный документ terraform

0
ответ дан 4 December 2019 в 13:29

Теги

Похожие вопросы