Условно зарегистрированные переменные считаются определенными, даже если условие ложно - PullRequest
0 голосов
/ 28 сентября 2018

Извиняюсь за отсутствие разъяснений, переписываю мою просьбу:

Я изо всех сил пытаюсь получить соответствующее значение start_index , переданное третьей задаче ниже " Параметры эха ».Если user_defined_index равен "" , я хочу, чтобы задача echo уникальных UIDs выполнялась и выводила в переменную start_index.Аналогично, если user_define_index не равен "" , я хочу выполнить вторую задачу ниже и заполнить переменную start_index.По сути, мне нужно передать либо A , либо B в задачу параметры эха .

Задача Echo ожидает получить некоторые идентификаторы UID.Первая задача автоматически генерирует UID в зависимости от того, что вы видите в команде оболочки.вторая задача позволяет пользователю указать UID.Поэтому, какая бы команда WHEN действительна, набор UID должен использоваться третьей задачей.Используя операторы отладки, я подтвердил, что как ECHO UNIQUE UIDS , так и CAPTURE USER DEFINED UIDs задачи работают нормально, и соответствующие переменные регистра имеют правильные данные.

Моя проблема заключается в том, что 3-я задача выбирает только значения из 1-й задачи, независимо от того, будут ли они автоматически сгенерированными или пустыми с пропущенными значениями, равными true.

Мне нужно правильное соответствующее значение в start_index длябыть введенным в 3-ю задачу.

  - 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 всегда передаются в 3-ю задачу.После поиска в Google я, наконец, нашел потенциальное решение использовать троичный фильтр:

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 , отправленного на 3-е задание параметры эха независимо от того, что я делаю сuser_defined_index.

Надеюсь, это прояснит мой вопрос.

1 Ответ

0 голосов
/ 01 октября 2018

Объяснение

Проблема в том, что ваши задачи содержат цикл, и в этом случае 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].

...