Вопрос выбора между Ansible и Terraform часто возникает у DevOps-инженеров и системных администраторов. Ответ лежит в фундаментальном различии их предназначения. Terraform - это инструмент оркестрации для создания и управления инфраструктурой как код (IaC). Ansible - это конфигурационный менеджер для настройки и администрирования уже работающих систем. Вместе они формируют полный цикл автоматизации: Terraform «строит» виртуальные машины и сети, а Ansible «оживляет» их, устанавливая ПО и настраивая сервисы.
Эта статья даст вам четкие критерии для выбора инструмента под вашу задачу и покажет практический пример их совместной работы на актуальном для 2026 года стеке.
Главное отличие: оркестрация против конфигурации
Путаница между Ansible и Terraform возникает из-за пересечения терминов «автоматизация» и «управление инфраструктурой». Ключ к пониманию - в их базовой философии. Terraform работает как декларативный «строитель», который рисует план дома и заливает фундамент. Ansible действует как императивный «отделочник», который проводит коммуникации и делает ремонт внутри готовых стен.
Основное различие - в управлении состоянием. Terraform хранит файл состояния (state file), который описывает текущее состояние вашей инфраструктуры в облаке. Каждое изменение сначала анализируется через команду plan, сравнивается с состоянием и только затем применяется. Ansible не хранит состояние системы. Он императивно выполняет список задач (плейбук), приводя систему к нужной конфигурации каждый раз, когда вы его запускаете.
Terraform: декларативная оркестрация инфраструктуры как код (IaC)
Terraform использует декларативный язык HCL (HashiCorp Configuration Language). Вы описываете желаемое конечное состояние инфраструктуры, а Terraform сам вычисляет последовательность действий для его достижения.
Принцип работы:
- Декларативный язык (HCL): Вы описываете, что хотите создать (например, 3 VM в Yandex Cloud с определенными характеристиками), а не как это делать.
- План выполнения (plan): Команда
terraform planпоказывает, какие изменения будут внесены в инфраструктуру, сравнивая код с актуальным state-файлом. - Состояние (state file): Файл
terraform.tfstate- это источник истины. Он содержит сопоставление ресурсов в коде с реальными объектами у облачного провайдера.
Ключевая задача: Создание, изменение и уничтожение ресурсов инфраструктуры: виртуальных машин (VM), сетей (VPC), групп безопасности, балансировщиков нагрузки, хранилищ (S3, Cloud Storage).
Сильные стороны:
- Идемпотентность через состояние: Многократный запуск одного и того же кода не создаст дублирующих ресурсов, так как Terraform сверяется с state.
- Поддержка множества провайдеров: Единый синтаксис для работы с AWS, Azure, GCP, Yandex Cloud, OpenStack и даже SaaS-сервисами вроде GitHub или Datadog.
- Работа с неизменяемой инфраструктурой: Идеально подходит для парадигмы, где сервер не изменяется, а заменяется новой версией.
Пример кода (фрагмент main.tf для Yandex Cloud):
resource "yandex_compute_instance" "vm-for-k8s" {
name = "k8s-node-${count.index}"
platform_id = "standard-v3"
...
resources {
cores = 4
memory = 8
}
boot_disk { ... }
network_interface { ... }
metadata = {
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
}
count = 3
}Ansible: императивное управление конфигурацией и развертыванием
Ansible использует императивные плейбуки на YAML. Вы описываете последовательность шагов, которые необходимо выполнить на целевых хостах.
Принцип работы:
- Императивные плейбуки (YAML): Вы задаете точный порядок задач: установить пакет, скопировать файл конфигурации, перезапустить сервис.
- Выполнение по SSH/WinRM: Ansible подключается к управляемым узлам по SSH (для Linux) или WinRM (для Windows) без необходимости установки агентов (agentless-архитектура).
- Модульность: Каждая задача использует модуль (например,
apt,copy,systemd), который инкапсулирует логику выполнения.
Ключевая задача: Установка пакетов, настройка сервисов, управление файлами конфигурации, оркестрация развертывания приложений, выполнение одноразовых команд.
Сильные стороны:
- Простота начала работы: Для старта нужен только Python и SSH-доступ на целевые машины.
- Гибкость и читаемость: Плейбуки на YAML легко читать и понимать.
- Идемпотентность на уровне модулей: Большинство модулей Ansible спроектированы так, чтобы повторный запуск приводил к тому же результату (например, модуль
aptпроверит, установлен ли пакет, прежде чем пытаться установить его снова).
Пример плейбука (base_setup.yml):
- name: Base setup for Kubernetes nodes
hosts: all
become: yes
tasks:
- name: Install required system packages
apt:
name:
- docker.io
- curl
- gnupg2
- software-properties-common
state: present
update_cache: yes
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: presentПрактический кейс: развертывание кластера Kubernetes с помощью Terraform и Ansible
Рассмотрим полный цикл развертывания простого кластера Kubernetes из 3 узлов (1 control-plane, 2 worker). Этот пример наглядно показывает разделение обязанностей.
Шаг 1: Terraform создает "железо" для кластера
Terraform подготавливает инфраструктуру в облаке. Мы создаем виртуальные машины, сеть, правила фаервола и генерируем inventory-файл с IP-адресами для Ansible.
Ключевые ресурсы в main.tf:
- 3 виртуальные машины (yandex_compute_instance) с разными метками для control-plane и worker-узлов.
- Облачная сеть и подсеть (yandex_vpc_network, yandex_vpc_subnet).
- Группы безопасности (yandex_vpc_security_group), разрешающие SSH и межсерверную коммуникацию для Kubernetes.
- Output, который записывает IP-адреса созданных машин в файл
inventory.iniилиinventory.yaml.
Пример output в Terraform:
output "instance_ips" {
value = {
control_plane = yandex_compute_instance.vm-for-k8s[0].network_interface.0.nat_ip_address
workers = [
yandex_compute_instance.vm-for-k8s[1].network_interface.0.nat_ip_address,
yandex_compute_instance.vm-for-k8s[2].network_interface.0.nat_ip_address
]
}
}
# После apply можно сгенерировать inventory для Ansible
resource "local_file" "ansible_inventory" {
content = templatefile("inventory.tmpl",
{
control_plane = yandex_compute_instance.vm-for-k8s[0].network_interface.0.nat_ip_address
workers = yandex_compute_instance.vm-for-k8s[*].network_interface.0.nat_ip_address
}
)
filename = "../ansible/inventory.yaml"
}Шаг 2: Ansible "оживляет" инфраструктуру, устанавливая Kubernetes
Ansible получает inventory с IP-адресами от Terraform и выполняет конфигурацию. Без этого шага VM останутся просто пустыми серверами с базовой ОС.
Структура плейбуков Ansible:
- base_setup.yml: Общая настройка всех узлов: установка Docker, настройка репозиториев, создание пользователей.
- kubernetes.yml: Установка компонентов k8s (kubeadm, kubelet, kubectl) на все узлы.
- cluster_init.yml: Запуск
kubeadm initна control-plane, настройка сети (Calico/Flannel), присоединение worker-узлов с помощью токена.
Ключевые модули Ansible в работе:
apt/yum: Установка пакетов.systemd: Управление сервисами (docker, kubelet).template: Генерация конфигурационных файлов (например,/etc/docker/daemon.json).shellиcommand: Выполнение специфичных команд, таких какkubeadm init.
Этот подход гарантирует воспроизводимость: вы можете уничтожить весь кластер командой terraform destroy и развернуть его заново за 15-20 минут, запустив Terraform и затем Ansible. Более глубокие стратегии автоматизации инфраструктуры, включая миграции, разбираются в нашем руководстве по автоматизации переноса инфраструктуры в 2026.
Критерии выбора: Ansible, Terraform или их связка?
Используйте эту таблицу для быстрого принятия решения на основе вашей задачи.
| Ваша задача | Инструмент выбора | Обоснование |
|---|---|---|
| Создать виртуальные машины, сети, базы данных в облаке с нуля. | Terraform | Terraform управляет жизненным циклом облачных ресурсов через их провайдеров и строго контролирует зависимости. |
| Установить и настроить Nginx, PostgreSQL, мониторинг (Prometheus) на уже существующих серверах. | Ansible | Ansible создан для конфигурационного менеджмента и администрирования через SSH, идеален для установки ПО. |
| Полный цикл: от создания VM в облаке до запуска на них работающего приложения. | Terraform + Ansible | Terraform создает инфраструктуру, Ansible ее настраивает. Это стандартная и мощная связка. |
| Управление конфигурацией гибридной среды (облако + физические серверы). | Ansible (или связка) | Ansible легко работает с любыми узлами, доступными по SSH. Terraform может создать облачную часть. |
| Настройка SaaS-сервисов (создание репозитория в GitHub, бакета в Cloudflare R2). | Terraform | У Terraform есть провайдеры для многих SaaS, что позволяет управлять ими как кодом. |
Когда выбирать Terraform?
- Задачи создания и управления облачной инфраструктурой (IaaS/PaaS). Виртуальные машины, Kubernetes-сервисы (EKS, AKS), бессерверные функции.
- Управление жизненным циклом неизменяемых ресурсов. Когда вы практикуете подход «создать новое → перенаправить трафик → удалить старое».
- Необходимость строгого контроля состояния и зависимостей. Terraform явно показывает, от каких ресурсов зависит другой ресурс, и не позволит удалить используемую сеть, пока в ней есть VM.
Когда выбирать Ansible?
- Настройка и администрирование уже существующих серверов. Патчинг, обновления, ротация логов, сбор метрик с работающих систем.
- Установка и конфигурация сложного ПО. Развертывание кластеров баз данных, систем мониторинга, CI/CD-агентов.
- Автоматизация рутинных операционных задач. Единовременное выполнение команд на группе серверов, массовое изменение конфигураций.
Идеальный тандем: схема работы Terraform + Ansible
Для реализации полного цикла IaC с конфигурационным менеджментом используйте следующий workflow:
- Terraform создает инфраструктуру и генерирует динамический inventory. Используйте ресурс
local_fileили output провайдера (например,ansible), чтобы записать IP-адреса созданных ресурсов в файл формата YAML или JSON, понятный Ansible. - CI/CD пайплайн запускает Ansible. После успешного выполнения
terraform applyваш пайплайн в GitLab CI, GitHub Actions или Jenkins запускает плейбуки Ansible, передавая им сгенерированный inventory как переменную. - Ansible выполняет конфигурацию. Плейбуки настраивают ОС, устанавливают необходимое ПО и развертывают приложения.
Рекомендации по организации:
- Храните state-файл Terraform удаленно (Terraform Cloud, S3 бакет с блокировкой), особенно при работе в команде.
- Структурируйте код Ansible по ролям (roles) для повторного использования.
- Используйте инструменты вроде
terraform outputдля прямой передачи переменных в Ansible через командную строку.
Актуальные требования к инфраструктурному коду и его интеграции в CI/CD детально описаны в нашем материале о GitOps и Infrastructure as Code в 2026.
Ansible и Terraform в 2026: тенденции и перспективы
К 2026 году оба инструмента глубоко интегрировались в cloud-native экосистему, но их ядерные функции остались стабильными.
Интеграция с Kubernetes и cloud-native экосистемой
Terraform развивается в сторону более глубокого управления ресурсами внутри кластера Kubernetes. Провайдеры kubernetes и helm позволяют описывать не только инфраструктуру под кластер, но и некоторые объекты внутри него (Namespaces, Ingress, часть Custom Resources). Однако лучшей практикой считается использование Terraform для инфраструктуры кластера (создание Managed Kubernetes, дисков, сетевых политик на уровне облака), а для управления workloads внутри - инструменты вроде Helm, ArgoCD или Kustomize.
Ansible усилил позиции в мире Kubernetes с помощью коллекции kubernetes.core и концепции операторов Ansible. Теперь можно писать плейбуки, которые управляют ресурсами Kubernetes напрямую через его API, что полезно для сложных сценариев конфигурации, не укладывающихся в шаблоны Helm. Однако для стандартного деплоя приложений Helm или GitOps-инструменты часто оказываются проще.
Вывод: Terraform чаще выбирают для инфраструктуры кластера, Ansible - для специфичной конфигурации workloads или управления гибридными средами, где есть и Kubernetes, и классические VM.
Тенденции 2026:
- Рост популярности OpenTofu: После изменения лицензии Terraform в 2023 году, форк OpenTofu набирает обороты как open-source альтернатива с гарантированной открытостью.
- Смещение к платформенной инженерии (Platform Engineering): Terraform становится ключевым инструментом для создания внутренних разработческих платформ (Internal Developer Platforms), предоставляя командам самообслуживаемые модули инфраструктуры.
- Edge-вычисления: Принципы IaC и конфигурационного менеджмента адаптируются под edge-среды. Интересный пример - использование подхода, аналогичного связке Terraform+Ansible, для управления кластерами на нетрадиционных платформах, вплоть до мобильных устройств в локальной сети, где «инфраструктурой» могут выступать контейнеры, а настройкой - скрипты или легковесные плейбуки.
Чтобы понять, как эти инструменты вписываются в полный спектр обязанностей современного инженера, изучите сравнение обязанностей DevOps в AWS, Azure и GCP на 2026 год.
Итоговые рекомендации и выводы
Terraform и Ansible решают разные задачи. Terraform - для оркестрации инфраструктуры (создание/уничтожение ресурсов), Ansible - для конфигурационного менеджмента (настройка работающих систем). Их фундаментальное различие - в парадигме: декларативное управление состоянием против императивного выполнения задач.
Для большинства проектов в 2026 году оптимальна связка Terraform + Ansible. Она покрывает полный цикл от облачного ресурса до работающего приложения, обеспечивая воспроизводимость и контроль.
Финальные рекомендации:
- Для простых задач: Если вам нужно только создать несколько статических серверов в облаке - начните с Terraform. Если нужно только настроить уже имеющийся парк серверов - используйте Ansible.
- Для комплексных проектов: Применяйте связку. Пусть Terraform создает инфраструктуру и передает динамические данные (IP-адреса) в Ansible для последующей конфигурации.
- Для изучения: Начните с понимания философии каждого инструмента. Затем освойте их совместное использование на практических примерах, подобных развертыванию Kubernetes из этой статьи. Для более широкого контекста сравнения рассмотрите наш гайд по выбору инструмента автоматизации в 2026, где мы также рассматриваем Chef и другие решения.
Правильный выбор инструмента экономит время и снижает операционные риски. Определите свою основную задачу, сверьтесь с критериями из этой статьи и внедряйте решение, которое закроет ваши текущие потребности и будет масштабироваться в будущем.