我想检查两个变量是否已定义并且不为空。我有一个任务
debug
来检查,如果两个变量中的任何一个未定义或为空,则任务应该失败。问题是,当两者都定义时,脚本(正确地)返回它们都已定义,但 failed_when
条件仍然无法完成任务。
这是我的任务:
- set_fact:
my_variable:
version: "2"
previous_version: "1"
- name: Ensure versions are present
ansible.builtin.debug:
msg: |
{% set missing_versions = [] %}
{% set version_names = ['version','previous_version'] %}
{% for version_name in version_names %}
{% if my_variable[version_name] is not defined or my_variable[version_name] == '' %}
{% set missing_versions = missing_versions + version_name %}
{% endif %}
{% endfor %}
{% if missing_versions | length > 0 %}
The following value(s) are missing: {{ missing_versions | join(', ') }}
{% else %}
The {{ version_names | join(', ') }} values are present.
{% endif %}
failed_when: missing_versions | length > 0
预期结果:
当
my_variable.version
和my_variable.previous_version
同时定义时:
存在版本、previous_version 值。
其他:
缺少以下值:
- 版本
- 上一个版本
正如您在
set_fact
任务中看到的,这两个值都已定义,当 debug
任务运行时,它会输出 “版本,previous_version 值存在。”,但任务仍然失败。如果我将条件更改为failed_when: no
,则成功。我什至在任务中添加了文本来检查完全相同的条件:
- name: Ensure versions are present
ansible.builtin.debug:
msg: |
{% set missing_versions = [] %}
{% set version_names = ['version','previous_version'] %}
{% for version_name in version_names %}
{% if my_variable[version_name] is not defined or my_variable[version_name] == '' %}
{% set missing_versions = missing_versions + version_name %}
{% endif %}
{% endfor %}
{% if missing_versions | length > 0 %}
The following value(s) are missing: {{ missing_versions | join(', ') }}
{% else %}
The {{ version_names | join(', ') }} values are present.
{% endif %}
Missing versions length > 0: {{ missing_versions | length > 0 }}
failed_when: missing_versions | length > 0
结果:
存在版本、previous_version 值。 缺失版本长度 > 0:False
所以我知道条件是正确的,但即使结果是
failed_when
,False
仍然无法完成任务。
我错过了什么?另外,我欢迎任何关于改进我的代码的建议,以检查这两个属性不是未定义/空的。
如果您想让剧本因某种原因失败,请不要使用
debug
任务,而应使用 assert
任务:
- assert:
that:
- my_variable.version | default('') != ''
- my_variable.previous_version | default('') != ''
使用
default
,这里将确保断言将因定义的条件而失败,而不是断言任务本身失败。