terraform - Terraform:如何根据条件在模块中设置变量?
问题描述
我想传递一个变量,允许我为 AWS 实例指定 VPC 列表和子网设置。有固定的 VPC 和子网设置是有意义的,所以我只想允许用户使用单个变量选择一个,即使用 A 或 B。
例如,假设我有两个可用的 VPC,它们在variables.tf
模块的文件中指定my_instance
:
variable "a_vpc_cidr_block" { default = "105.191.44.0/22" }
variable "a_vpc_id" { default = "id_a"}
variable "a_vpc_name" { default = "vpc_a" }
variable "a_subnet_availability_zone" { default = "us-east-1a" }
variable "a_subnet_cidr_block" { default = "105.191.25.0/25" }
variable "a_subnet_name" { default = "instance_A" }
variable "b_vpc_cidr_block" { default = "105.191.45.0/22" }
variable "b_vpc_id" { default = "id_b"}
variable "b_vpc_name" { default = "vpc_b" }
variable "b_subnet_availability_zone" { default = "us-east-1a" }
variable "b_subnet_cidr_block" { default = "105.191.35.0/25" }
variable "b_subnet_name" { default = "instance_B" }
该my_instance
模块将采用环境将指定的单个输入变量,其值为“A”或“B”(有没有办法将变量的选项限制为值列表,例如options=['A', 'B']
?),并将在terraform.tf
具有单个实例的 Terraform 配置中这样调用:
module "my_instance" {
source = "../../modules/my_instance"
option = "A"
}
我现在想在模块的主文件 ( modules/my_instance/my_instance.tf
) 中实现一些逻辑,在该文件中它决定应该使用modules/my_instance/variables.tf
. 我想要这样的东西(伪代码):
if var.option == 'A'
vpc_cidr_block = var.a_vpc_cidr_block
vpc_id = var.a_vpc_id
vpc_name = var.a_vpc_name
subnet_availability_zone = var.a_subnet_availability_zone
subnet_cidr_block = var.a_subnet_cidr_block
subnet_name = var.a_subnet_name
else if var.option == 'B'
vpc_cidr_block = var.b_vpc_cidr_block
vpc_id = var.b_vpc_id
vpc_name = var.b_vpc_name
subnet_availability_zone = var.b_subnet_availability_zone
subnet_cidr_block = var.b_subnet_cidr_block
subnet_name = var.b_subnet_name
else
raise an error
# get a data resource identified by the VPC variables
data "aws_vpc" "instance_vpc" {
cidr_block = var.vpc_cidr_block
tags = {
Name = var.vpc_name
}
}
# get a data resource identified by the VPC variables
data "aws_subnet" "instance_subnet" {
vpc_id = var.vpc_id
cidr_block = var.subnet_cidr_block
availability_zone = var.subnet_availability_zone
tags = {
Name = var.subnet_name
}
}
# create an AWS key pair resource
resource "aws_key_pair" "instance_aws_key_pair" {
key_name = "component_key_${terraform.workspace}"
public_key = file("~/.ssh/terraform.pub")
}
# create the AWS EC2 instance
resource "aws_instance" "my_aws_instance" {
key_name = aws_key_pair.instance_aws_key_pair.key_name
ami = "ami-b12345"
instance_type = "t2.micro"
subnet_id = data.aws_subnet.instance_subnet.id
connection {
type = "ssh"
user = "terraform"
private_key = file("~/.ssh/terraform")
host = self.public_ip
}
tags = {
"Name" : "my_instance_name"
"Terraform" : "true"
}
}
这是以某种方式使用计数的问题吗,如下所示:
count = var.option == 'A'? 1 : 0
有没有办法做到这一点,或者有更好的方法吗?我对 Terraform 很陌生,所以我可能会遗漏一些明显的东西。
解决方案
你有几个问题在这里。
首先,您应该能够使用更新的、实验性的自定义验证规则来断言某个值在特定的值列表中。
其次,为了确定要使用哪一组变量,我建议使用一个很好map
的本地值。
例如,
locals {
vpc_info = {
"A" = {
vpc_cidr_block = var.a_vpc_cidr_block
vpc_id = var.a_vpc_id
vpc_name = var.a_vpc_name
subnet_availability_zone = var.a_subnet_availability_zone
subnet_cidr_block = var.a_subnet_cidr_block
subnet_name = var.a_subnet_name
}
"B" = {
vpc_cidr_block = var.b_vpc_cidr_block
vpc_id = var.b_vpc_id
vpc_name = var.b_vpc_name
subnet_availability_zone = var.b_subnet_availability_zone
subnet_cidr_block = var.b_subnet_cidr_block
subnet_name = var.b_subnet_name
}
}
}
然后您应该能够在选择的选项中引用特定字段,如下所示
local.vpc_info[var.option].vpc_name
让我知道这是否符合您的所有问题。
推荐阅读
- amazon-web-services - 如何通过带有预签名 URL 的 s3 加载网站
- node.js - 如何创建本地 https 代理
- c# - 模型映射器c#中的树嵌套文件夹
- javascript - 将对象另存为文本
- python - 时间序列预测的逆变换
- python - appium webdriver - 无法理解的错误
- python - Flask 重定向不起作用,没有错误,并且 db 没有更新
- javascript - 布尔数据似乎在 vue 3 中的 vue 反应中表现得很奇怪
- javascript - d3.js 将链接线向右移动
- azure-iot-hub - 如何在二头肌中部署 Azure IoT Hub 存储帐户归档?