Какова разумная производительность для простого плейбука Ansible против ~ 100 хостов?

11

Мы начинаем смотреть на Ansible, чтобы заменить старую установку cfengine2. У меня есть простая пьеса, которая:

  • копирует файл sudoers
  • копирует шаблонный resolv.conf (снабженный данными group_vars и host_vars)
  • проверяет пару сервисов работает
  • проверяет наличие локального пользователя

Воспроизведение книги занимает более 4 минут времени настенного часового периода для работы с 97 компьютерами (все подключены через быструю 1-гигабитную или 10-гигабитную сеть, с задержкой локальной сети менее 1 мс) и потребляет более 50% ЦП на двухъядерной виртуальной памяти 4G с памятью, когда я запустить его.

Для запуска на одной машине требуется около 11 секунд, при этом около 4 секунд затрачивается пользовательского и системного процессорного времени, что TBH все равно кажется чрезмерным для объема выполняемой работы.

Очевидные биты:

  • У меня явно включен конвейер в playbook-dir local ansible.cfg
  • У меня есть факт кэширования в jsonfile, тот же локальный ansible.cfg
  • У меня есть вилки 50, то же самое (я пробовал другие значения)
  • Я уверен, что Ansible использует SSH, а не Paramiko, и использует постоянный сокет управления - я вижу, как SSH-процессы запускаются и сохраняются во время выполнения.

Этот уровень производительности нормальный или что-то не так с моими настройками? Как я могу определить, что, если так?

Изменить: По состоянию на август 2017 года, мы все еще видим эту проблему. Ansible версия 2.2.1 и размер playbook выросли. Современные номера:

  • 98 хозяев
  • ansible -m ping all принимает 4,6 с, 3,2 с, 2,5 сс
  • полный запуск playbook занимает 4 минуты, используя при этом 100% пользовательский и ~ 35% системный ЦП (на сервере развертывания 2-ядерных виртуальных машин, 100% - один полный ЦП)
  • Целевая ОС в основном CentOS 7, некоторые CentOS 6
  • профилирование не выявляет какие-либо конкретные задачи горячей точки AFAICT

Хотя playbook теперь намного больше, я все еще не думаю, что есть что-то, что могло бы оправдать такой уровень загрузки процессора на сервере playbook - возможно, время настенного таймера, но сервер развертывания должен быть в основном бездействующим для большей части запуска, насколько я вижу, это в основном копии файлов и некоторые расширения шаблонов.

Обратите внимание, что мы довольно широко используем host / groupvars

Несколько человек спрашивали о профилировании, хвосте пробега с профилированием:

Tuesday 01 August 2017  16:02:24 +0100 (0:00:00.539)       0:06:22.991 ******** 
=============================================================================== 
yumrepo : centos repos -------------------------------------------------- 9.77s
sshd : copy CentOS 6 sshd config ---------------------------------------- 7.41s
sshd : copy CentOS 7 sshd config ---------------------------------------- 6.94s
core : ensure core packages are present --------------------------------- 6.28s
core : remove packages on VM guests ------------------------------------- 5.39s
resolv : stop NetworkManager changing resolv.conf ----------------------- 5.25s
yumrepo : epel6 gpg key ------------------------------------------------- 3.94s
yumrepo : epel7 gpg key ------------------------------------------------- 3.71s
yumrepo : nsg gpg key --------------------------------------------------- 3.57s
resolv : build resolv.conf ---------------------------------------------- 3.30s
yumrepo : nsg repo ------------------------------------------------------ 2.66s
resolv : check NetworkManager running ----------------------------------- 2.63s
yumrepo : psp repo ------------------------------------------------------ 2.62s
yumrepo : ucs repo ------------------------------------------------------ 2.44s
yumrepo : epel repo ----------------------------------------------------- 2.27s
resolv : check for nmcli ------------------------------------------------ 2.08s
core : remove various unwanted files ------------------------------------ 1.42s
telegraf : write telegraf.conf file ------------------------------------- 1.13s
core : copy sudoers in place -------------------------------------------- 0.94s
core : ensure sshd is running ------------------------------------------- 0.90s
user53814
источник
4
Сделайте профилирование с помощью ANSIBLE_CALLBACK_WHITELIST=profile_tasksи для более тщательной отладки ANSIBLE_DEBUG=1. Также обратите пристальное внимание на начальную скорость ssh-соединения.
Константин Суворов
Согласитесь с комментарием @KonstantinSuvorov - в лоте может быть один хост, занимающий значительное время для выполнения определенной задачи. Как только вы изолируете задачу с помощью profile_tasks, вы можете проверить, выполняются ли эти задачи на ваших хостах, и посмотреть, какая из них самая длинная. Вы также можете запустить тривиальную задачу, например «command: w», для всех хостов, чтобы увидеть, что она занимает ожидаемое время.
andyhky
1
Проверьте энтропийное голодание. watch cat /proc/sys/kernel/random/entropy_availпока плейбук работает. Если его меньше, чем, скажем, 1000, у вас есть потенциальная проблема; если его меньше, чем, скажем, 64, и он не восстанавливается, то у вас есть определенная проблема энтропийного голодания. (распространено в некоторых средах виртуальных машин). Это относится к вашему серверу управления, а также к узлам, которыми вы управляете.
Кэмерон Керр
На моей управляющей виртуальной машине с 4 ГБ ОЗУ у меня есть вилки = 20 и конвейерная обработка = True. ansible -i all all -m pingпротив более чем 300 хостов (в основном виртуальных машин) это заняло менее 1 минуты. Ваша игровая книга делает что-нибудь, чтобы изменить пользователя (стать / sudo / и т. Д.). Как работает -m ping? Я бы, исходя из опыта, сказал, что вы хотите иметь больше памяти на 50 вилок.
Кэмерон Керр
какая у вас целевая операционная система?
xddsg

Ответы:

1

в вашем ansible.cfgнаборе следующее:

[defaults]

# profile each task
callback_whitelist = profile_tasks

# [don't validate host keys](http://docs.ansible.com/ansible/intro_configuration.html#host-key-checking)
host_key_checking = False

[ssh_connection]
pipelining = True

Кроме того, в вашей игровой книге, установите стратегию как «бесплатно»

- hosts: all
  strategy: free
  tasks: [...]

Наконец, отключите сбор фактов в вашей игре: gather_facts: false

Если после профилирования вы видите многое из этого:

TASK [pip foo]
ok: [10.192.197.252] => (item=ansible)
ok: [10.192.197.252] => (item=boto)
ok: [10.192.197.252] => (item=boto3)
ok: [10.192.197.252] => (item=passlib)
ok: [10.192.197.252] => (item=cryptography)

раздавить эти действия в ansible.cfg[по умолчанию]:

например squash_actions = yum,pip,bar

xddsg
источник
Спасибо за ответ. Мы уже используем стратегию: бесплатно и сбор фактов, боюсь, это то, что требуется в книгах, так что это на самом деле не работает. Как отмечено в моем ответе, я уже занимаюсь конвейерной обработкой.
user53814
@ user53814 с включенным профилированием, что занимает больше всего времени? Вы можете обновить свой вопрос версией ansible, которую вы используете?
xddsg