我们正在尝试为AWS中的以下活动创建Terraform模块,以便我们可以在需要的地方使用它们 .
-
VPC创建
-
子网创建
-
实例创建等
但是在创建这些模块时,我们必须在上面列出的所有模块中定义提供者 . 所以我们决定为提供者创建一个模块,以便我们可以在其他模块(VPC,Subnet等)中调用该提供者模块 .
上述方法的问题在于它没有采用提供者值,并要求用户输入区域 .
Terraform配置如下:
$ HOME / modules / providers / main.tf
provider "aws" {
region = "${var.region}"
}
$ HOME / modules / providers / variables.tf
variable "region" {}
$ HOME / modules / vpc / main.tf
module "provider" {
source = "../../modules/providers"
region = "${var.region}"
}
resource "aws_vpc" "vpc" {
cidr_block = "${var.vpc_cidr}"
tags = {
"name" = "${var.environment}_McD_VPC"
}
}
$ HOME / modules / vpc / variables.tf
variable "vpc_cidr" {}
variable "environment" {}
variable "region" {}
$ HOME / main.tf
module "dev_vpc" {
source = "modules/vpc"
vpc_cidr = "${var.vpc_cidr}"
environment = "${var.environment}"
region = "${var.region}"
}
$ HOME / variables.tf
variable "vpc_cidr" {
default = "192.168.0.0/16"
}
variable "environment" {
default = "dev"
}
variable "region" {
default = "ap-south-1"
}
然后,当在 $HOME/
位置运行 terraform plan
命令时,它不会获取提供程序值,而是要求输入区域的用户输入 .
我需要Terraform专家的帮助,我们应采取什么方法来解决以下问题:
-
在Terraform模块中包装提供程序
-
使用提供程序模块或任何其他方式处理多个区域用例 .
1 回答
我很久以前就知道不可能这样做,因为Terraform构建了一个图表,在它包含任何依赖项之前需要任何资源的提供程序,并且以前不可能强制依赖于模块 .
但是,自Terraform 0.8以来,现在可以使用以下语法设置dependency on modules:
但是,如果我通过更改
modules/vpc/main.tf
来尝试使用您的设置,看起来像这样:然后对它运行
terraform graph | dot -Tpng > graph.png
它看起来像那里没有't change at all from when the explicit dependency isn' .这似乎可能是Terraform中图形构建阶段的一个潜在错误,它可能应该被提升为issue但我不知道核心代码库是否足以发现需要进行更改的位置 .
对于我们的使用,我们在Terraform代码库中大量使用符号链接,其中一些在Terraform支持其他处理方式之前具有历史意义,但可以在此处使用 .
我们只需在单个
.tf
文件(例如environment.tf
)中定义提供程序,以及您运行Terraform的每个地方所需的任何其他通用配置(即不在模块级别),然后将其符号链接到每个位置 . 这允许我们在必要时在可覆盖变量的单个位置定义提供者 .