Как я сделал свои Ansible-плейбуки в 5 раз быстрее (без магии, только умная оптимизация)
Это перевод оригинальной статьи How I Made My Ansible Playbooks 5× Faster (No Magic, Just Smart Tuning).
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
Проверенные методы для сокращения времени выполнения — от быстрых решений до продвинутых стратегий для сложной инфраструктуры.
Вы не одиноки, если ваши плейбуки Ansible работают медленнее, чем загрузка Windows 95. Мы все через это проходили — смотрели в терминал, наблюдали, как медленно ползут задачи, и задавались вопросом, действительно ли автоматизация экономит время.
Управляя инфраструктурой сотен серверов и оптимизируя бесчисленное множество медленных плейбуков, я обнаружил, что большинство проблем с производительностью возникает из-за всего лишь нескольких распространенных узких мест — и большинство из них легко устранить.
Из этой статьи вы узнаете о практических, проверенных методах сокращения времени выполнения плейбуков с часов до минут, а иногда и с минут до секунд — без необходимости переписывать стек автоматизации.
Проблема производительности: почему мои плейбуки такие медленные?
Большинство плейбуков Ansible написаны в первую очередь с приоритетом на функциональность, а уже потом на производительность.
Такой подход «просто сделай так, чтобы работало» часто приводит к неэффективности, которая со временем нарастает как снежный ком.
Вот наиболее распространенные причины:
- Последовательное выполнение — задачи, выполняемые одна за другой, хотя многие задачи могли бы выполняться параллельно
- Сбор ненужных фактов — сбор огромного объёма системных данных при каждом запуске
- Неэффективные SSH-соединения — открытие нового сеанса SSH для каждой задачи
- Плохая организация задач — избыточные циклы и неправильно используемые модули
- Неоптимальное управление инвентаризацией — замедление выбора хостов в динамических средах
Плейбук на 10 минут, который мог бы выполняться за 2 минуты, может показаться незначительным — но в масштабах команд и развертываний эта неэффективность складывается в сотни потерянных инженерных часов в год.
Быстрые результаты: мгновенное повышение производительности
Это самые простые решения — изменения, которые можно внести за считанные минуты и которые часто сокращают время выполнения вдвое.
1. Отключите сбор фактов, когда он вам не нужен.
По умолчанию Ansible собирает большой набор «фактов» (версию ОС, объём памяти, интерфейсы и т. д.) перед запуском задач. Если ваш плейбук просто устанавливает пакет или редактирует файл, это пустая трата времени.
- name: Install packages
hosts: webservers
tasks:
- name: Install nginx
package:
name: nginx
state: present- name: Install packages
hosts: webservers
gather_facts: false
tasks:
- name: Install nginx
package:
name: nginx
state: present✅ Рост производительности: на 30–60 % быстрее для простых плейбуков.
2. Включите SSH Pipelining и Multiplexing
Это самый эффективный способ ускорения.
Вместо того, чтобы создавать новое SSH-соединение для каждой задачи, Ansible может использовать существующие.
[defaults] host_key_checking = False [ssh_connection] ssh_args = -o ControlMaster=auto -o ControlPersist=60s pipelining = True
ControlMaster=auto: Позволяет повторно использовать SSH-соединениеControlPersist=60s: Поддерживает соединение в течение 60 секунд.pipelining=True: сокращает количество SSH-обменов с пяти до двух на задачу
✅ Рост производительности: на 40–70% быстрее на плейбуках с множеством задач.
Написание более умных задач: оптимизация на уровне задач
После того, как основы будут отлажены, сосредоточьтесь на формулировке задач. Небольшие структурные изменения могут привести к значительным результатам.
1. Группируйте операции
Многократный вызов модулей в циклах увеличивает накладные расходы.
По возможности объединяйте операции в один вызов.
- name: Install packages one by one
package:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- curl
- vim- name: Install all packages at once
package:
name:
- nginx
- git
- curl
- vim
state: present✅ Повышение производительности: до 80% быстрее при установке нескольких пакетов.
2. Собирайте только те факты, которые вам нужны
Иногда нужны факты, но не все.
Выборочный сбор предоставляет только необходимые данные.
- name: Selective fact gathering
hosts: webservers
gather_facts: false
tasks:
- name: Gather minimal required facts
setup:
filter:
- 'ansible_distribution'
- 'ansible_os_family'Это даёт только необходимое, сокращая накладные расходы.
3. Делегируйте задачи разумно
Некоторые задачи достаточно выполнить всего один раз.
Не заставляйте каждый сервер выполнять одинаковую дорогостоящую работу.
- name: Download file on all servers
get_url:
url: https://releases.example.com/app.tar.gz
dest: /tmp/app.tar.gz- name: Download once on control node
get_url:
url: https://releases.example.com/app.tar.gz
dest: /tmp/app.tar.gz
delegate_to: localhost
run_once: true
- name: Distribute file to all servers
copy:
src: /tmp/app.tar.gz
dest: /tmp/app.tar.gz✅ Повышение производительности: значительное снижение нагрузки на сеть и общего времени выполнения.
Продвинутые методы для достижения максимальной скорости
Как только ваши основные показатели станут прочными, настанет время выйти за рамки дефолтных значений.
1. Увеличьте параллелизм с помощью forks и strategy
По умолчанию Ansible работает только на пяти хостах одновременно.
Этого достаточно для небольших конфигураций, но крайне медленно для больших кластеров.
[defaults] forks = 25
И для еще большего параллелизма:
- name: Deploy application hosts: webservers strategy: free
forks: Запускает несколько хостов параллельноstrategy: free: позволяет каждому хосту работать независимо, не дожидаясь других
✅ Рост производительности: в 2–5 раз быстрее для многохостовых сред.
2. Mitogen для Ansible — максимальное ускорение
Если вам нужен более высокий уровень производительности, установите Mitogen — ускоренный движок выполнения для Ansible.
Он заменяет коммуникационный уровень Ansible на более легкий и эффективный, что снижает нагрузку на ЦП и сеть.
[defaults] strategy_plugins = /path/to/ansible_mitogen/plugins/strategy strategy = mitogen_linear
✅ Рост производительности: выполнение команд в 2–7 раз быстрее.
Это кардинально меняет ситуацию в больших средах или средах с высокой задержкой.
3. Кэшируйте динамический инвентарь
Если ваш инвентарь генерируется динамически(например, из AWS или GCP), включите кэширование, чтобы избежать повторяющихся вызовов API.
[inventory] cache = True cache_plugin = memory cache_timeout = 3600 # Cache for 1 hour
✅ Повышение производительности: поиск по инвентарю ускоряется до 90%.
Мера для улучшения: профилирование ваших стратегий
Вы не можете оптимизировать то, чего не видите.
Ansible имеет встроенные профайлеры, которые показывают, какие задачи занимают больше всего времени.
[defaults] callback_whitelist = timer, profile_tasks, profile_roles
После каждого запуска вы получите подробную статистику, которая поможет вам выявить медленные модули, хосты или роли.
Путь к более быстрой инфраструктуре
Переход от медленных к молниеносным стратегиям подразумевает постепенное устранение препятствий.
- Отключите ненужный сбор фактов
- Включите SSH pipelining
- Объединяйте похожие задачи
- Делегируйте задачи разумно
Каждая сэкономленная секунда — это улучшение скорости доставки, улучшение обратной связи и повышение работоспособности вашей команды.
Автоматизация должна расширять возможности, а не мешать.
Теперь у вас есть план, как заставить Ansible по-настоящему летать.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.