Go to file
2023-07-26 11:08:21 +02:00
.gitignore Bump version. 2021-01-19 16:25:55 +01:00
ansible_parallel.py Show failed tasks in the final report. 2023-07-26 11:08:21 +02:00
LICENSE Initial commit 2020-10-22 15:21:45 +02:00
pyproject.toml Show failed tasks in the final report. 2023-07-26 11:08:21 +02:00
README.md Enhance visual output: show on which task each playbook is working. 2021-01-22 17:01:59 +01:00

ansible-parallel

TL;DR:

pip install ansible-parallel
ansible-parallel *.yml

Executes multiple ansible playbooks in parallel.

For my usage, running sequentially (using a site.yml containing multiple import_playbook) takes 30mn, running in parallel takes 10mn.

Usage

ansible-parallel runs like ansible-playbook but accepts multiple playbooks. All remaining options are passed to ansible-playbook so feel free to run ansible-parallel --check *.yml for example.

Example

It's easy to start:

$ ansible-parallel *.yml

When it runs, it display a live update of what's going on, one line per playbook:

web.yml:     TASK [common : Configure Debian repositories] *****************************
gitlab.yml:  TASK [common : Configure IP failover] *************************************
staging.yml: TASK [common : Configure Debian repositories] *****************************
dev.yml:     Done.

And when it's done, it prints a full report like:

# Playbook playbook-webs.yml, ran in 123s

web1.meltygroup.com         : ok=51   changed=0    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0
web2.meltygroup.com         : ok=51   changed=0    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0
web3.meltygroup.com         : ok=51   changed=0    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0


# Playbook playbook-staging.yml, ran in 138s

staging1.meltygroup.com         : ok=64   changed=6    unreachable=0    failed=0    skipped=18   rescued=0    ignored=0


# Playbook playbook-gitlab.yml, ran in 179s

gitlab-runner1.meltygroup.com         : ok=47   changed=0    unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
gitlab-runner2.meltygroup.com         : ok=47   changed=0    unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
gitlab-runner3.meltygroup.com         : ok=47   changed=0    unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
gitlab.meltygroup.com                 : ok=51   changed=0    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0


# Playbook playbook-devs.yml, ran in 213s

dev1.meltygroup.com             : ok=121  changed=0    unreachable=0    failed=0    skipped=22   rescued=0    ignored=0
dev2.meltygroup.com             : ok=121  changed=0    unreachable=0    failed=0    skipped=22   rescued=0    ignored=0

Known alternatives

ansible-pull

ansible-parallel is only good if you want to keep the push behavior of Ansible, but if you're here you may have a lot of playbooks, and switching to ansible-pull with a proper reporting system like ARA

xargs

A quick and dirty way of doing it in 3 lines of bash:

ls -1 *.yml | xargs -n1 -P16 sh -c 'ansible-playbook "$$0" > "$$0.log"' ||:
grep -B1 "^\(changed\|fatal\|failed\):" *.log
echo *.yml.log | xargs -n1 sed -n -e '/^PLAY RECAP/,$$p'