0

我对 Terraform 和调用模块的模块有疑问。每当我调用嵌套模块时,我得到的唯一输出是:

No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration
and found no differences, so no changes are needed.

对于上下文,这是我正在尝试做的事情:

  1. 我有一个简单的模块,可以创建具有某些选项的 EC2 实例。(此模块创建 aws_instance 资源。)
  2. 我有第二个模块调用我的第一个模块并创建三个上述 EC2 实例并为每个节点设置一个唯一名称。
  3. 我有一个 Terraform 项目,它只调用第二个模块。

以上两个模块保存在我的私人 GitLab 注册表中。如果我创建了一个仅调用第一个模块的 Terraform 项目,它将创建 EC2 实例。如果我像执行普通项目一样执行第二个模块,则会创建三个 EC2 实例。我的问题是当我调用第二个模块时,它应该调用第一个模块,但它是它分崩离析的地方。

我想知道是否真的支持这种配置。我尝试测试的用例是建立一个 Kubernetes (K8s) 集群。我创建了一个定义计算资源的模块。然后,我创建了第二个模块,该模块使用 K8s 集群所需的选项定义计算模块。最后,我有一个项目,它定义了需要多少个 K8s 节点以及在哪些区域/可用区。

我将此称为嵌套模块,但在我所有的搜索中,嵌套模块似乎只指位于调用它们的 Terraform 项目中的模块和子模块。

在这里的任何帮助将不胜感激。这是我创建资源和调用模块的方式。这些是我用于测试的简单示例,而不是我将要创建的 K8s 模块。我只是想弄清楚我是否可以让嵌套的私有注册表模块工作。

第一个模块(计算)

resource "aws_instance" "poc-instance" {
  ami        = var.ol8_ami
  key_name   = var.key_name
  monitoring = true
  vpc_security_group_ids = [
    data.aws_security_group.internal-ssh-only.id,
  ]
  root_block_device {
    delete_on_termination = true
    encrypted             = true
    volume_type           = var.ebs_volume_type
    volume_size           = var.ebs_volume_size
  }

  availability_zone = var.availability_zone
  subnet_id         = var.subnet_id
  instance_type     = var.instance_type
  tags              = var.tags
  metadata_options {
    http_tokens   = "required"
    http_endpoint = "disabled"
  }
}

第二个模块(嵌套集群)

module "ec2_instance" {
  source = "gitlab.example.com/terraform/compute/aws"

  for_each = {
    0 = "01"
    1 = "02"
    2 = "03"
  }

  tags = {
    "Name"    = "poc-nested_ec2${each.value}"
    "service" = "terraform test"
  }
}

Terraform 项目

module "sample_cluster" {
  source = "gitlab.example.com/terraform/nested-cluster/aws"
}
4

0 回答 0