Infrastructure as Code (IaC)
Основна ідея, яка лежить в основі IaC, полягає у тому, що для визначення, розгортання, оновлення і видалення інфраструктури необхідно писати й виконувати код. Це важлива зміна у способі мислення, коли всі аспекти системного адміністрування розглядаються як програмне забезпечення - включаючи обладнання, таке як налаштування фізичних серверів.
Одним з ключових аспектів DevOps є те, що майже кожен аспект інфраструктури можна керувати з коду, включаючи сервери, бази даних, мережі, журналізацію, програмну конфігурацію, документацію, автоматичні тести, процеси розгортання тощо.
Інструменти для реалізації IaC можна розподілити на п'ять загальних категорій1:
- Спеціалізовані скрипти - ви берете ручне завдання і розділяєте його на конкретні кроки. Потім кожен крок описується за допомогою коду на обраній вами скриптовій мові, і виконується отриманий скрипт на вашому сервері.
- Засоби управління конфігурацією. На відміну від простих скриптів, інструменти Chef, Puppet, Ansible та SaltStack
дозволяють писати ідемпотентний код, який можливо запускати розподілено та який має однаковий стиль
[!NOTE] Ідемпотентність - це властивість, яка дозволяє деяким операціям бути виконаними кілька разів без зміни результату після першого виконання. У контексті конфігурацій Terraform, це означає, що ви можете застосувати конфігурацію багато разів, але стан інфраструктури, яку вона управляє, залишиться незмінним після першого застосування, якщо не було змін у самій конфігурації.
- Засоби шаблонізації серверів - такі інструменти як Docker, Packer чи Vagrant дозволяють створювати шаблон
серверу.
Замість встановлення необхідного софту на кожен сервер, можна створити шаблон (знімок) та встановити його на
необхідну групу серверів. Це ключовий момент з переходу на незмінну інфраструктуру.
[!NOTE] Незмінна інфраструктура працює таким чином, що коли сервер вже встановлений, до нього більше не вносяться жодні зміни. Якщо потрібно оновити щось (наприклад, встановити нову версію коду), ви створюєте новий образ з вашого шаблону і розгортаєте його на новому сервері. Таким чином, оскільки сервери залишаються незмінними, вам набагато простіше контролювати, що саме розгорнуто на них.
- Засоби оркестрації - сюди відносять Kubernetes, Amazon Elastic Container Service (Amazon ECS), Docker Swarm, Marathon/Mesos чи Nomad. Вони допомогають організувати і управління розподіленими системами та компонентами, що складаються з додатків, сервісів і інфраструктури. Оркестрація забезпечує автоматичну координацію і приводить до злиття різних частин системи в єдину.
- Засоби ініціалізації ресурсів - це Terraform або CloudFormation. Вони відповідають за автоматичне створення самих серверів та інших компонентів інфраструктури. За допомогою цих засобів можна створювати не тільки сервери, а також бази даних, кеші, балансувальники навантаження, черги, системи моніторингу, налаштування підмереж і брандмауера, правила маршрутизації, сертифікати SSL та багато іншого.
У цьому розділі ми з вами познайомимося з Terraform та використанням спеціалізованих скриптів для виконання операції Server Provision.
Terraform
HashiCorp Terraform - це інструмент "інфраструктура як код" (IaC), який дозволяє визначати як хмарні, так і локальні ресурси у зручних для читання конфігураційних файлах, які ви можете змінювати, повторно використовувати та ділитися ними. Потім ви можете використовувати послідовний робочий процес для забезпечення та управління всією інфраструктурою протягом її життєвого циклу.
Terraform може керувати низькорівневими компонентами, такими як обчислювальні, сховища та мережеві ресурси, а також високорівневими компонентами, такими як записи DNS та функції SaaS.
[!TIP] До того як ви створите власний аккаунт AWS рекомендую виконати Terraform Tutorial де допоможе вам трохи попрактикуватися. На це може знадобитися приблизно 4-и години часу.
Інструменти інфраструктури як коду (IaC) дозволяють керувати інфраструктурою за допомогою конфігураційних файлів, а не через графічний інтерфейс користувача. IaC дозволяє створювати, змінювати та керувати інфраструктурою у безпечний, послідовний та повторюваний спосіб, визначаючи конфігурації ресурсів, які ви можете змінювати, повторно використовувати та ділитися ними.
Terraform дозволяє визначати ресурси та інфраструктуру у зрозумілих для людини декларативних файлах конфігурації, а також керувати життєвим циклом вашої інфраструктури.
[!NOTE] Декларативний підхід - це метод, при якому ви описуєте "що" потрібно досягти, а не "як" це зробити. У контексті Terraform, це означає, що ви описуєте бажаний стан інфраструктури за допомогою конфігураційних файлів, а Terraform визначає, які кроки потрібно виконати для досягнення цього стану, враховуючи поточний стан інфраструктури.
Використання Terraform має кілька переваг над ручним керуванням інфраструктурою:
- Terraform може керувати інфраструктурою на декількох хмарних платформах.
- Зрозуміла для людини мова конфігурації допомагає швидко писати код інфраструктури.
- Стан Terraform дозволяє відстежувати зміни ресурсів протягом усього розгортання.
- Ви можете зафіксувати свої конфігурації в системі контролю версій, щоб безпечно співпрацювати над інфраструктурою.
Стандартизація робочого процесу

Провайдери визначають окремі одиниці інфраструктури, наприклад, обчислювальні екземпляри або приватні мережі, як ресурси. Ви можете об'єднати ресурси від різних провайдерів у багаторазові конфігурації Terraform, які називаються модулями, і керувати ними за допомогою узгодженої мови і робочого процесу.

Основний робочий процес Terraform складається з трьох етапів:
- Написання (write): Ви визначаєте ресурси, які можуть належати декільком хмарним провайдерам і сервісам. Наприклад, ви можете створити конфігурацію для розгортання програми на віртуальних машинах у мережі віртуальної приватної хмари (VPC) з групами безпеки та балансувальником навантаження.
- План (plan): Terraform створює план виконання, що описує інфраструктуру, яку він створить, оновить або знищить на основі існуючої інфраструктури та вашої конфігурації.
- Застосування (apply): Після затвердження Terraform виконує запропоновані операції в правильному порядку, враховуючи всі залежності від ресурсів. Наприклад, якщо ви оновите властивості VPC і зміните кількість віртуальних машин у цьому VPC, Terraform відтворить VPC перед масштабуванням віртуальних машин.
[!NOTE] В наступному розділі ми з вами розглянемо модулі та більш поглиблено навчимося їх використовувати для, для ще більшої гнучкості і тестування наших змін.
Мова конфігурації Terraform є декларативною, що означає, що вона описує бажаний кінцевий стан вашої інфраструктури, на відміну від процедурних мов програмування, які вимагають покрокової інструкції для виконання завдань. Провайдери Terraform автоматично обчислюють залежності між ресурсами, щоб створити або знищити їх у правильному порядку.
Відстежуйте свою інфраструктуру
Terraform відстежує вашу реальну інфраструктуру у файлі стану, який діє як джерело істини для вашого середовища. Terraform використовує файл стану для визначення змін, які необхідно внести у вашу інфраструктуру, щоб вона відповідала вашій конфігурації.
Співпраця
Terraform дозволяє вам співпрацювати над вашою інфраструктурою з віддаленими серверами керування станом (Terraform state file). Використовуючи відділений стан, ви можете безпечно ділитися своїм станом з колегами по команді, забезпечувати стабільне середовище для роботи Terraform і запобігати виникненню ситуацій конкуренції, коли кілька людей одночасно вносять зміни в конфігурацію.
Ви також можете підключити GitHub, GitLab та чи іншу систему, що підтримує Countinious Integration, що дозволить вам автоматично застосовувати зміни інфраструктури, коли ви фіксуєте зміни конфігурації в VCS. Це дозволяє вам керувати змінами в інфраструктурі за допомогою контролю версій, як у випадку з кодом програми.
[!NOTE] Замість Terraform Cloud ми будемо використовувати функціонал GitLab який нам допоможе зберігати віддалено стан інфраструктури.
1 Yevgeniy Brikman. Terraform: Up & Running: Writing Infrastructure as Code