我对 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.
对于上下文,这是我正在尝试做的事情:
- 我有一个简单的模块,可以创建具有某些选项的 EC2 实例。(此模块创建 aws_instance 资源。)
- 我有第二个模块调用我的第一个模块并创建三个上述 EC2 实例并为每个节点设置一个唯一名称。
- 我有一个 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"
}