Я також перебуваю в стані міграції існуючої інфраструктури 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 для зберігання наших модулів терраформи. Наша структура dir верхнього рівня для модулів виглядає так:
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, але мені підходить, оскільки наразі я єдиний розробник.
Наступні кроки
Це все ще ручний процес, але ще не в Дженкінсі, але ми працюємо з досить великою, складною інфраструктурою і поки що дуже хорошою. Як я вже казав, кілька помилок, але йде добре!
Редагувати 2 - Зміни
Минув майже рік, як я написав цю первинну відповідь, і стан і Terraform, і я суттєво змінилися. Зараз я на новій посаді, використовуючи Terraform для управління кластером Azure, і Terraform зараз v0.10.7
.
Держава
Люди не раз казали мені, що держава не повинна їхати в Git - і вони вірні. Ми використовували це як проміжний захід з командою з двома особами, яка покладалася на спілкування та дисципліну розробників. Завдяки більшій, розподіленій команді ми зараз повністю використовуємо віддалений стан у S3 із блокуванням, передбаченим DynamoDB. В ідеалі це буде перенесено для консультування, тепер випал v1.0 скоротити перехресні постачальники хмар.
Модулі
Раніше ми створювали та використовували внутрішні модулі. Це все ще має місце, але з появою та зростанням реєстру Terraform ми намагаємось використовувати їх як принаймні основу.
Структура файлу
Нова позиція має набагато простішу систематику лише з двома потоками навколишнього середовища - 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 і продовжуємо вчитися та вдосконалюватись із новими функціями.