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