Linux 获取运行剧本的pid,以便在剧本中使用
当我们在启用详细输出的情况下运行playbook时,在ansible日志中可以看到如下内容: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
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。