Циклический просмотр внешнего источника данных в терраформе - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь подготовить n виртуальных машин (предположим, что n = 5) в terraform.

Подвох в том, что для каждого IP-адреса, который назначается соответствующей виртуальной машине, мне сначала нужно вызвать внешний инструмент (.exe). Этот инструмент принимает 2 параметра: шаблон регулярного выражения для получаемого IP-адреса и имя машины. Затем инструмент считывает один единственный свободный IP-адрес, который будет использоваться на основе предоставленного регулярного выражения, из файла Sharepoint Excel, который действует как IPAM (решение для управления IP-адресами). Инструмент также обновляет файл Excel, чтобы в нем указывалось имя предоставленного компьютера рядом с возвращенным IP-адресом.

Для одной виртуальной машины это работает просто отлично, и все завершается, как и ожидалось, используя один внешний источник данных и один ресурс. Имя машины читается из входного файла, так же как и регулярное выражение для 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}"

Далее, имя виртуальной машины определяется на основе входного файла:

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 ВМ я сталкиваюсь со следующей проблемой: я могу перебирать n элементов в разделе ресурсов, таким образом порождая n ВМ; однако я не могу понять, как я могу сделать то же самое для внешнего источника данных, так как этот не поддерживает конструкции, предназначенные для циклов (count / length (...)). То, чего я достиг до сих пор, следует. Был определен новый файл .tf, который содержит все имена машин в списке:

variable machineNamesList {
        default = [ "terraform-firstMachine", "terraform-secondMachine"]
}

В разделе resource список циклически повторяется:

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}"

Но как я могу вызвать внешний инструмент n раз, каждый раз, когда обрабатывается новая виртуальная машина?

Любой указатель в правильном направлении приветствуется.

1 Ответ

0 голосов
/ 17 января 2019

Аргумент 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...
}

Более подробная информация об этом механизме содержится в с использованием переменных с разделом count документации Terraform. Хотя в примерах речь идет о блоках resource, механизм count работает одинаково для блоков resource и data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...