【发布时间】:2018-12-15 06:25:50
【问题描述】:
有没有办法为项目中定义的所有模块抽象提供者。
例如,我有这个项目
├── 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 注册表中提取一个模块......因此我不知道从注册表和基本模块继承源是否可行)
【问题讨论】:
-
您应该使用工作区/分支,而不是将环境放在目录中。这将解决您的问题并遵循最佳实践。 terraform.io/docs/enterprise/workspaces/repo-structure.html
-
我使用了最简单的解决方案来对 providers.tf 文件进行符号链接...我计划很快测试 terragrunt 并看看它是如何进行的...现在符号链接工作正常...至于工作区分支模型有点复杂(团队不会从中受益,因为我们都是 terraform 的新手)并且在尝试修复某些东西时只会将自己纠缠在分支中(需要在许多分支中应用)
-
@MattSchuchard terraform 链接提供了三个选项,一个是每个环境使用一个分支。对于典型的基于 git 的存储库,以这种方式使用分支违背了最基本的 git 指导。
-
向模块添加提供者闻起来是个坏主意。在您的父脚本中包含提供程序并声明模块块,然后将“继承”您已设置的提供程序。此外,他们已经正式支持共享。似乎他们只是在争论默认的 -var-file 位置。使用 -var-file 保持 DRY 并将其指向公共变量。添加这个 -var-file 有点不方便。
标签: terraform terraform-provider-aws