Ответ
Да, я использовал Terraform для управления инфраструктурой как код (IaC) в нескольких проектах. Основной опыт связан с провайдерами AWS и GCP.
Примеры задач:
- Создание модульных конфигураций для виртуальных машин, сетей (VPC, подсети, security groups), балансировщиков нагрузки и баз данных (RDS, Cloud SQL).
- Рефакторинг монолитных конфигураций в переиспользуемые модули для командной работы.
- Управление состоянием (state) через Terraform Cloud с блокировками и историей изменений.
- Интеграция с CI/CD (GitLab CI) для автоматического планирования и применения изменений после code review.
Пример создания EC2-инстанса в AWS:
resource "aws_instance" "app_server" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
subnet_id = module.vpc.public_subnets[0]
tags = {
Name = "AppServer-${var.environment}"
Environment = var.environment
}
}
Используемые практики: модульная структура, remote state в S3 с блокировкой через DynamoDB, использование workspaces для разделения сред (dev/stage/prod), валидация кода с terraform validate и tflint.
Ответ 18+ 🔞
А, Terraform, говоришь? Ну да, работал с этой штукой, ебать мои старые костыли. Инфраструктуру как код настраивал, IaC, короче. В основном с AWS и GCP возился.
Что конкретно делал, ёпта:
- Писал эти конфиги, чтобы всё само разворачивалось — сервера, сети всякие, балансировщики, базы данных. Не вручную же, как в каменном веке, кнопки тыкать.
- Бывало, достанешь legacy-конфигурацию — один файл на овердохуища строк, в нём всё намешано. Приходилось это всё в нормальные, переиспользуемые модули пилить, чтобы команда не с ума сошла.
- Состояние (этот самый state) хранил в Terraform Cloud, чтобы не было каши, когда несколько человек лезут. Блокировки там, история — красота.
- В CI/CD цепочку встраивал (у нас GitLab CI был), чтобы после мержа кода в мастер всё само прогонялось
planи, если ок,apply.
Вот, смотри, как простенький сервер в AWS поднимается. Код не трогаю, он и так норм:
resource "aws_instance" "app_server" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
subnet_id = module.vpc.public_subnets[0]
tags = {
Name = "AppServer-${var.environment}"
Environment = var.environment
}
}
А по фэн-шую я делал так: всё модулями, state не локально, а в удалённом бекенде (обычно S3), с блокировкой через DynamoDB, чтобы два дурака одновременно не накосячили. Для разных сред (dev, stage, prod) использовал workspaces. И, конечно, перед тем как что-то применять, гонял terraform validate и tflint — доверия к рукам, ебать, ноль, лучше пусть линтер поругается.