【问题标题】:Get the pid of a running playbook for use within the playbook获取正在运行的剧本的 pid 以在剧本中使用
【发布时间】:2020-01-24 03:44:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不认为这是直接可用的,但你想用 PID 做什么?如果你真的需要,我认为@larsks 有一个很好的答案
  • @DaveSnigier 我想要实现的目标与 my question here 相关。我正在尝试从 ansible 日志中提取与特定剧本相关的条目,以便创建一个单独的日志(我想这是一种方法)。
  • 如果有人找到答案让这个问题也回答:stackoverflow.com/questions/58436621/…

标签: linux ansible ansible-playbook pid


【解决方案1】:

您可以使用带有lookup 过滤器的set_fact 模块为localhost 定义PID。

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

稍后您可以通过hostvars 字典引用PID

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

【讨论】:

    【解决方案2】:

    这听起来有点像XY problem,但一种选择可能是使用shell 命令生成一个shell,然后询问父PID:

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

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

    【讨论】:

    • 感谢您的提示。可悲的是,我得到了一个与日志中的 pid 无关的 pid。顺便说一句,这可能确实是一个 XY 问题。请查看我上面的评论,了解我为什么要做这样的事情。也许你可以帮助我在 SO 中的其他问题。
    • 您需要确保它在本地系统上运行,而不是在目标主机上。要么添加delegate_to: localhost,要么使用local_action: 重写它。您使用此 sn-p 获得的 PPID 来自目标主机,而不是本地主机。
    【解决方案3】:

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

    【讨论】:

    • 此进程 ID 的值是否在任务之间不断变化?我尝试了这种方法,但它在任务之间不断变化
    【解决方案4】:

    如果您将在不同的游戏中使用该 pid,只需将其添加到 setup 模块即可。

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

    而且它总是可用的。

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

    【讨论】:

    • 为每个主机执行设置模块。如果在 200 台主机上运行代码,它会调用 200 次 getpid,尽管 Ansible 主机的 PID 始终相同。这意味着,在设置模块中执行此操作是错误的。
    【解决方案5】:

    您可以参考 v2.8 新增的 pids 模块。它将特定进程名称的所有 pid 传递给您。

    在主机上获取 Ansible Playbook 的 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

    请参考https://docs.ansible.com/ansible/latest/modules/pids_module.html

    【讨论】:

    • 正在寻找 ansible 2.7.9 或更低版本,感谢回复
    • 此外,这将打印所有不想要的 ansible-playbooks 的 pid,这里我需要从同一个 playbook 中获取当前 playbook 的 pid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2018-11-05
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多