2015-05-19 34 views
19

Tôi có một Playbook Ansible để triển khai một ứng dụng Java như một init.d daemon hay không.Kiểm tra xem dịch vụ có tồn tại với Ansible

Là người mới bắt đầu trong cả Ansible và Linux Tôi gặp sự cố khi thực thi các tác vụ có điều kiện trên máy chủ dựa trên trạng thái của máy chủ.

Cụ thể tôi có một số máy chủ có dịch vụ đã có mặt và đang chạy nơi tôi muốn dừng dịch vụ trước khi thực hiện bất kỳ điều gì khác. Và sau đó có thể có máy chủ mới, chưa có dịch vụ. Vì vậy, tôi không thể chỉ đơn giản sử dụng service: name={{service_name}} state=stopped, bởi vì điều này sẽ không thành công trên máy chủ lưu trữ mới.

Tôi làm cách nào để đạt được điều này? Dưới đây là những gì tôi có cho đến thời điểm này:

- name: Check if Service Exists 
    shell: "if chkconfig --list | grep -q my_service; then echo true; else echo false; fi;" 
    register: service_exists 

# This should only execute on hosts where the service is present 
    - name: Stop Service 
    service: name={{service_name}} state=stopped 
    when: service_exists 
    register: service_stopped 

# This too 
    - name: Remove Old App Folder 
    command: rm -rf {{app_target_folder}} 
    when: service_exists 

# This should be executed on all hosts, but only after the service has stopped, if it was present 
    - name: Unpack App Archive 
    unarchive: src=../target/{{app_tar_name}} dest=/opt 

Trả lời

22

Tất nhiên tôi cũng có thể kiểm tra xem tập lệnh trình bao bọc có tồn tại trong /etc/init.d hay không. Vì vậy, đây là những gì tôi đã kết thúc với:

- name: Check if Service Exists 
    stat: path=/etc/init.d/{{service_name}} 
    register: service_status 

    - name: Stop Service 
    service: name={{service_name}} state=stopped 
    when: service_status.stat.exists 
    register: service_stopped 
+0

bạn cũng có thể sử dụng' ignore_errors', đặc biệt là với các đăng ký, để Det ect này. – tedder42

+1

Vâng, tôi đã tránh xa những kẻ bỏ qua, bởi vì tôi sợ những âm bản sai lầm do lỗi chính tả và như vậy. Ngoài ra, tôi đang cố gắng thuyết phục nhóm của mình đầu tư vào việc tự động hóa việc quản lý cấu hình của chúng tôi và không muốn điều đầu tiên hiển thị chúng giống như một loại hack nào đó. :) – EagleBeak

+0

giải pháp cũng hoạt động trên ubuntu, và có lẽ nên làm việc trên hầu hết các bản phân phối Linux. –

6

Sẽ tốt hơn nếu mô-đun "dịch vụ" có thể xử lý lỗi "dịch vụ không được công nhận".

Đây là cách tiếp cận của tôi, sử dụng lệnh service thay vì kiểm tra cho một kịch bản init:

- name: check for apache 
    shell: "service apache2 status" 
    register: _svc_apache 
    failed_when: > 
    _svc_apache.rc != 0 and ("unrecognized service" not in _svc_apache.stderr) 

- name: disable apache 
    service: name=apache2 state=stopped enabled=no 
    when: "_svc_apache.rc == 0" 
  • kiểm tra mã lối ra của "tình trạng dịch vụ" và chấp nhận mã exit 0 khi đầu ra chứa " không được công nhận dịch vụ"
  • nếu mã lối ra là 0, dịch vụ được cài đặt (dừng hoặc chạy)
Các vấn đề liên quan