在Terraform中循环浏览外部数据源

时间:2019-01-16 18:11:46

标签: terraform

我正在尝试以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次外部工具?

任何朝着正确方向的指针都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

所有countresource块均支持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机制对resourcedata块都是相同的。