有没有一种方法可以为项目中定义的所有模块提取提供程序 .
例如,我有这个项目
├── modules
│ ├── RDS
│ └── VPC
└── stacks
├── production
│ └── main.tf
└── staging
└── main.tf
它工作得很好......问题在于模块的定义
├── RDS
│ ├── README.md
│ ├── main.tf
│ ├── providers.tf
│ └── variables.tf
└── VPC
├── README.md
├── main.tf
├── providers.tf
└── variables.tf
这两个模块中的提供者完全相同
# providers.tf
provider "aws" {
region = "${var.region}"
version = "~> 1.26"
}
并且每个模块中的变量都不同,但它们都具有 region
变量 .
# variables.tf
variable "region" {
default = "eu-central-1"
description = "AWS region."
}
# other module dependent variables...
有没有办法在模块级别定义那些信息位,以便我最终得到类似于此的东西
├── modules
│ ├── providers.tf <<< include the *shared* provider definition block
│ ├── variables.tf <<< include the *shared* region vaiable definition block
│ ├── RDS
│ │ ├── README.md
│ │ ├── main.tf
│ │ └── variables.tf
│ └── VPC
│ ├── README.md
│ ├── main.tf
│ └── variables.tf
最后一件事,大多数时候模块定义都有一个资源属性(从terraform注册表中提取一个模块......因此我不知道从注册表和基础模块继承源代码是否可行)
3 回答
如果你知道terragrunt,那就没问题了 .
它专为您遇到的问题而设计 .
快速入门
查看terragrunt-infrastructure-modules-example和terragrunt-infrastructure-live-example repos,了解演示这些功能的完整工作示例代码
您可以将
prod/terraform.tfvars
或prod/account.tfvars
用于全局变量,或将tfvars文件放在_global
文件夹下 .现在,不可能实现这一目标 . 之前有关github的讨论涉及以下问题中的同一主题:
https://github.com/hashicorp/terraform/issues/5480
https://github.com/hashicorp/terraform/issues/4585
https://github.com/hashicorp/terraform/issues/2714
https://github.com/hashicorp/terraform/issues/1742
TL;DR
模块之间共享变量是违反terraform核心清晰度/明确性原则的 .
您可以通过传入要使用的提供程序别名来从模块中抽象提供程序参数 . 这允许您创建一个模块而不引用Region之类的东西,然后在调用时传递这些细节 .
对于您的用例,您可以在堆栈文件夹中定义别名提供程序(可能最好在文件中定义它并为每个堆栈文件夹创建符号链接):
然后,当您调用模块时,传入要使用的提供程序别名(假设模块仅使用任何特定提供程序类型中的1个):