Ansible: запускать задачу, только если переменная не пуста

У меня есть следующая игровая книга:

test2.yml:

- hosts: localhost
  connection: local
  gather_facts: false

  vars:
    dict1:
      v1:
        - 111
        - 222
        - 333
      v2:

    ver: "{{ ver }}"

  tasks:
    - name: Gather list
      set_fact: rblist = "{{ pitem }}"
      with_dict: "{{ dict1 }}"
      when: "pitem.key in ver"
      loop_control:
       loop_var: pitem
      register: plist

    - name: lets include the task if the value is not empty
      include: test3.yml
      when: rblist.value

test3.yml:

---
  - name: display value if not empty
    debug: msg = {{ rblist.value }}

Я хотел бы вызывать test3.yml только тогда, когда rblist.value не пуст, но игнорирует это и вызывает задачу, даже если значение пусто.

Когда значение не пустое: работает нормально

ansible-playbook test2.yml -e "ver=v1"

PLAY [localhost] ************************************************************************************************************************************************************************************************************************

TASK [Gather list] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item = {u'key': u'v1', u'value': [111, 222, 333]})

TASK [display value if not empty] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        111, 
        222, 
        333
    ]
}

PLAY RECAP ******************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Когда значение пустое: похоже, ведет себя так же, как когда список

ansible-playbook test2.yml -e "ver=v2"

PLAY [localhost] ************************************************************************************************************************************************************************************************************************

TASK [Gather list] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item = {u'key': u'v2', u'value': None})

TASK [display value if not empty] *******************************************************************************************************************************************************************************************************

PLAY RECAP ******************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Далее Как проверить, что зарегистрированная переменная не пуста? и другие решения, я пробовал следующее

when: rblist.value | length > 0

Я получаю это:

TASK [display value if not empty] *******************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'rblist.value | length > 0' failed. The error was: Unexpected templating type error occurred on ({% if rblist.value | length > 0 %} True {% else %} False {% endif %}): object of type 'NoneType' has no len()\n\nThe error appears to be in '/stage/ap/ansible/test/test3.yml': line 2, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n  - name: display value if not empty\n    ^ here\n"}

Когда я пытаюсь это:

when: rblist.value != None

Я получаю это:

ansible-playbook test2.yml -e "ver=v2"

PLAY [localhost] ************************************************************************************************************************************************************************************************************************

TASK [Gather list] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item = {u'key': u'v2', u'value': None})

TASK [display value if not empty] *******************************************************************************************************************************************************************************************************

PLAY RECAP ******************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Я пробовал это:

when: rblist.value != ""

Те же результаты, что и выше, при использовании != None

Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
1
0
2 568
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас, вероятно, есть

display_skipped_hosts = false

в вашем файле ansible.cfg.

Где display_skipped_hosts:

Переключите, чтобы управлять отображением пропущенных записей о задачах/узлах в задаче в обратном вызове по умолчанию.

Source: https://docs.ansible.com/ansible/2.9/reference_appendices/config.html#display-skipped-hosts

Если этот параметр установлен таким образом, вы не увидите пропущенных хостов в самой игре, но сможете увидеть их в резюме:

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0 

Где важная часть skipped=1.

Таким образом, вы по-прежнему будете видеть описание задачи, но ничего под ним, подтверждающее, что задача была пропущена.

Спасибо! Я считаю, что проблема не в том, чтобы показать пропущенную задачу, а в том, что она выполняется там, где она вообще не должна быть.

calsaint 22.12.2020 21:49

Вот как работает Ansible, даже если все хосты пропущены для задачи, он все равно будет отображать выполнение задачи, что верно, задача запущена, но пропущены все хосты.

β.εηοιτ.βε 22.12.2020 21:51

Хорошо. Я думаю, что мое понимание может быть неправильным, или я ожидаю чего-то другого. Для меня тот факт, что задача, являющаяся частью включенного yml, выполняется, следовательно, она уже выполнена для всех практических целей, является моей мыслью. Опять же, я могу думать неправильно. Когда список пуст, я не хочу, чтобы это выполнялось в первую очередь: TASK [display value if not empty]

calsaint 22.12.2020 22:28

Вывод говорит вам, что ваша книга воспроизведения достигла TASK [display value if not empty]. Но поскольку все хосты пропущены, он не показывает никаких результатов. Так что практически это не было выполнено, как вы и просили. Теперь, если вы не хотите, чтобы ansible вообще отображал название задачи, когда она не выполняется для какого-либо хоста.... если это когда-либо возможно (чего я не знаю), это, вероятно, потребует от вас использования другого плагин обратного звонка или даже написать свой собственный. Что именно вы пытаетесь решить, не отображая эту строку?

Zeitounator 23.12.2020 14:20

Ты прав. как сказал @β.εηοιτ.βε, мне нужно смотреть на пропущенные. Еще раз спасибо за изучение этого.

calsaint 23.12.2020 17:30

Другие вопросы по теме