Ansible在执行Shell命令时返回零错误

16

Ansible 似乎无法处理 shell 命令返回的结果为 '0' 的情况。

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

返回一个错误

"msg": "非零返回代码"

但是当我将"dev"替换为"Type"时,实际上总是会发生并且至少给出1个计数,则命令成功执行,不会抛出任何错误。

我还尝试使用command:而不是shell:-它不会给出错误,但是命令也不会被执行。

3个回答

33

因为您想要运行一系列涉及管道的命令,ansible建议您使用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不将这两个返回代码视为故障:

- 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

2
你的回答在严格意义上是很好的,也是一个很好的学习例子。但是对于我正在尝试做的事情来说,意识到有一个名为“ansible fact”的ansible_swaptotal_mb可以立即指示系统中是否存在交换空间,实际上指向了更好的解决方案 :) - user2066480
我同意,如果Ansible Facts能够提供我所需的信息,我更愿意使用它们 :) - ilias-sp
3
我认为 failed_when:ignore_errors: true 更好!谢谢 :) - Nicola

2
我发现了一种更好的方法。如果你只需要知道记录编号,那么这个方法很有效:

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

另一种方法是在管道结尾处始终使用cat命令。请参见Ansible shell模块在grep结果为空时返回错误

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


0

你也可以在 awk 中解析 grep 的计数结果并返回自定义输出。这将避免使用 ignore_errors 模块。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接