Ansible:僅在服務正在執行時重新啟動服務

Ansible:僅在服務正在執行時重新啟動服務

在 Ansible 劇本中,我想在更新設定檔後重新啟動服務,但前提是它是已經運行

我不想用 ansible 控制服務的狀態,只有在之前啟動過的情況下才重新啟動它。

我可以為此使用自訂命令,但它不能像 ansible 的服務模組那樣在不同的服務管理系統(upstart/systemd/sysvinit/openrc...)之間移植。

感謝您的任何提示。

答案1

當配置更新時註冊一個變數。當您檢查服務是否正在運行時註冊另一個變數。僅當兩個變數都為 true 時才呼叫服務重新啟動處理程序。

至於各種作業系統的細節,您可以根據主機事實的系列/分佈進行條件執行。

答案2

Ansible 的service:模組不提供檢查服務是否已在運作的機制。因此,您必須透過shell:模組使用類似的方法來先確定服務是否正在運行。

例子

這裡我會偵測WebSphere或Tomcat8是否正在執行,然後根據其狀態重新啟動對應的服務。

---
# handles tomcat8
- name: is tomcat8 already running?
  shell: service tomcat8 status warn=false
  register: _svc_tomcat8
  failed_when: _svc_tomcat8.rc != 0 and ("unrecognized service" not in _svc_tomcat8.stderr)
  ignore_errors: true

- name: restart tomcat8 if running
  service: name=tomcat8 state=restarted
  when: "_svc_tomcat8.rc == 0"

# handles WAS
- name: is WebSphere already running?
  shell: service Node01_was.init status warn=false
  register: _svc_websphere
  failed_when: _svc_websphere.rc != 0 and ("unrecognized service" not in _svc_websphere.stderr)
  ignore_errors: true

- name: restart WebSphere if running
  service: name=Node01_was.init state=restarted
  when: "_svc_websphere.rc == 0"

# vim:ft=ansible:

若要僅在特定檔案已更新時呼叫重新啟動,您可以register:在您的copy:template:任務上使用 來儲存檔案是否已更新的狀態。然後可以將其結果register:合併為when:任務的一部分service: name=XXXX state=restarted

答案3

現在您可以使用內建service_facts模組首先檢查服務狀態。然後您可以根據服務狀態新增條件。

這是我的範例,它被設定為由其他任務通知。


- name: check service status
  service_facts:
  listen:
    - restart sidekiq

- name: restart sidekiq
  service:
    name: sidekiq
    state: restarted
  become: yes
  when: ansible_facts.services['sidekiq.service']['state'] == 'running'

相關內容