首页 > 解决方案 > 即使条件为假,条件注册的变量也被视为已定义

问题描述

抱歉没有澄清,重写我的问题:

我正在努力将适当的start_index值传递给“回声参数”下面的第三个任务。如果user_defined_index 是 ""我希望echo unique UIDs任务执行并在 start_index 变量中传递输出。同样,如果user_define_index 不是“”,我希望下面的第二个任务执行并填充 start_index 变量。我基本上需要将AB传递给echo parameters任务。

Echo 参数任务期望获得一些 UID 。第一个任务根据您在 shell 命令中看到的内容自动生成 UID 。第二个任务允许用户指定 UID。因此,无论哪个WHEN命令有效,该组 UID 都需要被第三个任务使用。使用调试语句,我已经确认ECHO UNIQUE UIDSCAPTURE USER DEFINED UIDs任务都可以正常工作,并且相应的寄存器变量具有正确的数据。

我的问题是第三个任务只从第一个任务中获取值,无论它是自动生成的值还是跳过等于 true 的空白。

我需要将 start_index 中的正确对应值输入第三个任务。

  - name: echo unique UIDs
    shell:  echo $(((0x$(hostid) + $(date '+%s'))*100000 + {{ item[0] }}*100000 + {{ start_stress_index }}))
    with_indexed_items:
      - "{{ load_cfg }}"
    register: start_index
    when: user_defined_index == ""
    changed_when: False

  - name: Capture user defined UIDs
    shell: echo '{{ user_defined_index }}' | tr , '\n'
    with_indexed_items:
      - "{{ load_cfg }}"
    register: start_index
    when: user_defined_index != ""
    changed_when: False

  - name: Echo parameters
    command: echo --cfg='{{ start_index }}' --si={{ item[1].stdout }}
    with_together:
      - "{{ load_cfg }}"
      - "{{ start_index.results }}"

对于上述情况,无论来自 echo 唯一 UID 的 user_define_index 输出如何,总是会传递给第三个任务。谷歌搜索后,我终于找到了使用三元过滤器的潜在解决方案:

https://github.com/ansible/ansible/issues/33827

我已将我的代码修改为:

  - name: echo unique UIDs
    shell:  echo $(((0x$(hostid) + $(date '+%s'))*100000 + {{ item[0] }}*100000 + {{ start_stress_index }}))
    with_indexed_items:
      - "{{ load_cfg }}"
    register: start_auto_index
    when: user_defined_index == ""
    changed_when: False

  - name: Capture user defined UIDs
    shell: echo '{{ user_defined_index }}' | tr , '\n'
    with_indexed_items:
      - "{{ load_cfg }}"
    register: start_user_index
    when: user_defined_index != ""
    changed_when: False

  - name: Echo parameters
    command: echo --cfg='{{ start_index }}' --si={{ item[1].stdout }}
    with_together:
      - "{{ load_cfg }}"
      - "{{ ((start_auto_index is not skipped)|ternary(start_auto_index,start_user_index))['results'] }}"

但是,当我运行上面的代码时,我仍然遇到与第一个示例相同的问题,无论我对 user_defined_index 做什么,我再次只从start_auto_index 获取发送到第三个任务回显参数的输出。

我希望这能澄清我的问题。

标签: variablesansibleconditional

解决方案


解释

问题是您的任务包含一个循环,在这种情况下,Ansible 会为任务和每个循环迭代返回单独的状态。

start_auto_index is not skipped您一起检查整个任务的状态,但它是“跳过”状态的迭代。

解决方案

由于user_defined_index包含循环的任务的条件对于每个循环迭代都是恒定的,因此所有迭代都将具有相同的跳过状态,您可以修改Echo parameters任务中的条件以仅检查其中一个:

"{{ ((start_auto_index[0] is not skipped)|ternary(start_auto_index,start_user_index))['results'] }}"

此外,在Echo parameters任务with_together中似乎没有任何功能,因为您没有参考item[0].


推荐阅读