shell命令的Ansible错误返回零

时间:2018-05-21 00:15:27

标签: ansible

Ansible似乎无法处理shell命令的结果'0'。此

- name: Check if swap exists
  shell: "swapon -s | grep -ci dev"
  register: swap_exists

返回错误

  

“msg”:“非零返回码”

但是当我用“type”替换“dev”时,实际上总是会发生并且计数至少为1,那么命令成功并且不会抛出任何错误。

我也试过command:而不是shell: - 它没有给出错误,但是命令也没有执行。

3 个答案:

答案 0 :(得分:3)

因为你想要运行一系列涉及管道和安全状态的命令,所以你应该使用shell而不是command,而不是像你一样。

所以,问题是grep返回1(没有在swapon输出上找到匹配)的事实,并且ansible认为这是失败的。由于您确信没有问题,只需添加ignore_errors: true即可完成。

- name: Check if swap exists
  shell: "swapon -s | grep -ci non_existent_string"
  register: swap_exists
  ignore_errors: true

如果你想缩小它以返回代码0和1,请指示ansible不考虑那些2 rcs的失败:

- name: Check if swap exists
  shell: "swapon -s | grep -ci non_existent_string"
  register: swap_exists
  # ignore_errors: true
  failed_when: swap_exists.rc != 1 and swap_exists.rc != 0

答案 1 :(得分:2)

我找到了更好的方法。如果您只需要知道记录号,那么该方法就起作用:

- name: Check if swap exists
  shell: "swapon -s | grep -i dev|wc -l"
  register: swap_exists

另一种方法是始终在管道末端使用cat。参见Ansible shell module returns error when grep results are empty

    - name: Check if swap exists
      shell: "swapon -s | grep -i dev|cat"
      register: swap_exists

答案 2 :(得分:0)

您还可以在grep中解析awk计数结果并返回自定义输出。这样可以避免ignore_errors模块。

- name: Check if swap exists
  shell: "swapon -s | grep -ci dev" | awk '{ r = $0 == 0 ? "false":"true"; print r }'
  register: swap_exists