December 19

Как я сделал свои 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 может использовать существующие.

В вашем ansible.cfg:

[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 работает только на пяти хостах одновременно.
Этого достаточно для небольших конфигураций, но крайне медленно для больших кластеров.

В ansible.cfg:

[defaults]
forks = 25

И для еще большего параллелизма:

- name: Deploy application
  hosts: webservers
  strategy: free
  • forks: Запускает несколько хостов параллельно
  • strategy: free: позволяет каждому хосту работать независимо, не дожидаясь других

✅ Рост производительности: в 2–5 раз быстрее для многохостовых сред.

2. Mitogen для Ansible — максимальное ускорение

Если вам нужен более высокий уровень производительности, установите Mitogen — ускоренный движок выполнения для Ansible.

Он заменяет коммуникационный уровень Ansible на более легкий и эффективный, что снижает нагрузку на ЦП и сеть.

Включить в ansible.cfg:

[defaults]
strategy_plugins = /path/to/ansible_mitogen/plugins/strategy
strategy = mitogen_linear

✅ Рост производительности: выполнение команд в 2–7 раз быстрее.
Это кардинально меняет ситуацию в больших средах или средах с высокой задержкой.

3. Кэшируйте динамический инвентарь

Если ваш инвентарь генерируется динамически(например, из AWS или GCP), включите кэширование, чтобы избежать повторяющихся вызовов API.

В ansible.cfg:

[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
  • Объединяйте похожие задачи
  • Делегируйте задачи разумно

Затем масштабируйте:

  • Увеличить параллелизм
  • Кэшируйте инвентарь
  • Используйте Mitogen для максимальной эффективности

Каждая сэкономленная секунда — это улучшение скорости доставки, улучшение обратной связи и повышение работоспособности вашей команды.

Автоматизация должна расширять возможности, а не мешать.
Теперь у вас есть план, как заставить Ansible по-настоящему летать.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.