When we run a playbook, with verbose output enabled, in the ansible logs we can see something like this:
2016-02-03 12:51:58,235 p=4105 u=root | PLAY RECAP
This might be what you are looking for, but is only applicable to Linux:
- name: Get the pid of this playbook
shell: pstree -spal $PPID | grep ansible-playbook | awk '{print $1;exit}' | awk -F, '{print $2}'
register: ansible_pid
- name: Set the ansible playbook pid variable
set_fact:
ansible_playbook_pid: "{{ ansible_pid.stdout|int }}"
This sounds a little like an XY problem, but one option may be to spawn a shell with the shell
command and then ask for the parent PID:
- name: get pid of playbook
shell: |
echo "$PPID"
register: playbook_pid
This will give you the PID of the python
process that is executing the playbook.
If you will be using the pid in different plays, just add it to the setup
module.
setup_result['ansible_facts']['ansible_pid'] = os.getpid()
and it will always be available.
"ansible_os_family": "Debian",
"ansible_pid": 27930,
"ansible_pkg_mgr": "apt",
You can refer to the pids
module new with v2.8. which delivers all pids for a specific process name to you.
Simple example to get Pids of Ansible Playbooks on host machines:
- hosts: localhost
tasks:
- name: "get pids! and no, 'ansible-playboo' is no typo"
pids:
name: ansible-playboo
register: pids_of_python
- name: "Print pids"
debug:
msg: "PIDs: {{ pids_of_python.pids|join(',') }}"
Downside: you'll have to install psutil
Please refer to https://docs.ansible.com/ansible/latest/modules/pids_module.html
You can define the PID for localhost using the set_fact
module with a lookup
filter.
- hosts: localhost
tasks:
- set_fact:
pid: "{{ lookup('pipe', 'echo $PPID') }}"
And later on you can reference the PID
via the hostvars
dictionary.
- hosts: remote
tasks:
- debug: var=hostvars.localhost.pid