我正在尝试在Terraform v0.10.7上做一个非常基本的任务。
我使用terraform + vSphere提供了多达100个虚拟机,我希望能够同时启动多个资源创build,而不是一个接一个地启动。 目前第二个虚拟机只有在前一个虚拟机完成时才创build。
我试图阅读文档,但我没有find任何答案,有人可以帮助我吗?
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" } }
您需要使用count语句在一个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" } }
这是我的解决scheme:
我使用Ansible生成我的terraform文件。
为每台机器创build一个新的目录,并在每个directoy中为一个和唯一一台机器生成我的脚本。
最后,仍然使用Ansible,我为每个位置/每台机器使用一个with_items为每个脚本位置命令一个asynchronous的“terraform apply -var-file = XXX.tvars”并注册该命令。
虚拟机全部同时被触发。
通过提前注册我的命令,我现在可以访问一个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