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 条件语句未正确评估
我做错了什么,不理解?
简答:要么测试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)
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |