当我们运行一个playbook,启用详细输出时,在ansible日志中我们可以看到如下内容:
2016-02-03 12:51:58,235 p=4105 u=root | PLAY RECAP
我认为p=4105
是剧本的pid。
有没有办法在播放期间将这个pid放在playbook中(例如作为变量)?
答案 0 :(得分:3)
这听起来有点像XY problem,但是一个选项可能是使用shell
命令生成一个shell,然后请求父PID:
- name: get pid of playbook
shell: |
echo "$PPID"
register: playbook_pid
这将为您提供正在执行剧本的python
进程的PID。
答案 1 :(得分:1)
您可以使用带有set_fact
过滤器的lookup
模块为localhost定义PID。
- hosts: localhost
tasks:
- set_fact:
pid: "{{ lookup('pipe', 'echo $PPID') }}"
稍后,您可以通过PID
词典引用hostvars
。
- hosts: remote
tasks:
- debug: var=hostvars.localhost.pid
答案 2 :(得分:1)
这可能是您要寻找的,但仅适用于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 }}"
答案 3 :(得分:0)
如果您将在不同的游戏中使用pid,只需将其添加到setup
模块。
setup_result['ansible_facts']['ansible_pid'] = os.getpid()
它将始终可用。
"ansible_os_family": "Debian",
"ansible_pid": 27930,
"ansible_pkg_mgr": "apt",
答案 4 :(得分:0)
您可以参考v2.8新增的pids
模块。会为您提供特定进程名称的所有pid。
在主机上获取Ansible Playbook的价格的简单示例:
- 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