Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible - Prevent playbook executing simultaneously

Tags:

ansible

I have a playbook that controls a clustered application. The issue is this playbook can be called/executed a few different ways (manual on the cmd line[multiple SREs working], scheduled task, or programmatically via a 3rd party system). The problem is if the playbook tries to execute simultaneously, it could cause some issues to the application (nature of the application).

Question:

Is there a way to prevent the same playbook from running concurrently on the same Ansible server?

Environment:

ansible [core 2.11.6]
  config file = /app/ansible/ansible_linux_playbooks/playbooks/scoutam_client_configs_playbook/ansible.cfg
  configured module search path = ['/etc/ansible/library/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /app/ansible/ansible_linux_playbooks/playbooks/scoutam_client_configs_playbook/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.7 (default, Nov  1 2021, 11:34:21) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
  jinja version = 3.0.2
  libyaml = True
like image 458
bwinchell Avatar asked Mar 13 '26 18:03

bwinchell


1 Answers

You can create a lockfile on the controller with the PID of the ansible-playbook process.

    - delegate_to: localhost
      vars:
        lockfile: /tmp/thisisalockfile
        my_pid: "{{ lookup('pipe', 'cut -d\" \" -f4 /proc/$PPID/stat') }}"
        lock_pid: "{{ lookup('file', lockfile) }}"
      block:
        - name: Lock file
          copy:
            dest: "{{ lockfile }}"
            content: "{{ my_pid }}"
          when: my_lockfile is not exists
            or ('/proc/' ~ lock_pid) is not exists
            or 'ansible-playbook' not in lookup('file', '/proc/' ~ lock_pid ~ '/cmdline')

        - name: Make sure we won the lock
          assert:
            that: lock_pid == my_pid
            fail_msg: "{{ lockfile }} is locked by process {{ lock_pid }}"

Finding the current PID is the trickiest part; $PPID in the lookup is still the PID of a child, so we're grabbing the grandparent out of /proc/

like image 142
flowerysong Avatar answered Mar 16 '26 04:03

flowerysong



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!