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

时间:2016-02-03 12:21:20

标签: linux ansible ansible-playbook pid

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

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

我认为p=4105是剧本的pid。

有没有办法在播放期间将这个pid放在playbook中(例如作为变量)?

5 个答案:

答案 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