Я хотел бы передать переменную, которая позволит мне указать список параметров VP C и su bnet для экземпляра AWS. Имеются фиксированные настройки VP C и su bnet, которые имеют смысл, поэтому я просто хочу позволить пользователю выбрать один, используя одну переменную, т.е. использовать A или B.
Например, скажем, I иметь два доступных 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"
}
Теперь я хочу реализовать некоторые логики c в основном файле модуля (modules/my_instance/my_instance.tf
), где он решает, какой из двух наборов VP C и su bnet настроек, которые он должен использовать из 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, поэтому я могу упустить что-то очевидное.