Linux 获取运行剧本的pid,以便在剧本中使用

Linux 获取运行剧本的pid,以便在剧本中使用,linux,ansible,ansible-playbook,pid,Linux,Ansible,Ansible Playbook,Pid,当我们在启用详细输出的情况下运行playbook时,在ansible日志中可以看到如下内容: 2016-02-03 12:51:58235 p=4105u=root |播放回放 我猜p=4105是playbook运行时的pid 有没有办法在playbook运行期间(例如作为变量)在playbook中获取此pid?这听起来有点像,但一个选项可能是使用shell命令生成一个shell,然后请求父pid: - name: get pid of playbook shell: | echo

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

2016-02-03 12:51:58235 p=4105u=root |播放回放

我猜
p=4105
是playbook运行时的pid


有没有办法在playbook运行期间(例如作为变量)在playbook中获取此pid?

这听起来有点像,但一个选项可能是使用
shell
命令生成一个shell,然后请求父pid:

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

这将为您提供执行playbook的
python
进程的PID。

如果您将在不同的重头戏中使用PID,只需将其添加到
设置
模块

setup_result['ansible_facts']['ansible_pid'] = os.getpid()
它将永远可用

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

您可以使用带有
查找
过滤器的
set\u fact
模块为本地主机定义PID

- hosts: localhost
  tasks:
    - set_fact:
        pid: "{{ lookup('pipe', 'echo $PPID') }}"
稍后,您可以通过
hostvars
字典引用
PID

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

您可以参考v2.8新增的
pids
模块。它为您提供特定进程名称的所有PID

在主机上获取Ansible剧本PID的简单示例:

- 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


请参阅

这可能是您正在寻找的,但仅适用于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做什么?我认为@larsks有一个很好的答案,如果你真的需要的话it@DaveSnigier我努力实现的目标与我的目标相关。我试图从ansible日志中提取与特定剧本相关的条目,以便创建一个单独的日志(我想这是一种方法)。如果有人找到了答案,请回答这个问题:谢谢提示。遗憾的是,我得到了一个与日志中的pid不相关的pid。顺便说一句,这可能确实是一个XY问题。请检查我的评论上面为什么我想这样做。也许你可以帮我回答SO中的另一个问题。你应该确保它在本地系统上运行,而不是在目标主机上运行。将
委托\u添加到:localhost
,或使用
本地\u操作:
重写它。使用此代码段获得的PPID来自目标主机,而不是本地主机。安装模块将针对每个主机执行。如果在200台主机上运行代码,它将调用200次
getpid
,尽管Ansible主机的
PID
始终相同。这意味着,在设置模块中执行此操作的位置不正确。查找ansible 2.7.9或更低版本,感谢您的响应。此外,这将打印所有不需要的ansible playbook的pid,这里我需要从同一playbook中获取当前playbook的pid。