Передача переменных Terraform между модулями внутри модулей? - PullRequest
1 голос
/ 31 января 2020

У меня проблема с застреванием при сборке модуля из проекта Kubespray .

У меня следующая структура папок:

terraform/
modules/
   kubespray/
      modules/
         compute/
         ips/
         network/
      main.tf
      variables.tf
roles/
    kubespray/
        terraform_setup/
             main.tf

Внутри В модуле kubespray/main.tf есть переменные, которые передаются:

module "ips" {
  source = "./modules/ips"

  number_of_k8s_masters         = "${var.number_of_k8s_masters}"
  number_of_k8s_masters_no_etcd = "${var.number_of_k8s_masters_no_etcd}"
  number_of_k8s_nodes           = "${var.number_of_k8s_nodes}"
  floatingip_pool               = "${var.floatingip_pool}"
  number_of_bastions            = "${var.number_of_bastions}"
  external_net                  = "${var.external_net}"
  network_name                  = "${var.network_name}"
  router_id                     = "${module.network.router_id}"
}

module "compute" {
  source = "./modules/compute"
  ...
  k8s_master_fips                              = "${module.ips.k8s_master_fips}"
  k8s_master_no_etcd_fips                      = "${module.ips.k8s_master_no_etcd_fips}"
  k8s_node_fips                                = "${module.ips.k8s_node_fips}"
  bastion_fips                                 = "${module.ips.bastion_fips}"
  ...
}
output "private_subnet_id" {
  value = "${module.network.subnet_id}"
}

output "floating_network_id" {
  value = "${var.external_net}"
}

output "router_id" {
  value = "${module.network.router_id}"
}

output "k8s_master_fips" {
  value = "${concat(module.ips.k8s_master_fips, module.ips.k8s_master_no_etcd_fips)}"
}

output "k8s_node_fips" {
  value = "${module.ips.k8s_node_fips}"
}

output "bastion_fips" {
  value = "${module.ips.bastion_fips}"
}

Если я запускаю свою инициализацию / применение terraform изнутри подмодуля в modules/kubespray/ Он работает нормально

Если я запускаю из моего модуля role/kubespray с

module "kubespray" {
  source    = "../../../modules/kubespray"
  providers = {
    openstack.src = openstack
  }
}

с ошибкой

Ошибка: недопустимый индекс

на ../../../modules/kubespray/ modules / compute / main.tf строка 670, в ресурсе "openstack_compute_floatingip_associate_v2" "k8s_node": 670: плавающий_ip = "$ {var.k8s_node_fips [count.index]}" | ------------- --- | count.index равен 0 | var.k8s_node_fips - пустой список динамич c

Справка будет крайне полезна

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Когда вы запускаете terraform, каталог становится неявным "root module". Как объясняется в документации Входные переменные , модули root могут получать доступ к входам TF из CLI или среды, но все другие вызываемые модули должны передавать их.

I'm при условии, что, возможно, ваши ~kubespray/variables.tf входные переменные имеют значения по умолчанию, которые вступают в силу. Если это так, то они должны быть скопированы в ~terraform_setup/variables.tf и переданы в вызывающий модуль:

module "kubespray" {
  source    = "../../../modules/kubespray"
  providers = {
    openstack.src = openstack
  }
}
0 голосов
/ 31 января 2020

Не запрашивая дополнительной информации, я предполагаю, что в (${var.k8s_node_fips[count.index]}) передается пустой массив со значением больше 0 для var.node_root_volume_size_in_gb и var.number_of_k8s_nodes_no_floating_ip, что вызывает ошибку при попытке индексации пустой массив для строки, которая требуется для объявления ресурса.

Error: Invalid index

on ../../../modules/kubespray/modules/compute/main.tf line 670, in resource "openstack_compute_floatingip_associate_v2" "k8s_node": 670: floating_ip = "${var.k8s_node_fips[count.index]}" |---------------- | count.index is 0 | var.k8s_node_fips is empty list of dynamic

В соответствии с ошибкой может показаться, что это может быть ошибка интерполяции при ${var.k8s_node_fips[count.index]}. Кажется, что происходит то, что переменная пуста, но count установлен в ненулевое число, что приводит к ошибке TF.

Глядя на исходный код проекта, кажется как переменная count зависит от var.node_root_volume_size_in_gb, чтобы быть 0, чтобы быть установленным в 0; в противном случае для счетчика будет установлено значение var.number_of_k8s_nodes_no_floating_ip.

Фрагмент, в котором ошибка, по-видимому, возникает при:

resource "openstack_compute_instance_v2" "k8s_node_no_floating_ip_custom_volume_size" {
  name              = "${var.cluster_name}-k8s-node-nf-${count.index+1}"
  count             = "${var.node_root_volume_size_in_gb > 0 ? var.number_of_k8s_nodes_no_floating_ip : 0}"
  availability_zone = "${element(var.az_list, count.index)}"
  image_name        = "${var.image}"
  flavor_id         = "${var.flavor_k8s_node}"
  key_pair          = "${openstack_compute_keypair_v2.k8s.name}"

  block_device {
    uuid                  = "${data.openstack_images_image_v2.vm_image.id}"
    source_type           = "image"
    volume_size           = "${var.node_root_volume_size_in_gb}"
    boot_index            = 0
    destination_type      = "volume"
    delete_on_termination = true
  }

Надеюсь, это поможет

...