Автоматизация серверов с Ansible: Infrastructure as Code
Установка Ansible, файл инвентаря, написание playbook, структура ролей, переменные, зашифрованный vault, ad-hoc команды и автоматизация конфигурации серверов. Пошаговое руководство.
Время чтения: 20 мин DevOps и автоматизация
ansibleавтоматизацияinfrastructure as codedevopsplaybookyamllinux
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление
Автоматизация серверов с Ansible: Infrastructure as Code
Ansible — инструмент с открытым исходным кодом, позволяющий управлять конфигурацией серверов, развёртыванием приложений и автоматизацией задач как кодом. Благодаря безагентной архитектуре он подключается к целевым серверам только по SSH.
Что такое Ansible?
Ключевые особенности Ansible:
Безагентный: Не требует установки дополнительного ПО на целевых серверах
Идемпотентный: Многократный запуск одного playbook даёт одинаковый результат
На основе YAML: Легко читать и писать
Большая библиотека модулей: 3000+ готовых модулей
Ansible подключается с управляющего узла к целевым серверам по SSH. Для Windows-серверов используется WinRM.
Выполняйте команды без написания playbook для быстрых задач:
hljs bash
# Тест ping
ansible all -m ping
ansible webservers -m ping -i inventory.yml
# Выполнить команду
ansible all -m command -a "uptime"
ansible webservers -m shell -a "df -h"# Скопировать файл
ansible webservers -m copy -a "src=/local/file dest=/remote/path"# Установить пакет
ansible webservers -m apt -a "name=nginx state=present" --become
# Управление сервисом
ansible webservers -m service -a "name=nginx state=started enabled=yes" --become
# Создать/удалить файл
ansible all -m file -a "path=/tmp/test state=touch"
ansible all -m file -a "path=/tmp/test state=absent"# Собрать факты
ansible web1.example.com -m setup
ansible all -m setup -a "filter=ansible_os_family"
Написание Playbook
Базовая структура Playbook
hljs yaml
# site.yml----name:Настройкавеб-серверовhosts:webserversbecome:yes# использовать sudovars:http_port:80max_clients:200tasks:-name:УстановитьNginxapt:name:nginxstate:presentupdate_cache:yes-name:СкопироватьконфигурациюNginxtemplate:src:templates/nginx.conf.j2dest:/etc/nginx/nginx.confowner:rootgroup:rootmode:'0644'notify:ПерезапуститьNginx-name:ЗапуститьсервисNginxservice:name:nginxstate:startedenabled:yeshandlers:-name:ПерезапуститьNginxservice:name:nginxstate:restarted
Tasks, Handlers и Roles
hljs yaml
# Условные задачи-name:УстановитьпакетнаUbuntuapt:name:"{{ item }}"state:presentloop:-nginx-curl-gitwhen:ansible_os_family=="Debian"-name:УстановитьпакетнаRHELdnf:name:"{{ item }}"state:presentloop:-nginx-curl-gitwhen:ansible_os_family=="RedHat"# Создание пользователей в цикле-name:Создатьпользователейuser:name:"{{ item.name }}"groups:"{{ item.groups }}"state:presentloop:- { name:'alice', groups:'sudo' }
- { name:'bob', groups:'www-data' }
# Регистрация и условие-name:ПроверитьверсиюNginxcommand:nginx-vregister:nginx_versionignore_errors:yes-name:УстановитьNginxеслинеустановленapt:name:nginxstate:presentwhen:nginx_version.rc!=0
# Создать роль
ansible-galaxy init roles/nginx
# Структура директорий роли
roles/nginx/
├── defaults/
│ └── main.yml # Переменные по умолчанию
├── files/
│ └── nginx.conf # Статические файлы
├── handlers/
│ └── main.yml # Обработчики
├── meta/
│ └── main.yml # Метаданные роли
├── tasks/
│ └── main.yml # Основные задачи
├── templates/
│ └── vhost.conf.j2 # Шаблоны Jinja2
└── vars/
└── main.yml # Переменные
Примеры Playbook
Playbook установки Nginx
hljs yaml
----name:Установкавеб-сервераNginxhosts:webserversbecome:yesvars:domain:example.comweb_root:/var/www/{{domain}}tasks:-name:УстановитьNginxapt:name:nginxstate:presentupdate_cache:yes-name:Создатьвеб-директориюfile:path:"{{ web_root }}"state:directoryowner:www-datagroup:www-datamode:'0755'-name:Создатьпримерindex.htmlcopy:content:"<h1>Привет от {{ inventory_hostname }}</h1>"dest:"{{ web_root }}/index.html"owner:www-data-name:Настроитьвиртуальныйхостtemplate:src:vhost.conf.j2dest:/etc/nginx/sites-available/{{domain}}notify:ПерезагрузитьNginx-name:Включитьвиртуальныйхостfile:src:/etc/nginx/sites-available/{{domain}}dest:/etc/nginx/sites-enabled/{{domain}}state:linknotify:ПерезагрузитьNginx-name:Отключитьсайтпоумолчаниюfile:path:/etc/nginx/sites-enabled/defaultstate:absentnotify:ПерезагрузитьNginx-name:РазрешитьNginxвUFWufw:rule:allowname:'Nginx Full'handlers:-name:ПерезагрузитьNginxservice:name:nginxstate:reloaded
Запуск Playbook
hljs bash
# Базовый запуск
ansible-playbook site.yml
# С конкретным инвентарём
ansible-playbook -i inventory.yml site.yml
# Конкретный хост или группа
ansible-playbook site.yml --limit webservers
ansible-playbook site.yml --limit web1.example.com
# Dry-run (проверка без изменений)
ansible-playbook site.yml --check
# Подробный режим
ansible-playbook site.yml -v
ansible-playbook site.yml -vvv
# Запустить конкретные теги
ansible-playbook site.yml --tags "nginx,ssl"
ansible-playbook site.yml --skip-tags "debug"# Дополнительные переменные
ansible-playbook site.yml -e "env=production version=1.5"
Заключение
Ansible — один из наиболее доступных способов управления автоматизацией серверов как кодом. Благодаря безагентной архитектуре, большой библиотеке модулей и структуре на основе YAML вы можете легко управлять как небольшой, так и крупной инфраструктурой. Храните конфиденциальные данные в безопасности с Vault, создавая повторно используемые конфигурации с ролями.
Часто задаваемые вопросы
В чём разница между Ansible и Puppet/Chef?
Ansible работает без агентов (требуется только SSH), тогда как Puppet и Chef требуют установки агента на целевых серверах. Ansible основан на YAML и проще в изучении. Puppet и Chef предлагают более мощное управление состоянием, но сложнее в настройке и изучении. Ansible обычно предпочтителен для небольшой и средней инфраструктуры.
Что такое идемпотентность и почему она важна?
Идемпотентность означает, что многократное выполнение одной операции всегда даёт одинаковый результат. Модули Ansible спроектированы идемпотентными: если nginx уже установлен, он не будет переустановлен; если файл уже правильный, он не будет изменён. Это позволяет безопасно повторно запускать playbook.
Что произойдёт, если пароль Ansible Vault будет забыт?
Если пароль vault забыт, зашифрованные файлы не могут быть восстановлены. Поэтому критически важно хранить пароль vault в надёжном менеджере паролей (1Password, Bitwarden и т.д.). В производственных средах рекомендуется записать пароль vault в файл (--vault-password-file) и хранить его в безопасном месте.
Что такое Ansible Galaxy?
Ansible Galaxy — официальная платформа, где публикуются роли и коллекции, созданные сообществом (galaxy.ansible.com). Готовые роли можно загрузить командами вроде 'ansible-galaxy install geerlingguy.nginx'. Это позволяет использовать проверенные роли вместо написания с нуля.
Как улучшить производительность Ansible в крупной инфраструктуре?
Увеличьте значение 'forks' в ansible.cfg (по умолчанию 5, рекомендуется 20-50). Уменьшите количество SSH-соединений с 'pipelining = True'. Включите параллельное выполнение независимых хостов с 'strategy: free'. Контролируйте размер пакета с 'serial' в больших инвентарях.
Могу ли я управлять Windows-серверами с помощью Ansible?
Да, Ansible может управлять Windows-серверами через протокол WinRM (Windows Remote Management). Требуются настройки 'ansible_connection: winrm' и 'ansible_winrm_transport: ntlm'. Модули Windows начинаются с префикса 'win_': win_package, win_service, win_file и т.д.
Определение и управление многоконтейнерными приложениями с Docker Compose: зависимости сервисов, переменные окружения, проверки работоспособности, масштабирование и развёртывание в production. Полное руководство.
Создание CI/CD-пайплайнов с GitHub Actions: сборка и публикация Docker, развёртывание на сервере по SSH, автоматизация тестов, управление секретами и оптимизация рабочих процессов.