2015-03-30 5 views
3

У меня есть роль, которую мне нужно использовать для получения дополнительных значений. Для каждой задачи в роли я регистрирую переменную: 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 регистрирует «пропуск: [...]»? Почему он меняет его значение, если условие не выполняется?

+1

РЕШЕНИЕ: Если кто-то играет роль с большим количеством вариантов и не хочет использовать много переменных это путь: после каждой задачи добавьте что-то вроде этого: '- set_fact: checkdeps = '{{checkoutput.stdout}}' , когда: '{{not (checkoutput | skipped)}}' 'Таким образом, у вас есть stdout, только если он не пропущен или условие не выполнено. И в конце вы проверяете это так: 'when:" checkdeps.find ('текст, который вы ищете на выходе')! = -1 "' – ady8531

ответ

3

анзибль хранит «Логарифм анзибль выполнения задачи», НЕ "вывод команды выполняются. Этот журнал, который является dict, и один из ключей: stdout, который содержит все выполненные команды, напечатанные на stdout (вывод команды).

tasks: 
    - debug: msg='one' 
     register: o1 
     when: True 
    - debug: msg='two' 
     register: o2 
     when: False 
    - debug: msg='o1={{o1}}' 
    - debug: msg='o2={{o2}}' 

Он печатает следующее. 'skipped' & 'изменен' - это два ключа, которые будут присутствовать в «log», когда задача не будет выполнена.

TASK: [debug msg='one'] ******************************************************* 
ok: [localhost] => { 
    "msg": "one" 
} 

TASK: [debug msg='two'] ******************************************************* 
skipping: [localhost] 

TASK: [debug msg='o1={{o1}}'] ************************************************* 
ok: [localhost] => { 
    "msg": "o1={'msg': u'one', 'verbose_always': True, 'invocation': {'module_name': u'debug', 'module_args': u\"msg='one'\"}}" 
} 

TASK: [debug msg='o2={{o2}}'] ************************************************* 
ok: [localhost] => { 
    "msg": "o2={u'skipped': True, u'changed': False}" 
} 

* термин «журнал выполнения задач» изобретен мною для объяснения и не имеет принципиальной терминологии.

+0

Если вы не достигнете точки, в которой невозможно получить сообщение о том, что 'stdout' не является частью словарь ... см. https://github.com/bobbyrenwick/ansible-pip/issues/13 – sorin

1

Или просто сказать анзибль не зарегистрировать переменную, если задача пропуску set_when_task_skipped=false:

- name: "example to skip" 
    shell: "cd /opt/play/apps/default-device && play deps {{ dep }}" 
    register: checkdeps set_when_task_skipped=false 
    when: "dep == \"I\" or dep == \"II\""