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"
}
}
Это мое решение:
Я генерирую файлы терраформирования с помощью 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
Вам необходимо запустить все свои виртуальные машины в одном ресурсе 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"
}
}
Я пробую это и работает:
В этом примере я развертываю 3 виртуальных машины в одном файле с разными ресурсами, такими как имя хоста.
Измените ресурс переменной "vsphere_virtual_machine" "vm (number ) "количество виртуальных машин для развертывания:
resource "vsphere_virtual_machine" "vm"
resource "vsphere_virtual_machine" "vm1"
resource "vsphere_virtual_machine" "vm2"
Вот ссылка с полной конфигурацией: terraformconfig
Некоторые поставщики (например, AWS) решают проблемы ограничения скорости API на более низком уровне, реализуя плавную отсрочку / повторную попытку в своих соответствующих клиентах API. По этой причине Terraform не использует эту функцию параллелизма для прямого обращения к ограничениям скорости API.