2015-07-24 20 views
32

Để trả lời thay đổi, tôi có nhiều tác vụ liên quan sẽ chạy. Làm cách nào để viết trình xử lý Ansible với nhiều tác vụ?Làm cách nào để viết trình xử lý Ansible với nhiều tác vụ?

Ví dụ, tôi muốn một handler mà khởi động lại một dịch vụ duy nhất nếu đã bắt đầu:

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

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

Trả lời

20

Có giải pháp thích hợp cho vấn đề này là của Ansible 2.2.

xử lý cũng có thể “lắng nghe” để chủ đề chung chung, và nhiệm vụ có thể thông báo những chủ đề như sau:

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" 

sử dụng này làm cho nó dễ dàng hơn nhiều để kích hoạt nhiều bộ xử lý. Nó cũng tách riêng xử lý từ tên của họ, làm cho nó dễ dàng hơn để chia sẻ bộ xử lý trong playbooks và vai trò

Cụ thể cho câu hỏi, điều này sẽ làm việc:

- 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 

và trong nhiệm vụ, thông báo xử lý thông qua 'quá trình khởi động lại'

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

45

Trong tập tin xử lý của bạn, chuỗi các bước khác nhau cùng sử dụng thông báo.

- 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 

Sau đó, hãy tham khảo từ nhiệm vụ với notify: Restart conditionally.

Lưu ý rằng bạn chỉ có thể thông báo cho bộ xử lý thấp hơn hiện tại. Ví dụ: Restart conditionally step 2 không thể thông báo Restart conditionally.

Nguồn: #ansible tại irc.freenode.net. Tôi không chắc liệu điều này sẽ tiếp tục hoạt động trong tương lai vì nó không được đề cập đến như một tính năng trong tài liệu chính thức.

+0

Thật vậy, có vẻ như trong Ansible 2.2, tính năng này không khả dụng. (! 'LỖI 'notfiy' không phải là một thuộc tính có giá trị trong một Handler') –

+4

@ leo-the-hưng Dường như bạn có một typo: 'notfiy' thay vì' notify' – timdiels

+1

derp, cảm ơn bạn. công trình hạ tầng đêm khuya không phải là ý tưởng tốt nhất –

22

Tính đến Ansible 2.0, bạn có thể sử dụng một hành động đưa vào xử lý của bạn để chạy nhiều nhiệm vụ.

Ví dụ, đặt nhiệm vụ của bạn trong một tệp riêng restart_tasks.yml (nếu bạn sử dụng vai trò, mà có thể đi vào các nhiệm vụ thư mục con, không trong xử lý thư mục con):

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

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

xử lý của bạn sau đó sẽ đơn giản là:

- name: Restart conditionally 
    include: restart_tasks.yml 

Nguồn: vấn đề chủ đề trên github: https://github.com/ansible/ansible/issues/14270

+5

Chỉ cần lưu ý rằng các phiên bản Ansible giữa 2.0.2 và 2.1.2 có lỗi khi điều này không hoạt động: https: // github.com/ansible/ansible/issues/15915 –

Các vấn đề liên quan