У меня есть следующая игровая книга:
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
У вас, вероятно, есть
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
.
Таким образом, вы по-прежнему будете видеть описание задачи, но ничего под ним, подтверждающее, что задача была пропущена.
Вот как работает Ansible, даже если все хосты пропущены для задачи, он все равно будет отображать выполнение задачи, что верно, задача запущена, но пропущены все хосты.
Хорошо. Я думаю, что мое понимание может быть неправильным, или я ожидаю чего-то другого. Для меня тот факт, что задача, являющаяся частью включенного yml, выполняется, следовательно, она уже выполнена для всех практических целей, является моей мыслью. Опять же, я могу думать неправильно. Когда список пуст, я не хочу, чтобы это выполнялось в первую очередь: TASK [display value if not empty]
Вывод говорит вам, что ваша книга воспроизведения достигла TASK [display value if not empty]
. Но поскольку все хосты пропущены, он не показывает никаких результатов. Так что практически это не было выполнено, как вы и просили. Теперь, если вы не хотите, чтобы ansible вообще отображал название задачи, когда она не выполняется для какого-либо хоста.... если это когда-либо возможно (чего я не знаю), это, вероятно, потребует от вас использования другого плагин обратного звонка или даже написать свой собственный. Что именно вы пытаетесь решить, не отображая эту строку?
Ты прав. как сказал @β.εηοιτ.βε, мне нужно смотреть на пропущенные. Еще раз спасибо за изучение этого.
Спасибо! Я считаю, что проблема не в том, чтобы показать пропущенную задачу, а в том, что она выполняется там, где она вообще не должна быть.