![Ansible:僅在服務正在執行時重新啟動服務](https://rvso.com/image/652678/Ansible%EF%BC%9A%E5%83%85%E5%9C%A8%E6%9C%8D%E5%8B%99%E6%AD%A3%E5%9C%A8%E5%9F%B7%E8%A1%8C%E6%99%82%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95%E6%9C%8D%E5%8B%99.png)
在 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'