Компонуемые модули
Теперь у вас есть два небольших модуля, asg-rolling-deploy и alb, каждый из которых хорошо делает что-то одно. Как их объединить? Как создавать компонуемые модули, пригодные к повторному использованию? Этот вопрос актуален не только для Terraform — программисты размышляют о нем на протяжении десятилетий. Процитирую Дуга Макилроя52, создателя Unix-каналов и ряда других инструментов для Unix, включая diff, sort, join и tr:
Это философия Unix: пишите программы, которые делают что-то одно, и делают это хорошо. Пишите программы, которые могут работать вместе.
Один из способов этого добиться — использовать
# Простая функция для сложения
def add(x, y)
return x + y
end
# Простая функция для вычитания
def sub(x, y)
return x - y
end
# Простая функция для умножения
def multiply(x, y)
return x * y
end
С помощью композиции функций вы можете их скомпоновать, передав вывод add и sub на вход multiply:
# Сложная функция, объединяющая несколько более простых
def do_calculation(x, y)
return multiply(add(x, y), sub(x, y))
end
Одним из основных способов сделать функции компонуемыми является минимизация
И хотя избежать побочных эффектов при работе с инфраструктурным кодом нельзя, вы все равно можете следовать тем же основным правилам в своем коде Terraform: передавайте все в виде входных переменных, возвращайте все через выходные и создавайте сложные модули на основе более простых.
Откройте файл modules/cluster/asg-rolling-deploy/variables.tf и добавьте четыре новые входные переменные:
variable "subnet_ids" {
description = "The subnet IDs to deploy to"
type = list(string)
}
variable "target_group_arns" {
description = "The ARNs of ELB target groups in which to register Instances"
type = list(string)
default = []
}
variable "health_check_type" {
description = "The type of health check to perform. Must be one of: EC2, ELB."
type = string
default = "EC2"
}
variable "user_data" {
description = "The User Data script to run in each Instance at boot"
type = string
default = ""
}
Первая переменная, subnet_ids, говорит модулю asg-rolling-deploy о том, в каких подсетях нужно развертываться. Если в модуле webserver-cluster подсети и VPC по умолчанию были прописаны прямо в коде, то этот модуль можно использовать в любых VPC и подсетях благодаря переменной subnet_ids, которая доступна извне. Следующие две переменные, target_group_arns и health_check_type, определяют то, как ASG интегрируется с балансировщиком нагрузки. Если у модуля webserver-cluster был встроенный экземпляр ALB, asg-rolling-deploy задумывался как универсальный модуль, поэтому выбор параметров балансировщика нагрузки с помощью входных переменных позволяет применять ASG в широком спектре сценариев: например, без ALB, с одним балансировщиком, с несколькими NLB и т. д.
Возьмите эти три входные переменные и передайте их ресурсу aws_autoscaling_group в файле modules/cluster/asg-rolling-deploy/main.tf, заменив вручную прописанные параметры, которые ссылались на ресурсы (скажем, ALB) и источники данных (вроде aws_subnet_ids) и не были скопированы в наш модуль asg-rolling-deploy:
resource "aws_autoscaling_group" "example" {
# Напрямую зависит от имени конфигурации запуска, поэтому вместе
# с ним всегда нужно заменять и эту группу ASG
name = "${var.cluster_name}-${aws_launch_configuration.example.name}"
launch_configuration = aws_launch_configuration.example.name
vpc_zone_identifier = var.subnet_ids
# Настраиваем интеграцию с балансировщиком нагрузки
target_group_arns = var.target_group_arns
health_check_type = var.health_check_type
min_size = var.min_size
max_size = var.max_size
# Ждем, пока как минимум столько серверов не пройдут проверку
# работоспособности, прежде чем считать развертывание ASG завершенным
min_elb_capacity = var.min_size
# (...)
}
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии