获取正在运行的 playbook 的 pid 以在 playbook 中使用

问题描述 投票:0回答:6

当我们运行一个 playbook 并启用详细输出时,在 ansible 日志中我们可以看到如下内容:

2016-02-03 12:51:58,235 p=4105 u=root |  PLAY RECAP

我猜

p=4105
是剧本运行时的pid。

有没有办法在运行时在剧本中获取这个pid(例如作为变量)?

linux ansible pid
6个回答
4
投票

您可以使用带有

set_fact
过滤器的
lookup
模块定义本地主机的 PID。

- hosts: localhost
  tasks:
    - set_fact:
        pid: "{{ lookup('pipe', 'echo $PPID') }}"

稍后您可以通过

PID
字典引用
hostvars

- hosts: remote
  tasks:
    - debug: var=hostvars.localhost.pid

3
投票

这听起来有点像 XY 问题,但一种选择可能是使用

shell
命令生成一个 shell,然后询问父 PID:

- name: get pid of playbook
  shell: |
    echo "$PPID"
  register: playbook_pid

这将为您提供正在执行 playbook 的

python
进程的 PID。


2
投票

这可能是您正在寻找的内容,但仅适用于 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 }}"

0
投票

如果您将在不同的游戏中使用 pid,只需将其添加到

setup
模块即可。

setup_result['ansible_facts']['ansible_pid'] = os.getpid()

并且它将始终可用。

    "ansible_os_family": "Debian",
    "ansible_pid": 27930,
    "ansible_pkg_mgr": "apt",

0
投票

您可以参考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


0
投票

获取父进程PID

  pid: "{{ lookup('pipe', 'ps -o ppid= -p $PPID') }}"
© www.soinside.com 2019 - 2024. All rights reserved.