警告:Ansible 评估裸变量。我该如何正确实施?

Mou*_*inX 1 conditional-statements ansible

我的 Ansible 条件语句没有正确评估。

- name: A
  shell:
    cmd: /usr/local/bin/is_A_OK #returns bash true or false (not strings)
  register: is_A_OK

- name: B
  shell:
    cmd: /usr/local/bin/is_B_OK 
  register: is_B_OK

- name: reboot if both are OK
  reboot:
  when:
    - is_A_OK
    - is_B_OK
Run Code Online (Sandbox Code Playgroud)

[弃用警告]:将 'is_A_ok' 评估为一个裸变量,此行为将消失,将来您可能需要将 |bool 添加到表达式中。另请参阅 CONDITIONAL_BARE_VARS 配置切换。此功能将在 2.12 版中删除。

但是,逻辑工作正常,并且在两个变量都为真时执行重新启动。但我不能保持原样,因为此功能将在 2.12 版中删除。

仅供参考,bash 脚本的结论如下:

if [[ "$my_var" == true ]]; then
    true
else
    false
fi
Run Code Online (Sandbox Code Playgroud)

我正在运行 Arch Linux,所以 bash 是新的。

警告加上 ansible文档让我认为这是正确的:

- name: reboot if OK
  reboot:
  when:
    - is_A_OK|bool
    - is_B_OK|bool
Run Code Online (Sandbox Code Playgroud)

警告消失,但不会执行重新启动,即使两个变量都为真。我想我不明白文档。(我是 Ansible 的新手。)

我发现了这个问题,但它不相关:Ansible 条件语句未正确评估 - 堆栈内存溢出 Ansible 条件语句未正确评估

我做错了什么,不理解?

Vla*_*tka 5

简答:要么测试rc注册字典的属性,要么使用任务结果来测试成功。

详细信息:命令的返回码存储在rc注册字典的属性中。命令

    - command: /bin/true
      register: result_A
    - debug:
        var: result_A.rc
    - debug:
        msg: "{{ (result_A is success)|ternary('OK', 'KO') }}"
    - debug:
        msg: "{{ result_A|ternary('OK', 'KO') }}"
Run Code Online (Sandbox Code Playgroud)

rc=0的结果返回/bin/true。使用任务结果来测试成功。裸变量的测试result_A给出,True因为变量不是空的。它还产生弃用警告。

    "result_A.rc": "0"
    "msg": "OK"
    "msg": "OK"
Run Code Online (Sandbox Code Playgroud)

/bin/false命令的情况下

    - command: /bin/false
      register: result_B
      ignore_errors: true
    - debug:
        var: result_B.rc
    - debug:
        msg: "{{ (result_B is success)|ternary('OK', 'KO') }}"
    - debug:
        msg: "{{ result_B|ternary('OK', 'KO') }}"
Run Code Online (Sandbox Code Playgroud)

返回rc=1并且任务将在没有ignore_errors: true.

致命:[本地主机]:失败!=> {“更改”:真,“cmd”:[“/bin/false”],“增量”:“0:00:00.003322”,“结束”:“2020-06-14 07:07:17.620345” , "msg": "非零返回码", "rc": 1, "start": "2020-06-14 07:07:17.617023", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} ...忽略

测试成功失败并且测试result_B给出,True因为变量不为空。


    "result_B.rc": "1"
    "msg": "KO"
    "msg": "OK"
Run Code Online (Sandbox Code Playgroud)