У меня есть роль, которую мне нужно использовать для получения дополнительных значений. Для каждой задачи в роли я регистрирую переменную: checkdeps (она одинакова для всех задач внутри этой роли - во время запуска она всегда имеет по крайней мере одно значение/вывод - мне это нужно так, потому что путь отличается «/ opt/play/apps/default-ace "," default-device "и т. д.), и в конце я делаю эхо, чтобы просмотреть вывод checkdeps.stdout.Ansible - переменная, изменяющая ее значение, даже если условие не выполняется.
Ниже я поставил одну задачу, которая выйдет нормально, и та, которая будет умышленно пропущена. Если я использую параметр dep: APK_PARSER в плейбуке, то что он делает: первые checkdeps регистрируют вывод, а во второй задаче значение checkdeps заменяется ничем! Несмотря на то, что задача пропускается из-за отсутствия соответствующего параметра dep.
Почему значение checkdeps заменяется, если условие не выполняется?
- name: "output ok"
shell: "cd /opt/play/apps/default-ace && play deps {{ dep }}"
register: checkdeps
when: "dep == \"APK_PARSER\""
- name: "example to skip"
shell: "cd /opt/play/apps/default-device && play deps {{ dep }}"
register: checkdeps
when: "dep == \"I\" or dep == \"II\""
- name: "echo ok if Done!"
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps.stdout }}\""
И это дает мне ошибку:
One or more undefined variables: 'dict' object has no attribute 'stdout'
Я модифицированная последнюю строку без стандартного вывода:
shell: "echo \"OK - {{ dep }} Dependencies {{ checkdeps }}\""
и побежал без ошибок, но дали неверный вывод:
stdout:
OK - APK_PARSER Dependencies {u'skipped': True, u'changed': False}
Была ли переменная c heckdeps регистрирует «пропуск: [...]»? Почему он меняет его значение, если условие не выполняется?
РЕШЕНИЕ: Если кто-то играет роль с большим количеством вариантов и не хочет использовать много переменных это путь: после каждой задачи добавьте что-то вроде этого: '- set_fact: checkdeps = '{{checkoutput.stdout}}' , когда: '{{not (checkoutput | skipped)}}' 'Таким образом, у вас есть stdout, только если он не пропущен или условие не выполнено. И в конце вы проверяете это так: 'when:" checkdeps.find ('текст, который вы ищете на выходе')! = -1 "' – ady8531