Ansible似乎无法处理shell命令的结果'0'。此
- name: Check if swap exists
shell: "swapon -s | grep -ci dev"
register: swap_exists
返回错误
“msg”:“非零返回码”
但是当我用“type”替换“dev”时,实际上总是会发生并且计数至少为1,那么命令成功并且不会抛出任何错误。
我也试过command:
而不是shell:
- 它没有给出错误,但是命令也没有执行。
答案 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