即使条件为假,条件注册变量也被认为已定义

时间:2018-09-28 18:07:04

标签: variables ansible conditional

道歉原因不明,请重写我的要求:

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

回声参数任务期望获得一些UID。第一个任务根据您在shell命令中看到的内容自动生成UID 。第二项任务是允许用户指定UID。因此,无论哪个 When 命令有效,第三个任务都需要使用UID集。使用调试语句,我已经确认 ECHO UNIQUE UIDS CAPTURE 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 }}"

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

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'] }}"

但是,当我运行上面的示例时,我仍然遇到与第一个示例相同的问题,无论如何,我只会再次从 start_auto_index 中获取输出发送给第三任务 echo参数我使用user_defined_index。

我希望这可以澄清我的问题。

1 个答案:

答案 0 :(得分:0)

说明

问题是您的任务包含一个循环,在这种情况下,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]