Я пытаюсь подготовить 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 раз, каждый раз, когда обрабатывается новая виртуальная машина?
Любой указатель в правильном направлении приветствуется.