У вас 30 серверов. На каждом нужно обновить конфиг nginx, перезапустить сервис и создать директорию для логов. Вы открываете терминал и начинаете ходить по SSH вручную. Через час пятый сервер отличается от первого, на восьмом вы сделали опечатку, а на четырнадцатом забыли перезапустить сервис. Классика жанра.
Ansible — это лекарство от ручного администрирования. Один YAML-файл, одна команда — и все 30 серверов настроены одинаково, воспроизводимо и без SSH-марафона. В этом гайде: установка Ansible с нуля, настройка inventory hosts, написание playbook, работа с модулями и ролями, управление Linux, Docker и Windows. Только практика, только рабочие конфиги.
Что такое Ansible и почему он завоевал мир DevOps
Ansible — система автоматизации и управления конфигурациями с открытым исходным кодом от Red Hat. Главное отличие от конкурентов (Chef, Puppet, SaltStack) — агентless-архитектура: на управляемых серверах не нужно ничего устанавливать. Ansible работает по SSH для Linux и WinRM для Windows. Всё.
Что делает Ansible в реальной жизни:
- Установка и настройка программного обеспечения на парке серверов
- Деплой приложений и контейнеров Docker
- Настройка сети, файрвола, пользователей и прав доступа
- Оркестрация сложных многоуровневых развёртываний
- Управление облачной инфраструктурой (AWS, Azure, GCP)
- Конфигурационный менеджмент — гарантия идентичного состояния серверов
Ansible использует YAML playbook — человекочитаемые файлы-сценарии. Если вы умеете читать, вы уже почти умеете писать Ansible playbook. Это не преувеличение.
Установка Ansible: все способы
Ansible устанавливается только на управляющую машину (control node). Управляемые серверы не требуют никаких дополнительных пакетов — только SSH и Python (Python 3.8+ уже есть почти везде).
Установка Ansible на Ubuntu / Debian
# Обновляем репозитории и устанавливаем
sudo apt update
sudo apt install ansible -y
# Для самой актуальной версии - через официальный PPA
sudo apt install software-properties-common -y
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible -y
Установка на RHEL / CentOS / Rocky Linux
# RHEL 8/9, CentOS Stream, Rocky Linux
sudo dnf install epel-release -y
sudo dnf install ansible -y
# Или напрямую через dnf (если репозиторий уже настроен)
sudo dnf install ansible-core -y
Установка через pip (универсальный способ)
# Установка последней версии через pip
pip install ansible
# Рекомендуется использовать virtualenv
python3 -m venv ansible-env
source ansible-env/bin/activate
pip install ansible
# Установка дополнительных коллекций
ansible-galaxy collection install community.general
ansible-galaxy collection install community.docker
Проверка установки
# Версия Ansible
ansible --version
# Пример вывода:
# ansible [core 2.16.0]
# python version = 3.11.4
# jinja version = 3.1.2
# Список установленных коллекций
ansible-galaxy collection list
Совет: используйте ansible-core + отдельные коллекции через ansible-galaxy вместо монолитного пакета ansible. Это даёт контроль над версиями и меньший размер установки.
Настройка SSH: основа всего
Ansible использует SSH для управления Linux-серверами. Настройка ключей — не опция, а необходимость. Вводить пароль при каждом запуске playbook на 50 серверах — это уже не автоматизация.
Генерация и распространение SSH-ключей
# Генерируем ключ на управляющей машине (если ещё нет)
ssh-keygen -t ed25519 -C "ansible-control" -f ~/.ssh/ansible_key
# Копируем публичный ключ на каждый управляемый сервер
ssh-copy-id -i ~/.ssh/ansible_key.pub user@192.168.1.10
ssh-copy-id -i ~/.ssh/ansible_key.pub user@192.168.1.11
ssh-copy-id -i ~/.ssh/ansible_key.pub user@192.168.1.20
# Проверяем подключение без пароля
ssh -i ~/.ssh/ansible_key user@192.168.1.10
Конфигурация Ansible для использования ключа
# Файл: ansible.cfg (в директории проекта или /etc/ansible/ansible.cfg)
[defaults]
inventory = ./inventory/hosts
remote_user = ansible
private_key_file = ~/.ssh/ansible_key
host_key_checking = False
retry_files_enabled = False
stdout_callback = yaml
[privilege_escalation]
become = True
become_method = sudo
become_user = root
Inventory hosts: реестр вашей инфраструктуры
Inventory — это список серверов, которыми управляет Ansible. Без него никуда. Файл по умолчанию: /etc/ansible/hosts, но правильный подход — держать inventory в директории проекта.
Базовый inventory в INI-формате
# Файл: inventory/hosts
[web]
192.168.1.10
192.168.1.11
web03.example.com
[db]
192.168.1.20
192.168.1.21
[monitoring]
192.168.1.30
# Группа, включающая другие группы
[production:children]
web
db
monitoring
# Переменные для группы
[web:vars]
http_port=80
nginx_worker_processes=4
[all:vars]
ansible_user=ansible
ansible_python_interpreter=/usr/bin/python3
Inventory в YAML-формате (рекомендуется для сложных проектов)
# Файл: inventory/hosts.yml
all:
children:
web:
hosts:
web01:
ansible_host: 192.168.1.10
nginx_port: 80
web02:
ansible_host: 192.168.1.11
nginx_port: 8080
vars:
nginx_worker_processes: 4
db:
hosts:
db01:
ansible_host: 192.168.1.20
postgres_version: "15"
db02:
ansible_host: 192.168.1.21
postgres_version: "15"
windows:
hosts:
win01:
ansible_host: 192.168.1.50
ansible_user: Administrator
ansible_password: "{{ vault_win_password }}"
ansible_connection: winrm
ansible_winrm_transport: ntlm
Проверка inventory и связи с серверами
# Список всех хостов
ansible all --list-hosts
# Пинг всех серверов (модуль ping проверяет SSH + Python)
ansible all -m ping
# Пинг конкретной группы
ansible web -m ping
# Пинг с указанием конкретного inventory файла
ansible all -m ping -i inventory/hosts.yml
# Получить факты об одном сервере
ansible web01 -m gather_facts
Если ansible all -m ping возвращает SUCCESS для всех хостов — фундамент заложен. Можно строить дальше.
Основные Ansible модули (ansible.builtin)
Модули — это строительные блоки Ansible. Каждый модуль выполняет конкретную задачу: установить пакет, создать файл, управлять сервисом. Коллекция ansible.builtin содержит всё необходимое для повседневной работы.
| Модуль | Назначение | Пример использования |
|---|---|---|
| apt / dnf / yum | Управление пакетами | Установка nginx, curl, git |
| copy | Копирование файлов | Деплой конфигов |
| template | Шаблоны Jinja2 | Динамические конфиги |
| file | Управление файлами/директориями | Создание папок, chmod |
| service | Управление сервисами | Start/stop/restart |
| command / shell | Выполнение команд | Произвольные команды |
| user / group | Управление пользователями | Создание системных пользователей |
| lineinfile | Редактирование файлов | Добавить строку в конфиг |
| git | Работа с репозиториями | Клонирование, обновление |
| uri | HTTP-запросы | Проверка API, вебхуки |
Запуск модулей в режиме ad-hoc
# Выполнить команду на всех серверах
ansible all -a "uptime"
ansible web -a "df -h"
# Установить пакет
ansible web -m apt -a "name=curl state=present" --become
# Перезапустить сервис
ansible web -m service -a "name=nginx state=restarted" --become
# Скопировать файл
ansible web -m copy -a "src=/local/file.conf dest=/etc/nginx/file.conf" --become
# Получить информацию о файле
ansible all -m stat -a "path=/etc/passwd"
Ansible Playbook: сердце автоматизации
Ad-hoc команды хороши для разовых задач. Playbook — это когда вам нужно воспроизводимо настроить всё с нуля. Один файл, вся инфраструктура.
Структура playbook
# Файл: deploy-web.yml
---
- name: Настройка веб-серверов # Имя play
hosts: web # Целевая группа
become: yes # Использовать sudo
gather_facts: yes # Собрать системные факты
vars: # Переменные
nginx_version: "1.24"
app_port: 8080
app_dir: /opt/myapp
pre_tasks: # Задачи до основных
- name: Обновить кеш пакетов
apt:
update_cache: yes
cache_valid_time: 3600
tasks: # Основные задачи
- name: Установить nginx
apt:
name: nginx
state: present
- name: Создать директорию приложения
file:
path: "{{ app_dir }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Скопировать конфиг nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/myapp.conf
notify: Перезапустить nginx # Триггер handler
- name: Включить сайт
file:
src: /etc/nginx/sites-available/myapp.conf
dest: /etc/nginx/sites-enabled/myapp.conf
state: link
notify: Перезапустить nginx
- name: Убедиться, что nginx запущен и включён в автозагрузку
service:
name: nginx
state: started
enabled: yes
handlers: # Обработчики событий
- name: Перезапустить nginx
service:
name: nginx
state: restarted
post_tasks: # Задачи после основных
- name: Проверить доступность nginx
uri:
url: "http://localhost:{{ app_port }}"
status_code: 200
ignore_errors: yes
Запуск playbook
# Базовый запуск
ansible-playbook deploy-web.yml
# Проверка синтаксиса без выполнения
ansible-playbook deploy-web.yml --syntax-check
# Dry-run: показать что изменится, но не применять
ansible-playbook deploy-web.yml --check
# Запуск с подробным выводом
ansible-playbook deploy-web.yml -v # verbose
ansible-playbook deploy-web.yml -vvv # очень подробно
# Запустить только на конкретном хосте из группы
ansible-playbook deploy-web.yml --limit web01
# Запустить начиная с определённой задачи
ansible-playbook deploy-web.yml --start-at-task "Скопировать конфиг nginx"
# Запустить только задачи с тегом
ansible-playbook deploy-web.yml --tags "nginx,config"
Переменные (vars) в Ansible: управление конфигурацией
Жёсткие значения в playbook — признак плохого кода. Ansible vars позволяют сделать playbook универсальным: одни задачи, разные окружения (dev/staging/prod).
Уровни приоритета переменных (от низшего к высшему)
# 1. Переменные в inventory
# inventory/hosts.yml
all:
vars:
env: production
# 2. Групповые переменные
# inventory/group_vars/web.yml
nginx_port: 80
nginx_worker_processes: 4
# 3. Хостовые переменные
# inventory/host_vars/web01.yml
nginx_port: 8080 # переопределяет групповую переменную
# 4. Переменные в playbook
vars:
app_name: myapp
# 5. Внешние файлы переменных
vars_files:
- vars/common.yml
- vars/secrets.yml # зашифрованный через ansible-vault
# 6. Переменные командной строки (наивысший приоритет)
ansible-playbook playbook.yml -e "env=staging app_version=2.1"
Ansible Vault: секреты под замком
# Создать зашифрованный файл с секретами
ansible-vault create vars/secrets.yml
# Зашифровать существующий файл
ansible-vault encrypt vars/secrets.yml
# Редактировать зашифрованный файл
ansible-vault edit vars/secrets.yml
# Запуск playbook с vault-паролем
ansible-playbook playbook.yml --ask-vault-pass
ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
Никогда не храните пароли, токены и ключи в открытых YAML-файлах. Ansible Vault + Git — правильная связка. Файл .vault_pass добавляйте в .gitignore.
Модуль file: управление файлами и директориями
# Файл: tasks/files.yml
---
- name: Создать директорию для логов
file:
path: /var/log/myapp
state: directory
owner: www-data
group: www-data
mode: '0750'
recurse: yes
- name: Создать пустой файл
file:
path: /opt/myapp/.env
state: touch
mode: '0600'
- name: Создать символическую ссылку
file:
src: /opt/myapp/current
dest: /var/www/html
state: link
- name: Удалить временные файлы (старше 7 дней)
find:
paths: /tmp/myapp
age: 7d
recurse: yes
register: old_files
- name: Удалить найденные файлы
file:
path: "{{ item.path }}"
state: absent
loop: "{{ old_files.files }}"
Ansible Roles: структура для серьёзных проектов
Когда playbook разрастается до 300 строк — пора использовать roles. Роль — это стандартная структура директорий, которая делает код переиспользуемым и понятным любому члену команды.
Создание структуры роли
# Автоматически создать структуру роли
ansible-galaxy role init roles/nginx
# Созданная структура:
roles/
nginx/
tasks/ # основные задачи
main.yml
handlers/ # обработчики событий
main.yml
templates/ # шаблоны Jinja2 (.j2)
nginx.conf.j2
files/ # статические файлы
vars/ # переменные роли (не переопределяются)
main.yml
defaults/ # переменные по умолчанию (переопределяются)
main.yml
meta/ # метаданные и зависимости
main.yml
README.md
Пример роли для установки и настройки nginx
# roles/nginx/defaults/main.yml
---
nginx_port: 80
nginx_worker_processes: auto
nginx_worker_connections: 1024
nginx_server_name: "{{ ansible_hostname }}"
nginx_root: /var/www/html
# roles/nginx/tasks/main.yml
---
- name: Установить nginx
apt:
name: nginx
state: present
update_cache: yes
tags: [nginx, install]
- name: Настроить nginx из шаблона
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
<a class="wpil_keyword_link" href="https://it-apteka.com/category/rezervnoe-kopirovanie/" target="_blank" rel="noopener" title="Резервное копирование" data-wpil-keyword-link="linked" data-wpil-monitor-id="820">backup</a>: yes
notify: Reload nginx
tags: [nginx, config]
- name: Настроить виртуальный хост
template:
src: vhost.conf.j2
dest: "/etc/nginx/sites-available/{{ nginx_server_name }}.conf"
notify: Reload nginx
tags: [nginx, config]
- name: Включить виртуальный хост
file:
src: "/etc/nginx/sites-available/{{ nginx_server_name }}.conf"
dest: "/etc/nginx/sites-enabled/{{ nginx_server_name }}.conf"
state: link
notify: Reload nginx
- name: Запустить nginx
service:
name: nginx
state: started
enabled: yes
tags: [nginx, service]
# roles/nginx/handlers/main.yml
---
- name: Reload nginx
service:
name: nginx
state: reloaded
- name: Restart nginx
service:
name: nginx
state: restarted
# Использование роли в playbook: site.yml
---
- name: Настройка веб-серверов
hosts: web
become: yes
roles:
- role: nginx
vars:
nginx_port: 443
nginx_server_name: api.example.com
- role: certbot # Роль для SSL
- role: monitoring_agent # Роль для мониторинга
Готовые роли из Ansible Galaxy
# Поиск ролей в галерее
ansible-galaxy search nginx
# Установка готовой роли
ansible-galaxy install geerlingguy.nginx
ansible-galaxy install geerlingguy.docker
ansible-galaxy install geerlingguy.postgresql
# Установка из requirements.yml (правильный путь)
# requirements.yml:
# roles:
# - name: geerlingguy.nginx
# version: "3.2.0"
# - name: geerlingguy.docker
# version: "6.4.0"
ansible-galaxy install -r requirements.yml
Jeff Geerling (geerlingguy) создал золотой стандарт Ansible-ролей. Его коллекция на Galaxy — первое место, куда стоит заглянуть перед написанием своей роли с нуля.
Ansible и Docker: управление контейнерами
Ansible отлично интегрируется с Docker через коллекцию community.docker. Это удобно, когда нужно управлять контейнерами в рамках общей инфраструктурной автоматизации.
Установка Docker через Ansible
# tasks/docker-setup.yml
---
- name: Установить зависимости Docker
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
state: present
- name: Добавить GPG ключ Docker
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Добавить репозиторий Docker
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Установить Docker Engine
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
state: present
update_cache: yes
- name: Добавить пользователя ansible в группу docker
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
- name: Запустить и включить Docker
service:
name: docker
state: started
enabled: yes
Управление контейнерами через Ansible
# tasks/containers.yml
---
- name: Запустить nginx контейнер
community.docker.docker_container:
name: nginx
image: nginx:1.25-alpine
state: started
restart_policy: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /opt/nginx/conf:/etc/nginx/conf.d:ro
- /opt/nginx/html:/usr/share/nginx/html:ro
env:
NGINX_HOST: "{{ ansible_hostname }}"
labels:
traefik.enable: "true"
- name: Запустить стек через docker-compose
community.docker.docker_compose_v2:
project_src: /opt/myapp
state: present
pull: always
- name: Убедиться, что образ актуален
community.docker.docker_image:
name: myapp
tag: latest
source: pull
force_source: yes
- name: Удалить неиспользуемые образы
community.docker.docker_prune:
images: yes
images_filters:
dangling: true
⚡ Где запускать Ansible control node?
Для production-среды Ansible control node должен быть на отдельном стабильном сервере — не на вашем ноутбуке, который периодически уходит в спячку. Сравнение актуальных VPS-провайдеров для инфраструктурных задач:
| Провайдер | Тариф для DevOps | CPU / RAM | SLA | Особенности |
|---|---|---|---|---|
| Timeweb Cloud | от 299 руб/мес | 1 vCPU / 1 GB | 99.95% | Готовые образы Ubuntu/Debian |
| Selectel | от 320 руб/мес | 1 vCPU / 1 GB | 99.95% | Быстрые NVMe диски |
| Cloud.ru | от 250 руб/мес | 1 vCPU / 1 GB | 99.95% | Российская инфраструктура |
| Reg.ru | от 199 руб/мес | 1 vCPU / 512 MB | 99.9% | Простая панель управления |
Для Ansible control node достаточно 1 vCPU и 1 GB RAM. Ключевые параметры: стабильный uptime, быстрая сеть до управляемых серверов, возможность создания SSH-ключей через API.
Ansible и Windows: управление через WinRM
Да, Ansible умеет управлять Windows. Вместо SSH используется WinRM (Windows Remote Management). Функциональность немного уже, чем для Linux, но для большинства задач хватает.
Настройка WinRM на Windows-сервере
# Выполнить на Windows (PowerShell от имени администратора):
# Скачать и запустить <a class="wpil_keyword_link" href="https://it-apteka.com/category/scripts/" target="_blank" rel="noopener" title="Скрипты" data-wpil-keyword-link="linked" data-wpil-monitor-id="819">скрипт</a> настройки WinRM
$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file
# Или вручную:
winrm quickconfig -q
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
Inventory для Windows хостов
# inventory/group_vars/windows.yml
ansible_connection: winrm
ansible_winrm_transport: ntlm
ansible_winrm_server_cert_validation: ignore
ansible_port: 5985
ansible_user: Administrator
ansible_password: "{{ vault_windows_password }}"
Playbook для Windows
# windows-setup.yml
---
- name: Настройка Windows серверов
hosts: windows
gather_facts: yes
tasks:
- name: Проверить связь (Windows ping)
ansible.windows.win_ping:
- name: Установить программу через Chocolatey
chocolatey.chocolatey.win_chocolatey:
name:
- notepadplusplus
- 7zip
- git
state: present
- name: Создать директорию
ansible.windows.win_file:
path: C:\Scripts\Ansible
state: directory
- name: Скопировать <a href="https://it-apteka.com/mnogopotochnoe-kopirovanie-fajlov-v-windows-uskorjaem-v-razy/" target="_blank" rel="noopener" data-wpil-monitor-id="974">файл на Windows</a>
ansible.windows.win_copy:
src: files/config.xml
dest: C:\Scripts\Ansible\config.xml
- name: Запустить PowerShell скрипт
ansible.windows.win_shell: |
Set-ExecutionPolicy RemoteSigned -Force
C:\Scripts\setup.ps1
- name: Управление Windows-службой
ansible.windows.win_service:
name: Spooler
state: started
start_mode: auto
- name: Установить обновления Windows
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
reboot: yes
reboot_timeout: 600
Обработка ошибок в Ansible: модуль fail и другие инструменты
Хороший playbook не просто выполняет задачи — он знает, когда остановиться и почему. Вот инструментарий для грамотной обработки ошибок.
# tasks/error-handling.yml
---
# Зарегистрировать результат команды
- name: Проверить статус сервиса
command: systemctl is-active nginx
register: nginx_status
ignore_errors: yes # Не падать при ошибке
# Завершить playbook с сообщением при условии
- name: Остановить если nginx не работает
fail:
msg: "КРИТИЧНО: Nginx не запущен! Статус: {{ nginx_status.stdout }}"
when: nginx_status.rc != 0
# Блок try-catch в Ansible
- name: Попытаться выполнить рискованную операцию
block:
- name: Основная задача
command: /opt/scripts/deploy.sh
- name: Проверка результата
uri:
url: http://localhost/health
status_code: 200
rescue:
- name: Откатить изменения при ошибке
command: /opt/scripts/rollback.sh
- name: Уведомить о сбое
uri:
url: "{{ slack_webhook_url }}"
method: POST
body_format: json
body:
text: "Деплой на {{ inventory_hostname }} завершился ошибкой!"
always:
- name: Записать в лог в любом случае
lineinfile:
path: /var/log/ansible-deploy.log
line: "{{ ansible_date_time.iso8601 }} - Деплой завершён на {{ inventory_hostname }}"
# Проверка переменной перед выполнением
- name: Проверить обязательную переменную
fail:
msg: "Переменная 'app_version' не задана!"
when: app_version is not defined or app_version | length == 0
Полезные команды Ansible: шпаргалка на каждый день
# ===== INVENTORY =====
ansible all --list-hosts # Список всех хостов
ansible web --list-hosts # Хосты группы
ansible-inventory --list # Полный inventory в JSON
ansible-inventory --graph # Дерево групп
# ===== PING И ФАКТЫ =====
ansible all -m ping # Проверить связь
ansible web -m gather_facts # Собрать факты
ansible all -m setup -a "filter=ansible_os*" # Конкретные факты
# ===== AD-HOC КОМАНДЫ =====
ansible web -a "uptime" # Uptime серверов
ansible web -a "df -h" # Дисковое пространство
ansible all -a "free -m" # Оперативная память
ansible web -m apt -a "upgrade=dist" --become # Обновить все пакеты
# ===== PLAYBOOK =====
ansible-playbook playbook.yml # Запуск
ansible-playbook playbook.yml --check # Dry-run
ansible-playbook playbook.yml --diff # Показать изменения файлов
ansible-playbook playbook.yml --limit web01 # Только один хост
ansible-playbook playbook.yml --tags deploy # Только задачи с тегом
ansible-playbook playbook.yml --skip-tags tests # Пропустить задачи с тегом
ansible-playbook playbook.yml -e "version=2.1" # Передать переменную
# ===== VAULT =====
ansible-vault create secrets.yml # Создать зашифрованный файл
ansible-vault edit secrets.yml # Редактировать
ansible-vault view secrets.yml # Просмотреть
ansible-vault encrypt_string 'MyPassword' --name 'db_password' # Зашифровать строку
# ===== GALAXY =====
ansible-galaxy role install geerlingguy.nginx # Установить роль
ansible-galaxy collection install community.docker # Установить коллекцию
ansible-galaxy role list # Список установленных ролей
Структура production Ansible-проекта
Хаотичный набор playbook-файлов в одной папке — это технический долг, который придётся возвращать. Вот структура, проверенная в боевых условиях:
ansible-project/
├── ansible.cfg # Конфигурация Ansible
├── requirements.yml # Зависимости (роли и коллекции)
├── site.yml # Главный playbook (точка входа)
├── deploy.yml # Playbook деплоя
├── maintenance.yml # Playbook обслуживания
│
├── inventory/
│ ├── production/
│ │ ├── hosts.yml # Хосты production
│ │ ├── group_vars/
│ │ │ ├── all.yml
│ │ │ ├── web.yml
│ │ │ └── db.yml
│ │ └── host_vars/
│ │ └── web01.yml
│ └── staging/
│ └── hosts.yml
│
├── roles/
│ ├── common/ # Базовая <a title="Сервер активации Windows: подключение, настройка и решение ошибок KMS" href="https://it-apteka.com/server-aktivacii-windows-podkljuchenie-nastrojka-i-reshenie-oshibok-kms/" target="_blank" rel="noopener" data-wpil-monitor-id="814">настройка всех серверов</a>
│ ├── nginx/ # Веб-сервер
│ ├── postgresql/ # БД
│ └── docker/ # Docker Engine
│
├── playbooks/
│ ├── setup-web.yml
│ ├── setup-db.yml
│ └── deploy-app.yml
│
├── files/ # Статические файлы
├── templates/ # Шаблоны Jinja2
└── vars/
├── common.yml
└── secrets.yml # Зашифровано через ansible-vault
Типичные ошибки и их лечение
«UNREACHABLE: Failed to connect to the host via ssh»
# Проверить SSH-подключение вручную
ssh -i ~/.ssh/ansible_key user@192.168.1.10
# Проверить, что хост доступен
ping 192.168.1.10
# Отладить подключение Ansible
ansible web01 -m ping -vvv
# Если проблема с known_hosts - добавить хост или отключить проверку
ssh-keyscan 192.168.1.10 >> ~/.ssh/known_hosts
# или в ansible.cfg: host_key_checking = False
«sudo: a password is required» при become
# Настроить sudo без пароля для пользователя ansible на серверах
# Добавить в /etc/sudoers на управляемом сервере:
echo "ansible ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/ansible
# Или передать пароль sudo при запуске
ansible-playbook playbook.yml --ask-become-pass
«The task includes an option with an undefined variable»
# Проверить определена ли переменная
ansible web -m debug -a "var=my_variable"
# Задать значение по умолчанию в шаблоне
"{{ my_variable | default('default_value') }}"
# Проверить inventory на наличие переменной
ansible-inventory --host web01
«MODULE FAILURE: MODULE_STDERR: Traceback (most recent call last)»
# Обычно проблема с версией Python на управляемом сервере
# Указать явно в inventory или playbook:
ansible_python_interpreter: /usr/bin/python3
# Или определить автоматически:
ansible_python_interpreter: auto_silent
Итог: Ansible в вашем арсенале
Мы прошли путь от установки до production-структуры. Теперь у вас есть всё, чтобы начать автоматизировать инфраструктуру по-взрослому:
- Ansible установлен и настроен для работы по SSH
- Inventory организован по группам и окружениям
- Playbook написан с использованием vars, handlers и тегов
- Роли структурированы и переиспользуются
- Секреты зашифрованы через Vault
- Docker и Windows под контролем
- Ошибки обрабатываются через block/rescue/fail
Если что-то пошло не так или хотите разобрать конкретный сценарий автоматизации — пишите в комментарии. Подпишитесь на Telegram-канал, чтобы не пропустить новые гайды из IT-аптеки.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



