如何全局定义Terraform所需提供者及版本以规避TFLint警告?
解决Terraform多子目录配置重复的DRY方案
针对每个子目录main.tf重复添加terraform块违反DRY原则的问题,以下是可行的解决方案:
1. 使用Terraform模块统一管理公共配置
创建专门模块存放公共terraform块定义,让所有子目录配置引用该模块:
- 在项目根目录创建
modules/common-config目录,新建main.tf写入公共配置:
terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.20.1" } } required_version = ">= 1.1.7" }
- 每个子目录的
main.tf中引用该模块:
module "common_config" { source = "../../modules/common-config" } # 子目录原有配置...
注意:required_version是工作区级强制约束,模块中的声明仅作建议;但required_providers的版本约束会被合并,子目录无需重复定义AWS提供者版本。
2. 用符号链接共享公共配置文件
若环境支持符号链接(Linux/macOS默认支持,Windows需开启),可在根目录创建公共配置文件,再给每个子目录创建指向该文件的链接:
# 根目录生成公共配置文件 echo 'terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.20.1" } } required_version = ">= 1.1.7" }' > terraform-common.tf # 遍历子目录创建符号链接 for dir in */; do ln -s ../terraform-common.tf "$dir" done
修改根目录文件即可同步所有子目录配置,完全符合DRY原则。
3. 脚本批量生成/更新配置
用脚本批量给所有子目录的main.tf添加公共配置,避免手动重复操作:
示例Python脚本:
import os common_config = '''terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.20.1" } } required_version = ">= 1.1.7" } ''' # 遍历所有子目录的main.tf文件 for root, dirs, files in os.walk('.'): if 'main.tf' in files: tf_path = os.path.join(root, 'main.tf') with open(tf_path, 'r+') as f: content = f.read() # 避免重复添加配置块 if 'required_version' not in content: f.seek(0, 0) f.write(common_config + content)
关键说明
Terraform中每个独立工作区(单独执行terraform init/apply的子目录)默认不会继承父目录配置,因为每个工作区可拥有独立的版本与提供者约束。上述方案通过外部手段实现配置复用,解决DRY问题。
内容的提问来源于stack exchange,提问作者Andreas L.
相关产品推荐
相关产品推荐

