failed_when 导致调试任务失败,尽管条件结果为 False?

问题描述 投票:0回答:1

我想检查两个变量是否已定义并且不为空。我有一个任务

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
仍然无法完成任务。

我错过了什么?另外,我欢迎任何关于改进我的代码的建议,以检查这两个属性不是未定义/空的。

ansible jinja2
1个回答
0
投票

如果您想让剧本因某种原因失败,请不要使用

debug
任务,而应使用
assert
任务:

 - assert:
     that:
       - my_variable.version | default('') != ''
       - my_variable.previous_version | default('') != ''

使用

default
,这里将确保断言将因定义的条件而失败,而不是断言任务本身失败。

© www.soinside.com 2019 - 2024. All rights reserved.