Nhiệm vụ có thể xác nhận nếu một tiến trình đang chạy


9

Ansible 2.1

Trong playbook, tôi bắt đầu một quá trình:

- name: Start Automation Agent, and enable start on boot
  service: name=mongodb-mms-automation-agent state=started enabled=yes

Từ chơi tóm tắt, có vẻ như quá trình đã bắt đầu thành công.

TASK [install : Start automation agent, and enable start on boot] **************
changed: [server1]

Tuy nhiên, khi đăng nhập vào máy chủ từ xa và thực hiện a ps, quá trình không chạy. Kiểm tra nhật ký quá trình, nó đã thất bại một số điều kiện tiên quyết (dự định).

Làm cách nào để viết một tác vụ trong sổ chơi để xác nhận quá trình đã bắt đầu thành công?

Câu trả lời:


11

Bạn có thể kiểm tra với failedbộ lọc Jinja2 sau khi chạy lệnh để kiểm tra xem quy trình có đang chạy hay không.

Dưới đây là một ví dụ sử dụng đầu ra của lệnh systemctl status apache2để quyết định xem Apache có đang chạy hay không:

- name: Check if Apache is running
  command: systemctl status apache2
  ignore_errors: yes
  changed_when: false
  register: service_apache_status

- name: Report status of Apache
  fail:
    msg: |
      Service apache2 is not running.
      Output of `systemctl status apache2`:
      {{ service_apache_status.stdout }}
      {{ service_apache_status.stderr }}
  when: service_apache_status | failed

Nếu lệnh của nhiệm vụ đầu tiên thất bại, nhiệm vụ thứ hai sẽ thất bại và cho thấy tại sao nhiệm vụ đầu tiên thất bại.
Mã trả lại được lưu trữ trong service_apache_status.rc.

Ví dụ đầu ra của một thất bại:

TASK: [Check if Apache is running] *********************** 
failed: [localhost] => {"changed": false, "cmd": ["systemctl", "status", "apache2"], "delta": "0:00:00.009379", "end": "2016-06-06 15:17:27.827172", "rc": 3, "start": "2016-06-06 15:17:27.817793", "stdout_lines": ["* apache2.service", "   Loaded: not-found (Reason: No such file or directory)", "   Active: inactive (dead)"], "warnings": []}
stdout: * apache2.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
...ignoring

TASK: [Report status of Apache] ***************************
failed: [localhost] => {"failed": true}
msg: apache2 is not running
systemctl status apache2 output:
* apache2.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

Đây là cách khác nhau (mặc dù có thể kém tin cậy hơn), bằng cách sử dụng pgrep, để kiểm tra xem quy trình có đang chạy hay không:

- name: Check if Apache is running
  shell: pgrep apache2
  ignore_errors: yes
  changed_when: false
  register: service_apache_status

- name: Report status of Apache
  fail:
    msg: |
      Service apache2 is not running.
      Return code from `pgrep`:
      {{ service_apache_status.rc }}
  when: service_apache_status.rc != 0

Làm thế nào để when: service_apache_status | failedlàm việc? Nó tìm kiếm một failedmã thông báo trong service_apache_status?
Howard Lee

2
@HowardLee: Tôi tin rằng nó sẽ kiểm tra mã trả lại và nếu không 0, nó sẽ được xem xét failed.
Deltik

1
thay vì ps | grep bạn có thể thửpgrep apache2
madeddie

@madeddie: Tôi thích nó. Trả lời cập nhật để đề xuất pgrep!
Deltik

4

Đây là những gì tôi làm bây giờ:

- name: Confirm Automation Agent is running
  command: service mongodb-mms-automation-agent status
  register: agent_status
  failed_when: "'NOT' in agent_status.stdout"
  changed_when: False

failed_whenđược giới thiệu trong 1.4. changed_when: Falseđược sử dụng để ngăn chặn tình trạng thay đổi. Đọc thêm .

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.