2015-07-24 1 views
32

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

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

- name: Restart conditionally 
    shell: check_is_started.sh 
    register: result 

- name: Restart conditionally step 2 
    service: name=service state=restarted 
    when: result 

ответ

20

Существует правильное решение этой проблемы по сравнению с Ansible 2.2.

обработчики также могут «слушать» на общие темы и задачи могут уведомить эти темы следующим образом:

handlers: 
    - name: restart memcached 
     service: name=memcached state=restarted 
     listen: "restart web services" 
    - name: restart apache 
     service: name=apache state=restarted 
     listen: "restart web services" 

tasks: 
    - name: restart everything 
     command: echo "this task will restart the web services" 
     notify: "restart web services" 

Это использование делает его гораздо проще, чтобы вызвать несколько обработчиков. Он также разъединяет обработчик из их имен, что делает его легче разделить обработчик среди playbooks и ролей

В частности на вопрос, это должно работать:

- name: Check if restarted 
    shell: check_is_started.sh 
    register: result 
    listen: Restart processes 

- name: Restart conditionally step 2 
    service: name=service state=restarted 
    when: result 
    listen: Restart processes 

и задачи, извещать обработчик с помощью «Restart процессов»

http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change

45

В файле обработчика, приковать различные этапы вместе с помощью извещать.

- name: Restart conditionally 
    debug: msg=Step1 
    changed_when: True 
    notify: Restart conditionally step 2 

- name: Restart conditionally step 2 
    debug: msg=Step2 
    changed_when: True 
    notify: Restart conditionally step 3 

- name: Restart conditionally step 3 
    debug: msg=Step3 

Затем обратитесь к нему из задачи с notify: Restart conditionally.

Обратите внимание, что вы можете только оповещать обработчиков ниже текущего. Так, например, Restart conditionally step 2 не может уведомлять Restart conditionally.

Источник: #ansible at irc.freenode.net. Я не уверен, что это будет продолжаться в будущем, поскольку оно не упоминается как функция в официальной документации.

+0

Действительно, похоже, что в Ansible 2.2 это недоступно. ('ERROR! 'Notfiy' не является допустимым атрибутом для Handler') –

+4

@ leo-the-manic У вас появляется опечатка:' notfiy' вместо 'notify' – timdiels

+1

Derp, спасибо. Работа на поздней ночной инфраструктуре - не самая лучшая идея. –

22

Начиная с Ansible 2.0, вы можете использовать действие include в вашем обработчике для запуска нескольких задач.

Например, поставить свои задачи в отдельном файле restart_tasks.yml (если использовать роли, которые будут идти в поддиректории задач, не в подкаталоге обработчиков):

- name: Restart conditionally step 1 
    shell: check_is_started.sh 
    register: result 

- name: Restart conditionally step 2 
    service: name=service state=restarted 
    when: result 

Ваш обработчик будет тогда просто быть:

- name: Restart conditionally 
    include: restart_tasks.yml 

Источник: выпуск резьбы на GitHub: https://github.com/ansible/ansible/issues/14270

+5

Просто обратите внимание, что в версиях Ansible между 2.0.2 и 2.1.2 есть ошибка, где это не работает: https: // github.com/ansible/ansible/issues/15915 –

 Смежные вопросы

  • Нет связанных вопросов^_^