← Назад к вопросам

В чем разница между Terraform и Ansible?

2.0 Middle🔥 171 комментариев
#Ansible и управление конфигурацией#Облачные технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Terraform и Ansible

Both Terraform и Ansible используются в DevOps, но решают разные задачи. Это критично понимать для выбора правильного инструмента для конкретной работы.

Основная разница в парадигме

Terraform:

  • Infrastructure as Code (IaC) - описание инфраструктуры
  • Declarative - описываешь ЧТО хочешь получить
  • State Management - отслеживает текущее состояние
  • Plan & Apply - видишь изменения перед применением

Ansible:

  • Configuration Management (CM) - настройка серверов
  • Imperative + Declarative - можно описывать ШТО делать
  • Agentless - работает по SSH без установки агентов
  • Playbooks - набор инструкций для выполнения

Назначение каждого инструмента

Terraform - для создания инфраструктуры

# Terraform описывает AWS ресурсы (облачную инфраструктуру)

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "main-vpc"
  }
}

resource "aws_subnet" "main" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
}

resource "aws_instance" "web" {
  ami           = "ami-12345678"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.main.id
  
  tags = {
    Name = "web-server"
  }
}

# terraform plan - видишь что будет создано
# terraform apply - создаёшь инфраструктуру

Ansible - для конфигурации серверов

# Ansible настраивает уже существующие серверы

---
- hosts: webservers
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
    
    - name: Create app directory
      file:
        path: /opt/myapp
        state: directory
        owner: app
        group: app
    
    - name: Copy config
      copy:
        src: /local/config.yml
        dest: /opt/myapp/config.yml
    
    - name: Start nginx
      systemd:
        name: nginx
        state: started
        enabled: yes

# ansible-playbook site.yml - запускаешь на серверах

Сравнительная таблица

Параметр              | Terraform           | Ansible
--------------------+--------------------+-----------
Тип                 | IaC (Infrastructure)| CM (Config)
Парадигма           | Declarative        | Imperative/Declarative
Сфера применения    | Облака, VMs, сети  | OS, приложения, сервисы
Ввод агентов        | Нет (API based)    | Нет (SSH based)
State файл          | Да (важно!)        | Нет
Предпросмотр        | Plan (важно!)      | Нет
Идемпотентность     | Встроена            | Зависит от модулей
Синтаксис           | HCL (язык)         | YAML (простой)
Сложность освоения  | Средняя            | Простая
Архитектура         | Client-Server      | Agentless (SSH)
Управление состояния| State file         | Переиспользуемые playbooks

Жизненный цикл инфраструктуры

Правильное использование обоих инструментов:

1. Terraform: создаёшь инфраструктуру (EC2, RDS, VPC, etc.)
   terraform apply
   Результат: 3 EC2 инстанса, RDS база, Load Balancer

2. Ansible: настраиваешь эти инстансы (установка ПО, конфигурация)
   ansible-playbook site.yml
   Результат: на инстансах установлены nginx, app, DB клиент

3. Terraform: обновляешь инфраструктуру если нужно (скейлинг)
   terraform apply
   Результат: добавлены ещё 2 EC2 инстанса

4. Ansible: настраиваешь новые инстансы
   ansible-playbook site.yml
   Результат: новые инстансы настроены как старые

Детальное сравнение по задачам

1. Создание облачных ресурсов

Тerraform: ✅ Отлично
- Создание EC2, S3, RDS, Lambda, и т.д. на AWS
- Создание VM на Azure, GCP
- Управление сетью, firewall, load balancer

Ansible: ❌ Плохо
- Может взаимодействовать с облаком, но не специализирован
- Нет state management для облака

2. Конфигурация ОС и приложений

Terraform: ❌ Неправильно
- Сложнее через provisioners
- Не предназначен для этого

Ansible: ✅ Отлично
- Идеален для установки пакетов, конфигурации файлов, запуска сервисов
- Простой синтаксис
- Множество встроенных модулей

3. Управление состоянием

Terraform: ✅ Встроен
- State file отслеживает текущее состояние инфраструктуры
- terraform plan показывает что изменится
- Полный контроль над изменениями

Ansible: ❌ Отсутствует
- Нет встроенного state management
- Playbook может быть идемпотентным, но это зависит от модулей

4. Preview изменений

Terraform: ✅ Plan перед Apply
terraform plan
# Видишь:
# + aws_instance.web will be created
# ~ aws_security_group.main will be updated
# - aws_instance.old will be destroyed

Ansible: ❌ Нет встроенной preview
# Только пробное выполнение в dry-run mode (не всегда точно)
ansible-playbook site.yml --check

Практические примеры интеграции

Terraform + Ansible вместе:

# 1. Terraform создаёт инфраструктуру

resource "aws_instance" "web" {
  count         = 3
  ami           = "ami-12345678"
  instance_type = "t2.micro"
  
  tags = {
    Name = "web-${count.index}"
  }
}

# Outputs для Ansible
output "instance_ips" {
  value = [for instance in aws_instance.web : instance.private_ip]
}

output "inventory" {
  value = {for i, instance in aws_instance.web : instance.tags["Name"] => instance.private_ip}
}
# 2. Ansible использует Terraform outputs

all:
  vars:
    ansible_user: ec2-user
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
  hosts:
    web-0:
      ansible_host: 10.0.1.5
    web-1:
      ansible_host: 10.0.1.6
    web-2:
      ansible_host: 10.0.1.7

webservers:
  hosts:
    web-0:
    web-1:
    web-2:
# Рабочий flow

# 1. Создаём инфраструктуру
terraform init
terraform plan
terraform apply -auto-approve

# 2. Получаем IPs из Terraform
terraform output -json > inventory.json

# 3. Ждём когда инстансы запустятся
sleep 30

# 4. Настраиваем через Ansible
ansible-playbook -i inventory.ini site.yml

Популярные сценарии

Сценарий 1: Full automation stack

1. Terraform: создаёшь AWS инфраструктуру
2. Ansible: конфигурируешь инстансы
3. Terraform: управляешь изменениями инфраструктуры

Сценарий 2: Многоклаудовость

Тerraform: управляет AWS, Azure, GCP одновременно
Ansible: работает с уже созданными VM независимо от облака

Сценарий 3: На-премис (on-premise)

Terraform: VMware vSphere, Proxmox (создание VM)
Ansible: конфигурация этих VM

Когда использовать что

Используй Terraform если:

  • Создаёшь облачную инфраструктуру (AWS, Azure, GCP)
  • Нужен контроль над состоянием и preview
  • Работаешь с IaC в enterprise
  • Нужна reproducible инфраструктура

Используй Ansible если:

  • Настраиваешь уже существующие серверы
  • Нужна простота и быстрая кривая обучения
  • Работаешь с на-премис инфраструктурой
  • Нужна agentless архитектура
  • Делаешь ad-hoc команды на множество серверов

Недостатки каждого

Terraform:

  • Состояние (state file) может быть проблемой в teamwork
  • Кривая обучения HCL
  • Требует тщательного управления state
  • Не для настройки ОС

Ansible:

  • Нет встроенного state management
  • Медленнее на множество операций
  • Сложнее с complexity проектов
  • YAML может быть неинтуитивным

Выводы

Правильный подход:

Terraform = Infrastructure (what)
Ansible = Configuration (how)

Оба нужны в современном DevOps стеке

Правило:

  • Terraform - для управления облачной инфраструктурой
  • Ansible - для конфигурации приложений на этой инфраструктуре
  • Вместе они создают мощную и гибкую систему управления инфраструктурой

Альтернативы:

  • CloudFormation (AWS specifics)
  • Pulumi (программный IaC)
  • Chef/Puppet (альтернативы Ansible для CM)
  • Crossplane (Kubernetes native IaC)