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