为什么Ansible认为这个shell命令有一个非零返回码?



我有这个食谱:

- 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'

相关内容

最新更新