Serialize a single task with Ansible
When using a delegate_to: task in Ansible, commands or modules risk causing errors if they cannot be used concurrently on a single physical machine. The first solution that comes to mind is to set serial: 1 on that task. Sadly, serial: is only applicable on entire plays and not on single tasks.
This problem is discussed in the following threads (and many others):
- Possible to set Serial per task ( needed when using delegate_to ) ?
- Ansible: How to run one Task Host by Host?
In particular, my freeipa-client role failed when running command: ipa host-show, ipa host-add and ipa-getkeytab tasks delegated to my FreeIPA server. Only one or two hosts passed such tasks, and the rest failed with “ipa: ERROR: cannot connect to ‘https://freeipa.*********/ipa/json’: INTERNAL SERVER ERROR”.
Here’s a cool solution using the flock(1) command that works if you are using the command module:
- name: do something that requires serialization
command: <span class="fg_yellow">flock /etc/ansible-lock</span> <put your command here>
delegate_to: <your host>
There you go! Now even though there will be simultaneous active Python processes on the delegate_to: host, only one at a time will be able to execute the command, while others wait for an exclusive lock on /etc/ansible-lock.
See also: man 1 flock.
I hope it helps!