Luôn kích hoạt thực thi xử lý trong Ansible


33

Tôi đang sử dụng Ansible để cung cấp máy chủ phát triển của mình.

Tôi muốn nó luôn bắt đầu một số dịch vụ cho tôi. Tôi có các trình xử lý cho mục đích này nhưng cách tốt nhất để kích hoạt thực thi trình xử lý mà không cần điều kiện, ví dụ như làm cho nó luôn hoạt động?

Một cái gì đó như thế này:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
Nếu bạn muốn một tác vụ luôn chạy, bạn nên làm cho nó một nhiệm vụ hơn là xử lý.
Jordan

@Jordan - đôi khi bạn có thể muốn có một trình xử lý được kích hoạt có điều kiện trong hầu hết các kịch bản ngoại trừ trường hợp cụ thể này.
silverdr

Câu trả lời:


61

Nếu bạn thực sự cần phải kích hoạt trình xử lý mỗi lần thì đây là hai tùy chọn:

1) chạy lệnh noop shell sẽ luôn báo cáo là đã thay đổi

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2) sử dụng gỡ lỗi cùng với change_when: để kích hoạt trình xử lý

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

Cũng cần lưu ý cho Tùy chọn 1 và Chế độ kiểm tra: Bạn có thể muốn sử dụng check_mode: nonếu sử dụng phiên bản Ansible 2.2 trở lên hoặc always_run: yesnếu sử dụng các phiên bản cũ hơn để nhiệm vụ không bị bỏ qua trong chế độ kiểm tra. Từ thử nghiệm thủ công của tôi, có vẻ như các trình xử lý vẫn ở chế độ kiểm tra, nhưng hãy cẩn thận vì trường hợp của bạn có thể khác.


7
Ngày nay, bạn có thể '--force-xử lý chạy bộ xử lý ngay cả khi một nhiệm vụ fails`
Conny

5
Vâng, mặc dù điều đó sẽ buộc tất cả các trình xử lý chạy
jarv

tôi thấy bài viết này hữu ích liên quan đến tình trạng thay đổi, dẫn tôi đến đây. máy chủfault.com/a/799282/173002 . ty.
sonjz

Cảm ơn, tôi đã sử dụng tùy chọn 2 và một changed_whenlogic có nhiều logic hơn để thực hiện một tác vụ không phải là idempotent [có thể được gọi nhiều lần trong một số trường hợp] như một trình xử lý thay vì một tác vụ.
Sammitch

17

Ansible cung cấp một số tùy chọn để buộc các trình xử lý:

1) Để luôn buộc tất cả các trình xử lý, hãy chạy ansible-playbook playbook.yml --force-handlers, như được ghi lại ở đây: https://github.com/ansible/ansible/issues/4777

2) Để buộc các trình xử lý đã được thông báo tại một điểm cụ thể trong sổ chơi, bạn có thể sử dụng tác vụ meta https://docs.ansible.com/playbooks_intro.html :

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3) Tuy nhiên, có vẻ như bạn chỉ muốn đảm bảo một dịch vụ đang chạy hoặc khởi động lại, bất kể kết quả của một nhiệm vụ khác. Trong trường hợp đó, không sử dụng trình xử lý, sử dụng tác vụ mới gọi servicemô-đun của Ansible : http://docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted

1
Vấn đề với (3) là người ta có thể có một số nhiệm vụ thông báo cho người xử lý và tôi không muốn trình xử lý chạy (khởi động lại dịch vụ) nhiều lần.
Jonathan Hartley

Nhiều tác vụ có thể thông báo cho cùng một trình xử lý và trình xử lý sẽ chỉ thực hiện một lần. Đó là toàn bộ quan điểm của người xử lý.
Jeff Widman 2/12/2015

Này Jeff. Câu trả lời này là về việc không sử dụng trình xử lý, chỉ định tất cả các hành động chỉ sử dụng các tác vụ.
Jonathan Hartley

Xin lỗi, tôi sợ tôi vẫn không hiểu trường hợp sử dụng mà bạn đang cố gắng giải quyết ... Có thể mở một câu hỏi mới với một ví dụ về những gì bạn đang cố gắng thực hiện? Nếu bạn thêm một bình luận có liên kết đến nó, tôi sẽ cố gắng trả lời nó.
Jeff Widman

Tôi không cần một câu hỏi mới. OQ đã hỏi "Làm thế nào tôi có thể đảm bảo một trình xử lý LUÔN chạy" và câu trả lời này, phần 3, gợi ý "Sử dụng các nhiệm vụ thay thế" và nhận xét của tôi chỉ ra "Nhiệm vụ của bạn sau đó có thể chạy nhiều lần trong một số trường hợp."
Jonathan Hartley

6

Khởi động lại một dịch vụ là một điều; đảm bảo nó đang chạy là cái khác Nếu bạn muốn ansiblechắc chắn nginxlà đang chạy, bạn làm điều này:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.