Назад | Перейти на главную страницу

Создание параллельных ВМ Terraform

Я пытаюсь выполнить очень простую задачу на Terraform v0.10.7.

У меня есть до 100 виртуальных машин для визуализации с использованием terraform + vSphere Provisionner, и я хочу иметь возможность запускать несколько ресурсов одновременно, а не одну за другой. На данный момент вторая виртуальная машина создается только после завершения работы предыдущей.

Я пытался прочитать документ, но не нашел ответа, может ли кто-нибудь мне помочь?

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"
  }
}

Вам нужно запустить все свои ВМ в одном 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"
  }
}

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

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

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

Я генерирую свои файлы терраформ с помощью 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

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

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

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

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

Вот ссылка с полным конфигом: terraformconfig