До основного вмісту

Ansible чи Terraform: що обрати і коли поєднувати

Хмара та DevOps · 29.09.2026

Питання "Ansible чи Terraform" виникає у кожного, хто вперше автоматизує розгортання серверів. Коротка відповідь: це різні інструменти для різних завдань, і в реальних проєктах вони майже завжди працюють разом. Terraform створює інфраструктуру — сервер, диск, мережу, а Ansible налаштовує те, що вже створено. Розберемо, де проходить межа і як зібрати з двох інструментів один робочий конвеєр.

Чим принципово відрізняються Ansible і Terraform

Terraform — інструмент для керування інфраструктурою як кодом. Він описує кінцевий стан: скільки потрібно серверів, з якими дисками, в якій мережі, і сам вирішує, що створити, змінити або видалити, щоб прийти до цього стану. Ansible — інструмент конфігураційного керування. Він не створює сервери сам по собі, а виконує на вже наявних машинах послідовність кроків: поставити пакет, покласти файл, перезапустити службу.

Межа проста: Terraform відповідає на питання "скільки серверів і які" — VDS, диски, приватна мережа, правила фаєрволу у провайдера. Ansible відповідає на питання "що всередині сервера" — який веб-сервер, яка версія PHP, які користувачі та cron-завдання.

Коли обирати Terraform

Terraform потрібен, якщо інфраструктура описується через API хмарного провайдера: замовлення VDS, прив'язка плаваючої IP, налаштування приватної мережі між серверами, створення балансувальника навантаження. Якщо завтра потрібно підняти другий такий самий кластер серверів в іншому регіоні, Terraform зробить це за одну команду.

  • Замовлення та видалення серверів через API провайдера без ручних кліків у панелі
  • Версіювання інфраструктури в git — зміни видно в diff перед застосуванням
  • Відтворюваність: staging і production збираються з одного набору файлів

Коли обирати Ansible

Ansible потрібен там, де сервери вже існують і їх треба привести до однакового стану: встановити nginx і PHP-FPM, розгорнути SSH-ключі, налаштувати firewall на рівні ОС, застосувати оновлення безпеки. Йому не важливо, звідки взявся сервер — з Terraform, з ручного замовлення в панелі ZevsHost чи зі старого парку заліза.

  • Налаштування ПЗ і служб на серверах, які вже існують
  • Масове застосування змін на десятках серверів однією командою
  • Завдання, які не описуються терміном "інфраструктура": деплой коду, ротація логів, оновлення сертифікатів

Декларативний і процедурний підхід: різниця на практиці

Terraform декларативний: файл описує бажаний стан, а не перелік кроків. Запустили terraform apply двічі поспіль без змін у файлах — вдруге нічого не станеться. Ansible процедурний за структурою плейбука, але ідемпотентний по кожному модулю: модуль apt не перевстановить вже встановлений пакет, а модуль copy не перезапише файл з тим самим вмістом.

КритерійTerraformAnsible
Що описуєРесурси хмари: сервери, диски, мережіСтан ОС і застосунків на сервері
МодельДекларативна, з файлом стануПослідовність завдань за інвентарем
Зберігання стануstate-файл, зазвичай у S3 чи Terraform CloudСтан не зберігається, перевіряється під час кожного запуску
Швидкість правки одного параметраВимагає apply, може перестворити ресурсТочковий запуск playbook на потрібний хост

Як пов'язати Terraform і Ansible в одному конвеєрі

Стандартна схема: Terraform створює сервер і виводить його IP-адресу через output, Ansible бере цю адресу як inventory і налаштовує сервер. Провайдер VDS для прикладу — Hetzner Cloud, але схема працює з будь-яким провайдером, у якого є API.

resource "hcloud_server" "web" {
  name        = "web-01"
  server_type = "cx22"
  image       = "ubuntu-24.04"
  ssh_keys    = [hcloud_ssh_key.main.id]
}

output "web_ip" {
  value = hcloud_server.web.ipv4_address
}

Далі динамічний inventory для Ansible збирається з виводу Terraform однією командою, а сам плейбук ставить базовий набір пакетів:

- hosts: web
  become: true
  tasks:
    - name: Встановити nginx і PHP-FPM
      apt:
        name: ["nginx", "php-fpm"]
        state: present
        update_cache: true
    - name: Запустити і увімкнути nginx
      service:
        name: nginx
        state: started
        enabled: true

Далі процес — від замовлення сервера до готового до роботи середовища — зазвичай оформляють окремим етапом у конвеєрі GitLab CI: спочатку джоба з terraform apply, потім джоба з ansible-playbook, яка отримує адресу з артефактів першого кроку. Детальніше про спільний опис інфраструктури в коді дивіться у статті про Terraform для VPS.

Поширені помилки при спільному використанні

Перша помилка — дублювання відповідальності: частину налаштування сервера прописують через cloud-init всередині Terraform, а частину — через Ansible, і за півроку ніхто не пам'ятає, де що міняти. Друга — зберігання state-файлу Terraform локально на ноутбуці розробника без резервної копії: при втраті файлу Terraform перестає розуміти, що вже створено, і намагається створити ресурси заново.

  • Змішування завдань налаштування ОС між cloud-init і Ansible в одному проєкті
  • Локальний state-файл Terraform без віддаленого бекенду і блокувань
  • Запуск Ansible без попередньої перевірки playbook у режимі --check

Підсумок: короткий чекліст вибору

Якщо треба керувати серверами, дисками і мережами у провайдера — беріть Terraform. Якщо треба налаштувати те, що вже працює, — беріть Ansible. У більшості проєктів обидва інструменти використовуються разом, кожен у своїй зоні відповідальності.

  • Інфраструктура хмари та її версії в git — Terraform
  • Пакети, конфіги і служби всередині сервера — Ansible
  • State Terraform зберігати віддалено, з блокуванням
  • Пов'язувати обидва кроки одним конвеєром CI, а не запускати вручну
← Назад до бази знань Поставити питання підтримці