Я также нахожусь в состоянии переноса существующей инфраструктуры 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 и продолжаем учиться и совершенствоваться с добавлением новых функций.
Мы активно используем Terraform, и наша рекомендуемая установка выглядит следующим образом:
Макет файла
Мы настоятельно рекомендуем хранить код Terraform для каждой из ваших сред (например, stage, prod, qa) в отдельных наборах шаблонов (и, следовательно, в отдельных
.tfstate
файлах). Это важно, чтобы ваши отдельные среды были фактически изолированы друг от друга при внесении изменений. В противном случае, возясь с каким-то кодом в постановке, слишком легко что-то взорвать и в продукте. См. Terraform, VPC и почему вам нужен файл tfstate для каждого env, чтобы красочно обсудить, почему.Поэтому наш типичный макет файла выглядит так:
Весь код Terraform для этапа VPC помещается в
stage
папку, весь код для VPC prod помещается вprod
папку, а весь код, который находится за пределами VPC (например, пользователи IAM, темы SNS, сегменты S3), попадает вglobal
папку .Обратите внимание, что по соглашению мы обычно разбиваем наш код Terraform на 3 файла:
vars.tf
: Входные переменные.outputs.tf
: Выходные переменные.main.tf
: Фактические ресурсы.Модули
Обычно мы определяем нашу инфраструктуру в двух папках:
infrastructure-modules
: Эта папка содержит небольшие, многоразовые, версионные модули. Думайте о каждом модуле как о схеме создания единой части инфраструктуры, такой как VPC или база данных.infrastructure-live
: Эта папка содержит актуальную работающую инфраструктуру, которую она создает путем объединения модулейinfrastructure-modules
. Думайте о коде в этой папке как о настоящих домах, которые вы построили по своим чертежам.Модуль Terraform - это любой набор шаблонов Terraform в папке. Например, у нас может быть папка с именем
vpc
in,infrastructure-modules
которая определяет все таблицы маршрутов, подсети, шлюзы, ACL и т. Д. Для одного VPC:Затем мы можем использовать этот модуль в
infrastructure-live/stage
иinfrastructure-live/prod
создавать сценические и прод VPCs. Например, вот какinfrastructure-live/stage/main.tf
может выглядеть:Чтобы использовать модуль, вы используете
module
ресурс и указываете в егоsource
поле либо локальный путь на вашем жестком диске (напримерsource = "../infrastructure-modules/vpc"
), либо, как в приведенном выше примере, URL-адрес Git (см. Источники модуля ). Преимущество URL-адреса Git в том, что мы можем указать конкретный git sha1 или tag (ref=v0.0.4
). Теперь мы не только определяем нашу инфраструктуру как набор небольших модулей, но и можем изменять версии этих модулей и тщательно обновлять или откатывать по мере необходимости.Мы создали ряд многократно используемых, протестированных и задокументированных пакетов инфраструктуры для создания VPC, кластеров Docker, баз данных и т. Д., А под капотом большинство из них являются просто модулями Terraform с поддержкой версий.
государство
Когда вы используете Terraform для создания ресурсов (например, экземпляров EC2, баз данных, VPC), он записывает информацию о том, что было создано, в
.tfstate
файл. Чтобы внести изменения в эти ресурсы, всем в вашей команде нужен доступ к этому же.tfstate
файлу, но вы НЕ должны регистрировать его в Git ( объяснение почему см. Здесь ).Вместо этого мы рекомендуем хранить
.tfstate
файлы в S3, включив Terraform Remote State , которое будет автоматически загружать / извлекать последние файлы каждый раз, когда вы запускаете Terraform. Обязательно включите управление версиями в своей корзине S3, чтобы вы могли откатиться к более старым.tfstate
файлам в случае, если вы каким-то образом испортили последнюю версию. Однако важное замечание: Terraform не обеспечивает блокировку . Поэтому, если два члена команды одновременно работаютterraform apply
с одним и тем же.tfstate
файлом, они могут в конечном итоге перезаписать изменения друг друга.Чтобы решить эту проблему, мы создали инструмент с открытым исходным кодом под названием Terragrunt , который представляет собой тонкую оболочку для Terraform, которая использует Amazon DynamoDB для обеспечения блокировки (которая должна быть полностью бесплатной для большинства команд). Ознакомьтесь с добавлением автоматической блокировки удаленного состояния и настройки в Terraform с помощью Terragrunt для получения дополнительной информации.
дальнейшее чтение
Мы только что начали серию сообщений в блоге под названием «Всеобъемлющее руководство по Terraform» , в которых подробно описываются все передовые практики, которые мы изучили для использования Terraform в реальном мире.
Обновление: серия публикаций в блоге «Комплексное руководство по Terraform» стала настолько популярной, что мы расширили ее до книги под названием Terraform: Up & Running !
источник
remote config
если вы только что проверили свои конфигурации Terraform или если вы хотите изменить предыдущую удаленную конфигурацию. Terraform 0.9 представит концепциюbackends
, которая во многом упростит это. См. Этот PR для более подробной информации.remote config
команду, чтобы указать на состояние prod. Предполагая различное состояние для каждой среды. Это правильно? С нетерпением жду v0.9..tf
файлов в двух разных средах, да, вам нужно будет запускатьremote config
каждый раз при переключении. Очевидно, что это очень подвержено ошибкам, поэтому я не рекомендую использовать эту технику. Вместо этого ознакомьтесь с рекомендуемым макетом файла Terraform в этом сообщении в блоге, а также с тем, как использовать модули Terraform в этом сообщении в блоге .Раньше
remote config
это разрешалось, но теперь было заменено на " backends ", поэтому удаленный терраформ больше не доступен.Подробности см. В документации .
источник
Более подробно освещено @Yevgeny Brikman, но конкретно отвечая на вопросы OP:
Используйте git для файлов TF. Но не проверяйте файлы состояния в (т.е. tfstate). Вместо этого используйте
Terragrunt
для синхронизации / блокировки файлов состояния на S3.Нет.
да
источник
Я знаю, что здесь много ответов, но мой подход совсем другой.
Модули
Управление окружающей средой
IaC сделал процесс SDLC релевантным для управления инфраструктурой, и ожидать наличия инфраструктуры разработки, а также среды разработки приложений - ненормально.
Разделение обязанностей
Если вы работаете в небольшой организации или используете личную инфраструктуру, это на самом деле неприменимо, но поможет вам управлять своими операциями.
Это также помогает в решении проблем с выпуском, поскольку вы обнаружите, что некоторые ресурсы редко меняются, в то время как другие меняются все время. Разделение устраняет риск и сложность.
Эта стратегия проводит параллели со стратегией AWS с несколькими учетными записями. Прочтите для получения дополнительной информации.
CI / CD-
Это отдельная тема, но Terraform очень хорошо работает в рамках хорошего конвейера. Самая распространенная ошибка здесь - рассматривать CI как серебряную пулю. Технически Terraform должен предоставлять инфраструктуру только на этапах конвейера сборки. Это было бы отдельно от того, что происходит на этапах CI, где обычно проверяются и тестируются шаблоны.
NB Написано на мобильном телефоне, поэтому, пожалуйста, извините за возможные ошибки.
источник
Общие рекомендации по структурированию кода
С меньшим количеством ресурсов работать проще и быстрее:
terraform plan
иterraform
apply выполняют вызовы облачного API для проверки состояния ресурсов.Радиус взрыва меньше с меньшими ресурсами:
Запустите свой проект, используя удаленное состояние:
tfstate
файлом в git - это кошмар.Постарайтесь придерживаться согласованной структуры и соглашения об именах:
Сохраняйте модули ресурсов как можно более простыми.
Не программируйте значения, которые могут быть переданы как переменные или обнаружены с использованием источников данных.
Используйте
data
источники и, вterraform_remote_state
частности, как связующее звено между модулями инфраструктуры в составе.( см. статью: https://www.terraform-best-practices.com/code-structure )
Пример:
ПРИМЕЧАНИЕ: так же, как ссылка, которую не следует строго соблюдать, поскольку каждый проект имеет свои специфические характеристики.
источник
Я считаю, что при использовании terraform для оркестровки инфраструктуры необходимо придерживаться нескольких рекомендаций.
Обработка нескольких сред
В большинстве случаев рекомендуемый способ - использовать terraform «рабочее пространство» для обработки нескольких сред, но я считаю, что использование рабочего пространства может варьироваться в зависимости от способа работы в организации. Другой - это сохранение кода Terraform для каждой из ваших сред (например, stage, prod, QA) для разделения состояний среды. Однако в этом случае мы просто копируем один и тот же код во многих местах.
Я придерживался другого подхода к обработке и предотвращению дублирования одного и того же кода терраформирования, сохраняя его в каждой папке среды, поскольку я считаю, что большую часть времени вся среда будет на 90% одинаковой.
Конфигурация, относящаяся к средам
Храните конфигурацию и параметры, связанные со средой, отдельно в файле переменных и передайте это значение для настройки инфраструктуры. например, как показано ниже
dev.backend.tfvar
dev.variable.tfvar
Условный пропуск инфраструктурной части
Создайте конфигурацию в конкретном файле переменных env и на основе этой переменной решите создать или пропустить эту часть. Таким образом, при необходимости можно пропустить конкретную часть инфраструктуры.
Для инициализации и выполнения внутренних изменений для каждой среды требуется команда ниже, перейдите в требуемую папку среды.
источник
Мне не нравится идея вложенных папок, потому что это приведет к разным источникам для каждой среды, и это имеет тенденцию дрейфовать.
Лучший подход - иметь один стек для всех сред (скажем, dev, preprod и prod). Для работы в единой среде используйте
terraform workspace
.Это создает новое рабочее пространство. Это включает специальный файл состояния и переменную, которую
terraform.workspace
вы можете использовать в своем коде.Таким образом вы получите ведра под названием
после применения к указанным выше рабочим областям (используйте
terraform workspace select <WORKSPACE>
для изменения среды). Чтобы сделать код даже мультирегиональным, сделайте это так:получить (для региона us-east-1)
источник
Некоторые рекомендации по использованию Terraform:
Избегайте жесткого кодирования: иногда разработчики вручную создавали ресурсы напрямую. Вам необходимо отметить эти ресурсы и использовать импорт терраформ, чтобы включить их в коды. Образец:
account_number = «123456789012» account_alias = «mycompany»
Запуск Terraform из контейнера докеров: Terraform выпускает официальный контейнер Docker, который позволяет вам легко контролировать, какую версию вы можете запустить.
При настройке задания сборки в конвейере CI / CD рекомендуется запускать контейнер Terraform Docker.
Чтобы узнать больше, обратитесь к моему блогу: https://medium.com/tech-darwinbox/how-darwinbox-manages-infrastructure-at-scale-with-terraform-371e2c5f04d3
источник
Я хотел бы внести свой вклад в эту тему.
В некоторых особых случаях потребуется ручной доступ к файлам состояния Terraform. Такие вещи, как рефакторинг, критические изменения или исправление дефектов, потребуют выполнения операционным персоналом операций состояния Terraform. Для таких случаев запланируйте внеочередной контролируемый доступ к состоянию Terraform с помощью хоста-бастиона, VPN и т. Д.
Загляните в более длинный блог о лучших практиках, в котором это подробно рассматривается, включая рекомендации для конвейеров CI / CD.
источник
Если вы все еще ищете лучшее решение, взгляните на рабочие области, которые могут заменить поддержку другой структуры папок среды, которая может иметь переменные, специфичные для рабочей области.
Как Евгений Брикман упомянул , что лучше иметь структуру модулей.
источник
Используйте облако terraform для управления и сохранения состояний вместе с советами выше.
источник