Я также нахожусь в состоянии переноса существующей инфраструктуры AWS на Terraform, поэтому постараюсь обновлять ответ по мере разработки.
Я в значительной степени полагался на официальные примеры Terraform и многочисленные методы проб и ошибок, чтобы конкретизировать области, в которых я не был уверен.
.tfstate
файлы
Конфигурацию Terraform можно использовать для предоставления множества ящиков в разной инфраструктуре, каждая из которых может иметь разное состояние. Поскольку он также может запускаться несколькими людьми, это состояние должно находиться в централизованном месте (например, S3), но не в git.
Это можно подтвердить, посмотрев на Terraform .gitignore
.
Контроль разработчика
Наша цель - предоставить разработчикам больший контроль над инфраструктурой, сохраняя при этом полный аудит (журнал git) и возможность проверки изменений (запросы на вытягивание). Имея это в виду, я стремлюсь к следующему рабочему процессу новой инфраструктуры:
- Базовая основа обычных AMI, которые включают многоразовые модули, например марионетку.
- Основная инфраструктура, предоставляемая DevOps с использованием Terraform.
- Разработчики изменяют конфигурацию Terraform в Git по мере необходимости (количество экземпляров; новый VPC; добавление региона / зоны доступности и т. Д.).
- Отправлена конфигурация Git и отправлен запрос на перенос для проверки работоспособности членом команды DevOps.
- Если одобрено, вызывает Webhook в CI для сборки и развертывания (не знаю, как разделить несколько сред в настоящее время)
Изменить 1 - обновить текущее состояние
С тех пор, как я начал этот ответ, я написал много кода TF и чувствую себя более комфортно в нашем положении дел. Попутно мы столкнулись с ошибками и ограничениями, но я согласен с тем, что это характерно для использования нового, быстро меняющегося программного обеспечения.
раскладка
У нас сложная инфраструктура AWS с несколькими VPC, каждая из которых имеет несколько подсетей. Ключом к легкому управлению этим было определение гибкой таксономии, охватывающей регион, среду, службу и владельца, которую мы можем использовать для организации нашего кода инфраструктуры (как терраформ, так и марионетки).
Модули
Следующим шагом было создание единого репозитория git для хранения наших модулей terraform. Наша структура директорий верхнего уровня для модулей выглядит так:
tree -L 1 .
Результат:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
Каждый из них устанавливает некоторые разумные значения по умолчанию, но выставляет их как переменные, которые могут быть перезаписаны нашим «клеем».
клей
У нас есть второй репозиторий, glue
который использует упомянутые выше модули. Он изложен в соответствии с нашим документом таксономии:
.
├── README.md
├── clientA
│ ├── eu-west-1
│ │ └── dev
│ └── us-east-1
│ └── dev
├── clientB
│ ├── eu-west-1
│ │ ├── dev
│ │ ├── ec2-keys.tf
│ │ ├── prod
│ │ └── terraform.tfstate
│ ├── iam.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
└── clientC
├── eu-west-1
│ ├── aws.tf
│ ├── dev
│ ├── iam-roles.tf
│ ├── ec2-keys.tf
│ ├── prod
│ ├── stg
│ └── terraform.tfstate
└── iam.tf
На уровне клиента у нас есть .tf
файлы для конкретных учетных записей AWS , которые предоставляют глобальные ресурсы (например, роли IAM); далее идет уровень региона с открытыми ключами EC2 SSH; Наконец, в нашей среде ( dev
, stg
и prod
т. Д.) Хранятся наши настройки VPC, создание экземпляров, пиринговые соединения и т. Д.
Боковое примечание: как вы можете видеть, я иду вразрез со своим советом выше, оставаясь terraform.tfstate
в git. Это временная мера до тех пор, пока я не перейду на S3, но меня устраивает, поскольку в настоящее время я единственный разработчик.
Следующие шаги
Это все еще ручной процесс, и его еще нет в Jenkins, но мы переносим довольно большую, сложную инфраструктуру и пока все хорошо. Как я уже сказал, ошибок мало, но все идет хорошо!
Редактировать 2 - Изменения
Прошёл почти год с тех пор, как я написал этот первоначальный ответ, и состояние Terraform и меня значительно изменилось. Я сейчас на новой должности, использую Terraform для управления кластером Azure, и Terraform сейчас v0.10.7
.
государство
Люди неоднократно говорили мне, что состояние не должно входить в Git - и они правы. Мы использовали это в качестве временной меры с командой из двух человек, которая полагалась на общение с разработчиками и дисциплину. Благодаря более крупной распределенной команде мы теперь полностью используем удаленное состояние в S3 с блокировкой, обеспечиваемой DynamoDB. В идеале это будет перенесено на consul, теперь это v1.0, чтобы сократить кросс-облачных провайдеров.
Модули
Ранее мы создавали и использовали внутренние модули. Это все еще актуально, но с появлением и ростом реестра Terraform мы стараемся использовать их, по крайней мере, в качестве основы.
Файловая структура
Новая позиция имеет гораздо более простую таксономию с двумя средами infx - dev
и prod
. У каждого есть свои собственные переменные и выходные данные, повторно используя наши модули, созданные выше. remote_state
Провайдер также помогает в обмене выходов созданных ресурсов между средами. Наш сценарий - это поддомены в разных группах ресурсов Azure для глобального управляемого TLD.
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
планирование
Опять же, с дополнительными задачами распределенной команды, теперь мы всегда сохраняем вывод terraform plan
команды. Мы можем проверить и узнать, что будет выполняться, без риска каких-либо изменений между этапами plan
и apply
(хотя блокировка помогает в этом). Не забудьте удалить этот файл плана, поскольку он потенциально может содержать «секретные» переменные в виде простого текста.
В целом мы очень довольны Terraform и продолжаем учиться и совершенствоваться с добавлением новых функций.