Terraform — Как определить, какие модули запускать и создавать, используя переменные

У меня есть код terraform, который создает и запускает несколько модулей — VPC, Network, ansible и Jenkins. Мне нужна опция, при которой модуль Ansible и Jenkins будет создан на основе истинного или ложного значения.

Когда я попытался закомментировать модуль Jenkins, мне нужно было удалить все связанные переменные, и это было ошибкой. Мне нужно было закомментировать переменные из корневой папки (переменные, tfvars и выходные файлы) и сетевой модуль, так как я передаю идентификатор группы безопасности Jenkins.

Есть ли разумный способ выбрать, какие модули следует исключить, включая их переменные, без редактирования файлов?

корневая папка - Main.tf

module "network" {
     source = "./modules/network"
     vpc_id = module.vpc.vpcid
     number_of_public_subnets = 2
     number_of_private_subnets = 2
     public-subnet-block = var.public-subnet-block
     private-subnet-block = var.private-subnet-block
     availability_zone = var.availability_zone
     gateway_id = module.vpc.gwid
     tag_enviroment= var.tag_enviroment
     project_name = var.project_name
     **jenkins_server_target_group_arn = module.jenkins.jenkins-server-target-group-arn**

}
module "ansible-server"{
     source = "./modules/ansible-server"
     ami_id = "ami-04505e74c0741db8d"
     instance_type = var.ansible_server_instance-type
     availability_zone = var.availability_zone[0]
     subnet_id = module.network.public-subnet-id[0]
     tag_enviroment= var.tag_enviroment
     project_name = var.project_name
     vpc_id = module.vpc.vpcid
     key_name  = aws_key_pair.mid_project_key.key_name
     private_key_file_name = var.private_key_file_name
     iam_instance_profile   = aws_iam_instance_profile.ec2-role.name
     depends_on = [local_file.mid_project_key]
}

module "jenkins"{
     source = "./modules/jenkins"
     ami_id = "ami-0e472ba40eb589f49"
     jenkins_nodes_number_of_server = 2
     jenkins-server-instance-type = var.jenkins-server-instance-type
     jenkins-node-instance-type = var.jenkins-node-instance-type
     private_subnet_id = module.network.private-subnet-id
     tag_enviroment= var.tag_enviroment
     project_name = var.project_name
     vpc_id = module.vpc.vpcid
     key_name  = aws_key_pair.mid_project_key.key_name
     private_key_file_name = var.private_key_file_name
     iam_instance_profile   = aws_iam_instance_profile.ec2-role.name
     alb1_security_group_id = module.network.alb1-security-group-id
}

корневая папка - Main.tf переменных.tf

variable "ansible_server_instance-type" {
  type = string
  default = "t2.micro"
}
variable "private-subnet-block" {
  type = list(string)
}
variable "public-subnet-block" {
  type = list(string)
}
variable "availability_zone" {}
variable "private_key_file_name" {}
variable "consul-instance-type" {}
variable "jenkins-node-instance-type" {}
variable "jenkins-server-instance-type" {}

корневая папка - terraform.tfvars

jenkins-node-instance-type = "t2.micro"
jenkins-server-instance-type = "t2.micro"

Папка модуля -> main.tf

resource "aws_alb_listener" "jenkins" {
  load_balancer_arn = aws_alb.alb1.arn
  port              = "9000"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = var.jenkins_server_target_group_arn
  }
}

Папка модуля -> varibles.tf

variable "jenkins_server_target_group_arn" {}

Разве я уже не ответил на этот вопрос с помощью зависит от или это другая проблема?

Marcin 23.04.2022 10:04

Другое дело :-)

dzbeda 23.04.2022 10:15
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

count мета аргумент может помочь вам здесь. Просто создайте 0 или 1 экземпляр модуля в зависимости от результата условное выражение.

variable "create_ansible_server {
  type    = bool
}

...

module "ansible-server"{
  source = "./modules/ansible-server"
  count  = var.create_ansible_server ? 1 : 0
  ...
}

Другие вопросы по теме