我正在尝试以Terraform方式配置n个VM(假设n = 5)。
要注意的是,对于分配给相应VM的每个IP,我首先需要调用一个外部工具(.exe)。该工具有两个参数:要获取IP的正则表达式模式和计算机名称。然后,该工具从充当IPAM(IP地址管理解决方案)的Sharepoint Excel文件中读出一个基于提供的正则表达式的单个免费IP地址。该工具还会更新Excel文件,以便在返回的IP旁边标记提供的计算机名称。
对于单个VM,这可以正常工作,并且可以利用一个外部数据源和一个资源按预期完成所有操作。从输入文件读取机器名称,该输入文件与IP的正则表达式相同,后者使用其自己的文件。然后调用外部工具:
data "external" "Machine_name" {
program = ["cmd.exe", "/c type c:\\Users\\malbert\\Desktop\\Excel2VM\\MachineName.txt"]
}
data "external" "IPregexMatchPattern" {
program = ["cmd.exe", "/c type c:\\Users\\malbert\\Desktop\\Excel2VM\\IPregexMatchPattern.txt"]
}
output "MachineName" {
value = "${data.external.Machine_name.result.name}"
}
data "external" "NetworkObtainedData" {
program = ["cmd.exe", "/c ExcelUpdateTool.exe ${data.external.IPregexMatchPattern.result.IPregex} ${data.external.Machine_name.result.name} available" ]
}
# Use as an output so the user can see the value as well
output "ip" {
value = "${data.external.NetworkObtainedData.result.ip}"
}
output "netmask" {
value = "${data.external.NetworkObtainedData.result.netmask}"
}
output "gw" {
value = "${data.external.NetworkObtainedData.result.gw}"
接下来,根据输入文件为VM命名:
resource "vsphere_virtual_machine" "vm" {
# Name the VM
name = "${data.external.Machine_name.result.name}"
resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
但是,当尝试扩展n个VM时,我遇到了以下问题:我可以遍历资源部分中的n个项目,从而生成n个VM; 但是我不知道如何为外部数据源做同样的事情,因为这个不支持为循环设计的构造(count / length(...))。我到目前为止所取得的成就如下。定义了一个新的.tf文件,以便该文件在列表中包含计算机的所有名称:
variable machineNamesList {
default = [ "terraform-firstMachine", "terraform-secondMachine"]
}
在资源部分下,该列表循环显示:
resource "vsphere_virtual_machine" "vm" {
count = "${length(var.machineNamesList)}"
# We'll name the VM the same as the guest running inside
name = "${var.machineNamesList[count.index]}"
resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
但是,每次处理新的VM时,我如何才能调用n次外部工具?
任何朝着正确方向的指针都会受到赞赏。
答案 0 :(得分:1)
所有count
和resource
块均支持data
自变量 ,因此您可以通过在各种对象上设置count
来实现到相同的表达式:
variable "machine_count" {
}
data "external" "machine_name" {
count = "${var.machine_count}"
# (presumably in practice you'll use count.index in here somewhere)
program = ["cmd.exe", "/c", "type c:\\Users\\malbert\\Desktop\\Excel2VM\\MachineName.txt"]
}
resource "vsphere_virtual_machine" "vm" {
count = "${var.machine_count}"
name = "${data.external.machine_name.*.result.name[count.index]}"
# ...etc...
}
Terraform文档的using variables with count
部分中有关于此机制的更多信息。尽管其中的示例讨论的是resource
块,但count
机制对resource
和data
块都是相同的。