问题
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
I guess that the p=4105
is the pid of the playbook when it ran.
Is there a way to get this pid inside the playbook during its runtime (as a variable for example)?
回答1:
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.
回答2:
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
回答3:
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",
回答4:
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
来源:https://stackoverflow.com/questions/35176944/get-the-pid-of-a-running-playbook-for-use-within-the-playbook