以ansible条件评估返回代码

Bry*_*yan 21 ansible

我正在努力自动执行需要将最新版本的软件附加到文件的任务.我不想为同一版本多次这样做.

它查看以下示例文件:

var software releases = new Array(
    "4.3.0",
    "4.4.0",
    "4.5.0",
    "4.7.0",
    "4.8.0",
    "4.11.0",
    "4.12.1",
    "4.14.0",
    "4.15.0",
    "4.16.0",
);
Run Code Online (Sandbox Code Playgroud)

默认的main.yml会传递类似的东西

VERSION: 4.16.2
Run Code Online (Sandbox Code Playgroud)

- name: register version check
  shell: cat /root/versions.js | grep -q {{VERSION}}
  register: current_version

- debug: msg="The registered variable output is {{ current_version.rc }}"

- name: append to versions.js
  lineinfile:
    dest: /root/versions.js
    regexp: '^\);'
    insertbefore: '^#\);'
    line: "    \"{{VERSION}}\",\n);"
    owner: root
    state: present
    when: current_version.rc == 1
Run Code Online (Sandbox Code Playgroud)

问题:调试消息正在评估current_version.rc并显示基于grep命令输出的布尔值,但我无法在when条件中重复使用它来确定是否应该运行任务.

编辑:输出:

PLAY [localhost] **************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [test | register version check] *****************************************
failed: [localhost] => {"changed": true, "cmd": "cat /root/versions.js | grep -q 3.19.2", "delta": "0:00:00.003570", "end": "2015-12-17 00:24:49.729078", "rc": 1, "start": "2015-12-17 00:24:49.725508", "warnings": []}

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/root/site.retry

localhost                  : ok=1    changed=0    unreachable=0    failed=1
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 41

正如nikobelia在评论中指出的那样,grep当它与任何行不匹配时返回退出代码1.Ansible然后将此(实际上是来自shell /命令任务的0以外的任何状态代码)解释为错误,因此立即失败.

您可以通过使用来告诉Ansible忽略shell /命令任务中的响应代码ignore_errors.虽然grep这会忽略实际错误(由返回码2给出),所以你可能想要这样使用failed_when:

- name: register version check
  shell: cat /root/versions.js | grep -q {{VERSION}}
  register: current_version
  failed_when: current_version.rc == 2
Run Code Online (Sandbox Code Playgroud)

  • 是的,为了完成,您还可以使用:`failed_when :( result.rc不在[0,1]中)` (9认同)
  • 甚至`result.rc > 1` ... (4认同)