2017-01-15 6 views
0

Я пытаюсь создать файл, чтобы обозначить, что выполнение скрипта/команды было сделаноМогу ли я использовать один и тот же обработчик Ansible дважды в одном исполнении для воспроизведения?

Я знаю, мы должны избегать скрипт/команду, но здесь я не могу

Таким образом, чтобы предотвратить повторное исполнение я есть создание файла для его обозначения уже выполнено

Это работает для последней задачи, но не для первых!

мне интересно, если тот же обработчик может быть использована дважды или не

задачи ..

- set_fact: donefile=nodesource_setup 

- name: Ensure node install script executed 
    shell: ~/tmp/nodesource_setup.sh >> ~/tmp/nodesource_setup.log 
    args: 
    creates: ~/tmp/{{ donefile }}.done # Cannot one line this 
    notify: Done 

- set_fact: donefile=ensure-npm-does-not-use-unicode 

- name: Ensure npm does not use unicode 
    command: npm config set unicode false 
    args: 
    creates: ~/tmp/{{ donefile }}.done 
    notify: Done 

Обработчики ..

- name: Done 
    copy: 
    content: "done" 
    dest: ~/tmp/{{ donefile }}.done 
    force: no 

ответ

2

обработчика задача, выполняемая один раз:

  • после всех других задач был бежать (по умолчанию)
  • на meta: flush_handlers задачи («Уведомлять» флаг сбрасывается и если обработчик снова уведомлен он будет работать снова)

Проблема с кодом является то, что в время выполнения обработчика Done, ваша переменная donefile будет иметь последнее значение donefile=ensure-npm-does-not-use-unicode.


Вы можете добавить задачу:

- meta: flush_handlers 

, прежде чем изменить значение donefile, так что для данного значения обработчики будут работать. Единственная проблема заключается в том, что это не имеет большого смысла - это может быть обычной задачей, а не обработчиком.

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

Если вы хотите запустить его один раз, вы можете просто выполнить обычную задачу или задачу с условием when.

+0

- meta: flush_handlers .. is awesome thx, сделал именно то, что я хотел. большие идеи. я предпочитаю обработчики для тривиальных задач уведомления над обычными задачами, потому что это уменьшает количество задач, выполняемых, когда обработчики не срабатывают. – danday74

+0

Но в этом случае обработчик вызывается дважды, поэтому единственное, что вы сохраняете, - это четыре строки в вашем коде для плей-листов, которые будут действительно путать кого-то в будущем, который будет использовать обработчики, используемые в «пожаре» только один раз "метод. Если вы единственный, кто всегда будет управлять этим плейбуком, то это, вероятно, не имеет большого значения. Если есть шанс, что вы передадите это команде в операционную группу (или еще лучше уйдете на пенсию!), Я предлагаю вам придерживаться двух задач, а не обходного метода handler-plus-meta. –