If you haven’t already discovered Mitogen yet, read on for how to use it (and a few other tricks) to make you Ansible plays a much better experience.
In short, Mitogen is a Python library that (among other things) provides an alternative way to connect to distributed machines using tools like Ansible, Salt and Fabric. And it is fast. Like really fast. Here is a note taken from the Mitogen documentation.
Expect a 1.25x – 7x speedup and a CPU usage reduction of at least 2x, depending on network conditions, modules executed, and time already spent by targets on useful work. Mitogen cannot improve a module once it is executing, it can only ensure the module executes as quickly as possible.
As the documentation says, Mitogen isn’t intended to be used directly but has entrypoints for connecting various tools with its API.
Here is what the sample output might look like with the SSH pipelining and other tweaks configured, not including Mitogen. It clocks in around 120 seconds.
And here is the same run again with Mitogen. The same playbook run is down to around 90 seconds, about a 25% improvement as shown below. The output and few of the other settings are described in more detail below.
To set up Mitogen as an Ansible replacement for connecting to hosts, first install it. Note the version. In my own testing, versions earlier than 0.2.5 had some issues.
cd </path/to/install> curl -OL https://files.pythonhosted.org/packages/source/m/mitogen/mitogen-0.2.5.tar.gz tar xvzf mitogen-0.2.5.tar.gz
Then modify the anisble.cfg file to point at Mitogen.
[defaults] strategy_plugins = </path/to/install>/mitogen-0.2.4/ansible_mitogen/plugins/strategy strategy = mitogen_linear
An option was addin in Mitogen v0.2.4 to disable SSH compression, which can reduce run times in faster networks. The documentation says this option will be default in the future but for now you can turn it on with the following command configuration.
mitogen_ssh_compression = False
NOTE: If you are having trouble with Mitogen and need to turn it off you should also be aware of SSH pipelining. This method of execution isn’t as fast as Mitogen but should at least help bring playbook times down. You can turn it on with the following configuration.
[ssh_connection] pipelining = True
There are a few other bells and whistles that you can adjust in the anisble.cfg file to help with performance and gain visibility into what is happening.
There is a setting for callback configurations that can be added to ansible.cfg that makes it much easier to see how long things take.
... # Record some metrics about the Ansible runs callback_whitelist = timer, profile_tasks # Better output formatting stdout_callback = yaml # Minimal output formatting #stdout_callback = minimal callback_plugins = callback_plugins ...
Other settings that can be tuned include some of the defaults like poll_interval, caching and the number of forks to run. I found this blog post to be very helpful in discovering and describing a number of these Ansible tweaks.
Below is a modified ansible.cfg with these settings tuned.
# How often Ansible checks running tasks. The default is set to 15 poll_interval = 5 # Number of processes to fork. Default is set to 5. forks = 100 #caching fact_caching = jsonfile fact_caching_connection = .cache/
With these tweaks your Ansible playbooks should run much faster and more cleanly. I highly recommend giving Mitogen a try as well, I have not run into any issues with Mitogen 0.2.3 and it isn’t much effort to add for the amount of gains you get by switching to it. If you know of any other tweaks or settings feel free to let me know!