terraform - 在模块内的模块之间传递 Terraform 变量?

标签 terraform kubespray

我遇到了一个问题,我在从 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}"
}

如果我从 modules/kubespray/中的子模块内部运行我的 terraform init/apply 它工作正常

如果我从我的 role/kubespray 运行

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

失败了

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

非常感谢您的帮助

最佳答案

当您运行terraform时,该目录将成为隐式“根模块”。正如 Input Variables 中所解释的那样根据文档,根模块可以从 CLI 或环境访问 TF 输入,但所有其他调用的模块都需要传入这些输入。

我假设发生的情况可能是您的 ~kubespray/variables.tf 输入变量分配了正在生效的默认值。如果是这种情况,则应将它们复制到 ~terraform_setup/variables.tf 并传递到调用模块中:

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

关于terraform - 在模块内的模块之间传递 Terraform 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59995337/

相关文章:

google-cloud-platform - 在 Terraform for GCP 中允许帐户和角色时出错

Terraform - 列表项的前提条件

Azure:如何使用 Terraform 在 Azure 中设置多重身份验证策略?

Terraform 版本.tf

kubernetes - 从某些Kubernetes容器到同一集群中其他容器的主机没有路由

kubernetes - K8s - 将 kubeadm 添加到现有集群

terraform - GKE 节点池状态停留在“PROVISIONING”状态

windows - 使用 Kubespray 和 Windows Worker 支持设置 Kubernetes

docker - 为什么我无法从其他节点 IP 访问 kubernetes pod?

kubernetes - 如何显式定义 Kubernetes 服务的端点