我正在尝试在 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 速率限制问题。
答案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配置