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

Нужен второй сервер? Запускаете тот же файл – получаете точную копию. Нужно двадцать? Тот же файл, просто говорите «сделай двадцать». Сервер сломался? Запускаете файл – инфраструктура восстанавливается за минуты. Заболели? Коллега берет ваш файл и все повторяет.
Аналогия с рецептом
Можно готовить «на глаз»: щепотку того, ложку этого, как рука легла. Получилось вкусно – отлично. Но повторить точно так же завтра вы не сможете, и научить кого-то – тоже.
А можно записать рецепт: 200 грамм муки, 2 яйца, 150 мл молока, печь 30 минут при 180 градусах. Блюдо получится одинаковым у вас сегодня, у вас через месяц и у любого, кто возьмет рецепт.
IaC – это рецепт для инфраструктуры. Не «настроил как помню», а точное описание, по которому собирается все, всегда одинаково.
Что это дает
-
Повторяемость. Один файл – сколько угодно одинаковых серверов. Никакого configuration drift. Все копии идентичны, потому что собраны из одного описания.
-
Версионируемость. Файл лежит в Git, как обычный код. Видно всю историю: кто, что и когда менял. Что-то сломалось после изменения инфраструктуры? Откатились на предыдущую версию файла.
-
Проверяемость. Изменения в инфраструктуре проходят через ревью, как код. Коллега смотрит, что вы собираетесь поменять, до того как это применится к боевым серверам. Опечатались, хотели открыть один порт, а открываете все – на ревью это заметят.
-
Идемпотентность. Можно запустить один и тот же файл дважды – ничего не сломается. Инструмент сравнит текущее состояние с описанным и применит только разницу. Сервер уже существует и настроен правильно? Ничего не произойдет. Какой-то параметр изменился? Инструмент поправит именно его, не трогая остальное.
Декларативный подход
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 и приведет его в это состояние.
