Ansible: обзор
Ansible — инструмент автоматизации конфигурации серверов (IaC): декларативные playbook-файлы описывают желаемое состояние сервера, Ansible приводит его к этому состоянию по SSH без агентов.
Зачем нужно
При масштабировании на несколько серверов ручная настройка каждого превращается в кошмар. Ansible позволяет описать конфигурацию один раз и применить к сотне серверов одновременно. В отличие от Terraform, Ansible работает на уровне ОС — устанавливает пакеты, настраивает сервисы, управляет файлами. Без агентов: нужен только SSH.
Где используется
- Настройка новых EC2/VPS-серверов (установка Node.js, Nginx, Docker)
- Деплой приложений на группу серверов
- Управление конфигурационными файлами (Nginx, systemd)
- Периодические задачи обслуживания (обновление пакетов, ротация сертификатов)
Основной контент
Установка
pip install ansible
ansible --version
Inventory (список серверов)
# inventory.ini
[webservers]
server1.example.com ansible_user=ubuntu
server2.example.com ansible_user=ubuntu
[databases]
db1.example.com ansible_user=admin ansible_ssh_private_key_file=~/.ssh/db-key.pem
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Простой Playbook: настройка веб-сервера
# setup-webserver.yml
---
- name: Configure web server
hosts: webservers
become: yes # sudo
vars:
node_version: "20"
app_dir: /var/www/myapp
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name:
- curl
- git
- nginx
state: present
- name: Install Node.js
shell: |
curl -fsSL https://deb.nodesource.com/setup_{{ node_version }}.x | bash -
apt-get install -y nodejs
args:
creates: /usr/bin/node # не запускать если уже есть
- name: Create app directory
file:
path: "{{ app_dir }}"
state: directory
owner: ubuntu
mode: '0755'
- name: Copy Nginx config
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/myapp
notify: Restart nginx
- name: Enable nginx site
file:
src: /etc/nginx/sites-available/myapp
dest: /etc/nginx/sites-enabled/myapp
state: link
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
Запуск
# Проверить подключение к серверам
ansible webservers -i inventory.ini -m ping
# Запустить playbook (dry-run)
ansible-playbook -i inventory.ini setup-webserver.yml --check
# Применить
ansible-playbook -i inventory.ini setup-webserver.yml
# Только определённые теги
ansible-playbook -i inventory.ini deploy.yml --tags "deploy"
Шаблон Nginx (Jinja2)
# nginx.conf.j2
server {
listen 80;
server_name {{ ansible_host }};
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
}
}
Частые ошибки
- Хранить пароли и ключи в playbook — использовать
ansible-vault encrypt - Не использовать
--checkперед применением — можно сломать прод - Playbook не идемпотентен: повторный запуск даёт другой результат — каждый таск должен быть идемпотентным
- Слишком большой монолитный playbook — разбивать на роли (roles)
Связанные темы
- _MOC DevOps
- Infrastructure as Code -- IaC
- Terraform -- основы
- SSH -- подключение к серверу
- Nginx -- базовая настройка