Назад | Перейти на главную страницу

terraform и csv для источника данных

Поэтому я пытаюсь использовать Terraform для предоставления нескольких виртуальных машин в vSphere. У меня есть CSV-файл, содержащий информацию для подготовки гостей. Когда я жестко кодирую источники данных, виртуальные машины подготавливаются, но когда я пытаюсь использовать csv для заполнения тех же источников, план Terraform сообщает мне, что центр обработки данных не определен. Я пробовал как CSVDECODE, так и методы интерполяции, ни один из них не работал.

пример csvdecode:

locals {
  virtualmachines = csvdecode(file("${path.module}/virtualmachines.csv"))
}

data "vsphere_datacenter" "dc" {
  count = length(local.virtualmachines)
  name =  local.virtualmachines[count.index].dcname
}

пример интерполяции:


locals {
  virtualmachines = csvdecode(file("${path.module}/server_list.csv"))
}

    # Creating terraform resources from a CSV file using interpolation

    data "null_data_source" "csv_file" {
      inputs = {
        file_data = "${chomp(file("${path.module}/virtualmachines.csv"))}"
               }
    }

resource "null_resource" "csv_interpolation_method" {
  count = "${length(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))))}"

  triggers = {
    01 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 0)}"
    02 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 1)}"
    03 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 2)}"
    04 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 3)}"
    05 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 4)}"
    06 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 5)}"
    07 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 6)}"
    08 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 7)}"
    09 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 8)}"
    10 = "${element(split(",", element(slice(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")), 1, length(split("\n", lookup(data.null_data_source.csv_file.outputs, "file_data")))), count.index)), 9)}"
  }
}


locals {
  dcname    = null_resource.csv_interpolation_method.*.triggers.01
  storage   = null_resource.csv_interpolation_method.*.triggers.02
  pool      = null_resource.csv_interpolation_method.*.triggers.03
  vtemplate = null_resource.csv_interpolation_method.*.triggers.04
  vname     = null_resource.csv_interpolation_method.*.triggers.05
  cpu       = null_resource.csv_interpolation_method.*.triggers.06
  memory    = null_resource.csv_interpolation_method.*.triggers.07
  disk      = null_resource.csv_interpolation_method.*.triggers.08
  network   = null_resource.csv_interpolation_method.*.triggers.09
  guest_id  = null_resource.csv_interpolation_method.*.triggers.10
}

output "server_output" {
  value = "${local.dcname}"
}

data "vsphere_datacenter" "dc" {
  name = "${output.server_output}"
}

output "storage" {
  value = "${local.storage}"
}

data "vsphere_datastore" "datastore" {
  name          = "${local.storage}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

output "pool" {
  value = "${local.pool}"
}

data "vsphere_resource_pool" "pool" {
  name          = "${local.pool}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

output "network" {
  value = "${local.network}"
}

data "vsphere_network" "network" {
  name          = "${local.network}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

output "template" {
  value = "${local.vtemplate}"
}

data "vsphere_virtual_machine" "template" {
  name          = "${local.vtemplate}"
  datacenter_id = "${data.vsphere_datacenter.dc.id}"
}


resource "vsphere_virtual_machine" "vm" {
  count = length(local.virtualmachines)

  name             = local.virtualmachines[count.index].vname
  resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
  datastore_id     = "${data.vsphere_datastore.datastore.id}"

  num_cpus                   = local.virtualmachines[count.index].cpu
  memory                     = local.virtualmachines[count.index].memory
  guest_id                   = local.virtualmachines[count.index].guest_id
  wait_for_guest_net_timeout = 0

  network_interface {
    network_id = "${data.vsphere_network.network.id}"
  }

  disk {
    label = "disk0"
    size  = local.virtualmachines[count.index].disk
  }

  clone {
    template_uuid = "${data.vsphere_virtual_machine.template.id}"

образец содержимого csv:

dcname,storage,pool,vtemplate,vname,cpu,memory,disk,network,guest_id
txpla-w01-dc,txpla-w01-vsan,txpla-w01-shared01/Resources,AHLC75-template,terraform-test1,2,1024,80,Guest VLAN 1017,centos64Guest
txpla-w02-dc,txpla-w02-vsan,txpla-w02-shared01/Resources,AHLC75-template,terraform-test2,3,2048,80,Guest VLAN 1017,centos64Guest

Сообщение об ошибке от метода интерполяции (никогда не сводится к ресурсу)

A managed resource "output" "server_output" has not been declared in the root module

Любая помощь будет оценена ..

Спасибо

В Terraform, output В блоках объявляются значения, которые должны быть переданы вызывающему модулю (или, если вы уже находитесь в корневом модуле, будут отображаться в выводе консоли после применения).

Вы не можете ссылаться на них из модуля, который их определяет, поэтому Terraform интерпретирует output.server_output в качестве ссылки на ресурсы, например, в вашей конфигурации был блок, например resource "output" "server_output"от гипотетического поставщика с именем «output» (которого на самом деле не существует).

Если вы хотите сослаться на определенное значение из нескольких мест в тем же модуль без дублирования его выражения, вы можете использовать вместо него локальные значения. У тебя уже есть local.dcname, который является то, что output "server_output" относится к, поэтому, если вы замените output.server_output ссылка с local.dcname вместо этого он должен дать результат, который вы искали.