我有这个食谱:
- name: Kill usr/bin/perl -w /usr/share/debconf/frontend
shell: "{{ item }}"
with_items:
- 'pkill -9 -f debconf/frontend || echo'
changed_when: false # Don't report changed state
当我在命令行上运行这个命令时,由于|| echo:
,它返回一个0退出代码~$ pkill -9 -f debconf/frontend || echo
~$ $?
0
然而,在Ansible中运行它显示如下:
failed: [testhost1] (item=pkill -9 -f debconf/frontend || echo) => {"ansible_loop_var": "item", "changed": false, "cmd": "pkill -9 -f debconf/frontend || echo", "delta": "0:00:00.132296", "end": "2023-01-13 10:34:11.098765", "item": "sudo pkill -9 -f debconf/frontend || echo", "msg": "non-zero return code", "rc": -9, "start": "2023-01-13 10:34:10.966469", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
你知道我做错了什么吗?
通过
开始测试过程perl -MPOSIX -e '$0="test"; pause' &
一个最小的示例剧本
---
- hosts: localhost
become: false
gather_facts: false
tasks:
- name: Shell task
shell:
cmd: "{{ item }}"
with_items:
- 'pkill -9 -f test || echo'
register: result
- name: Show result
debug:
msg: "{{ result }}"
重现问题。使用而不是
with_items:
- 'pkill -9 -f test'
或
with_items:
- 'kill -9 $(pgrep test) || echo'
将执行,没有错误。
- 我如何启动一个进程与任何名称不做什么? 如何使用Ansible杀死一个正在运行的进程?
相似的Q&一个
有相同的错误信息
- Ansible:如何强制杀死进程…?
进一步阅读
如果可能的话,建议使用Ansible模块而不是shell
命令
pids
模块—如果进程正在运行,则检索进程id列表,否则返回空列表
---
- hosts: localhost
become: false
gather_facts: false
tasks:
- name: Get Process ID (PID)
pids:
name: test
register: PID
- name: Show PID
debug:
msg: "{{ PID.pids | first }}"
- name: Shell task
shell:
cmd: "kill -9 {{ PID.pids | first }}"
register: result
- name: Show result
debug:
msg: "{{ result }}"
啊,这是因为从Ansible内部运行pkill会导致它杀死自己(pkill中的bug ?)
在任何情况下,一个解决方法是这样做:
with_items:
- 'if pgrep -f "debconf/frontend" | grep -v $$; then sudo pkill -9 -f "debconf/frontend"; fi'