ansible terraform

Часто их используют вместе: Terraform поднимает инфраструктуру, Ansible ее настраивает.

Описать все в файле

Подход Infrastructure as Code (IaC) – инфраструктура как код. Вместо того чтобы кликать мышкой, вы описываете нужную конфигурацию в текстовом файле. А специальный инструмент читает этот файл и создает все ровно так, как написано.

Нужен второй сервер? Запускаете тот же файл – получаете точную копию. Нужно двадцать? Тот же файл, просто говорите «сделай двадцать». Сервер сломался? Запускаете файл – инфраструктура восстанавливается за минуты. Заболели? Коллега берет ваш файл и все повторяет.

Аналогия с рецептом

Можно готовить «на глаз»: щепотку того, ложку этого, как рука легла. Получилось вкусно – отлично. Но повторить точно так же завтра вы не сможете, и научить кого-то – тоже.

А можно записать рецепт: 200 грамм муки, 2 яйца, 150 мл молока, печь 30 минут при 180 градусах. Блюдо получится одинаковым у вас сегодня, у вас через месяц и у любого, кто возьмет рецепт.

IaC – это рецепт для инфраструктуры. Не «настроил как помню», а точное описание, по которому собирается все, всегда одинаково.

Что это дает

  1. Повторяемость. Один файл – сколько угодно одинаковых серверов. Никакого configuration drift. Все копии идентичны, потому что собраны из одного описания.

  2. Версионируемость. Файл лежит в Git, как обычный код. Видно всю историю: кто, что и когда менял. Что-то сломалось после изменения инфраструктуры? Откатились на предыдущую версию файла.

  3. Проверяемость. Изменения в инфраструктуре проходят через ревью, как код. Коллега смотрит, что вы собираетесь поменять, до того как это применится к боевым серверам. Опечатались, хотели открыть один порт, а открываете все – на ревью это заметят.

  4. Идемпотентность. Можно запустить один и тот же файл дважды – ничего не сломается. Инструмент сравнит текущее состояние с описанным и применит только разницу. Сервер уже существует и настроен правильно? Ничего не произойдет. Какой-то параметр изменился? Инструмент поправит именно его, не трогая остальное.

Декларативный подход

IaC-инструменты работают декларативно: вы описываете не последовательность действий («поставь nginx, потом создай папку, потом скопируй конфиг»), а конечное состояние – «на сервере должен быть nginx, папка /app, конфиг такой-то». Инструмент сам разберется, что нужно сделать, чтобы привести систему к этому состоянию.

Разница принципиальная. Императивный скрипт говорит «сделай шаги 1, 2, 3». Если шаг 2 уже выполнен – скрипт либо упадет, либо сделает что-то лишнее. Декларативное описание говорит «должно быть вот так». Если уже так – ничего не делается. Если нет – инструмент приводит к нужному состоянию.

Чем это делают

Два основных инструмента IaC, для разных задач.

Terraform создает саму инфраструктуру: серверы, сети, базы данных, балансировщики в облаке. Вы описываете «хочу три виртуалки в такой-то сети, базу данных PostgreSQL, бакет для бэкапов» – Terraform идет в облако и создает это. Отвечает на вопрос «что должно существовать».

Пример Terraform – описание сервера

resource "yandex_compute_instance" "web" {
  name        = "web-server"
  platform_id = "standard-v3"
 
  resources {
    cores  = 2
    memory = 4
  }
 
  boot_disk {
    initialize_params {
      image_id = "fd8kdq6d0p8sij7h5qe3"   # Ubuntu 22.04
      size     = 20
    }
  }
}

Это не псевдокод – это реальный формат Terraform. Читается как описание: «сервер web-server, 2 ядра, 4 ГБ памяти, диск 20 ГБ с Ubuntu». Terraform прочитает это и создаст такой сервер в облаке.

Ansible настраивает уже существующие серверы: ставит софт, правит конфиги, создает пользователей. Отвечает на вопрос «как должен быть настроен сервер изнутри».

Пример Ansible – настройка сервера

- name: Установить nginx
  apt:
    name: nginx
    state: present
 
- name: Скопировать конфиг
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
 
- name: Запустить nginx
  service:
    name: nginx
    state: started
    enabled: yes

Тоже читается как описание: «nginx должен быть установлен, конфиг – такой, сервис – запущен». Ansible подключится к серверу по SSH и приведет его в это состояние.

3 items under this folder.