当我们运行一个 playbook 并启用详细输出时,在 ansible 日志中我们可以看到如下内容:
2016-02-03 12:51:58,235 p=4105 u=root | PLAY RECAP
我猜
p=4105
是剧本运行时的pid。
有没有办法在运行时在剧本中获取这个pid(例如作为变量)?
您可以使用带有
set_fact
过滤器的 lookup
模块定义本地主机的 PID。
- hosts: localhost
tasks:
- set_fact:
pid: "{{ lookup('pipe', 'echo $PPID') }}"
稍后您可以通过
PID
字典引用 hostvars
。
- hosts: remote
tasks:
- debug: var=hostvars.localhost.pid
这听起来有点像 XY 问题,但一种选择可能是使用
shell
命令生成一个 shell,然后询问父 PID:
- name: get pid of playbook
shell: |
echo "$PPID"
register: playbook_pid
这将为您提供正在执行 playbook 的
python
进程的 PID。
这可能是您正在寻找的内容,但仅适用于 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 }}"
如果您将在不同的游戏中使用 pid,只需将其添加到
setup
模块即可。
setup_result['ansible_facts']['ansible_pid'] = os.getpid()
并且它将始终可用。
"ansible_os_family": "Debian",
"ansible_pid": 27930,
"ansible_pkg_mgr": "apt",
您可以参考v2.8新增的
pids
模块。它将特定进程名称的所有 pid 传递给您。
在主机上获取 Ansible Playbooks Pids 的简单示例:
- 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(',') }}"
缺点:您必须安装
psutil
请参阅https://docs.ansible.com/ansible/latest/modules/pids_module.html
获取父进程PID
pid: "{{ lookup('pipe', 'ps -o ppid= -p $PPID') }}"