Я хотел бы использовать Ansible для одновременного выполнения простого задания на нескольких удаленных узлах. Фактическая работа включает в себя поиск некоторых файлов журнала и последующую обработку результатов на моем локальном хосте (на котором есть программное обеспечение, недоступное на удаленных узлах).
Инструменты ansible из командной строки не кажутся подходящими для этого варианта использования, потому что они смешивают сгенерированное ansible форматирование с выводом удаленно выполняемой команды. API Python, похоже, должен быть способен на это, поскольку он предоставляет неизмененный вывод (кроме некоторого потенциального искажения юникода, которое здесь не должно иметь значения).
Упрощенная версия программы Python, которую я придумал, выглядит так:
from sys import argv
import ansible.runner
runner = ansible.runner.Runner(
pattern='*', forks=10,
module_name="command",
module_args=(
"""
sleep 10
"""),
inventory=ansible.inventory.Inventory(argv[1]),
)
results = runner.run()
Здесь sleep 10
заменяет фактическую команду сбора журнала — идея состоит в том, чтобы просто имитировать команду, которая не будет завершена немедленно.
Однако, запустив это, я заметил, что количество затраченного времени кажется пропорциональным количеству хостов в моем инвентаре. Вот результаты синхронизации по сравнению с инвентаризациями с 2, 5 и 9 хостами соответственно:
exarkun@top:/tmp$ time python howlong.py two-hosts.inventory
real 0m24.285s
user 0m0.216s
sys 0m0.120s
exarkun@top:/tmp$ time python howlong.py five-hosts.inventory
real 0m55.120s
user 0m0.224s
sys 0m0.160s
exarkun@top:/tmp$ time python howlong.py nine-hosts.inventory
real 1m57.272s
user 0m0.360s
sys 0m0.284s
exarkun@top:/tmp$
Некоторые другие случайные наблюдения:
ansible all --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
ведет себя так жеansible all -c local --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
, похоже, выполняет вещи одновременно (но, конечно, работает только для локальных соединений)ansible all -c paramiko --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
, кажется, выполняет вещи одновременно
Возможно, это говорит о том, что проблема связана с транспортом ssh и не имеет ничего общего с использованием ansible через Python API, а не из командной строки.
Что здесь не так, из-за чего транспорт по умолчанию не занимает всего около десяти секунд, независимо от количества хостов в моем инвентаре?