Ansible Systemd 的管理確認
主要參考這篇,然後加上自己寫的確認 service 狀態
Ansible 幫我們封裝了很多,所以基本上我們只需要修改 state
就可以達到啟動、關閉、重載、重啟。
官方相關文件
1. 原生的 systemctl
Ubuntu Manpage: systemctl — 控制 systemd 系統與服務管理器
- start:啟動
- stop:關閉
- restart:重啟服務,即關閉後,再啟動
- reload:在不關閉服務下,重載設定檔
- enable/disable:開機時,是否會自動帶啟
- status:執行狀態
2. Ansible 的 systemd 元件
ansible.builtin.systemd module — Manage systemd units — Ansible Documentation
操作
啟動服務
state: started
(如果原本就是啟動,就不會再啟動)
---
- name: Start a service with systemd
systemd:
name: apache2
state: started
關閉服務
state: stopped
(如果原本就是關閉,就不會再關閉)
- name: Stop service cron on debian, if running
ansible.builtin.systemd:
name: cron
state: stopped
重載服務
state: reloaded
重新載入 service 的相關設定檔,不會重啟服務
- name: Reload service httpd, in all cases
ansible.builtin.systemd:
name: httpd.service
state: reloaded
重啟服務
state: restarted
建議先 daemon_reload
將 systemd 相關的配置重新載入
- name: Restart service cron on centos, in all cases, also issue daemon-reload to pick up config changes
ansible.builtin.systemd:
state: restarted
daemon_reload: yes
name: crond
開機是否帶啟
調整 enabled
,並至少要寫 state
- name: Enable a timer unit for dnf-automatic
ansible.builtin.systemd:
name: dnf-automatic.timer
state: started
enabled: yes
>> reload 跟 daemon-reload 的差別
reload 只會載入該服務的設定檔,像是 nginx
,會在 /lib/systemd/system/nginx.service
daemon-reload 則像是 systemd 自己的設定檔重新載入,該指令會 reload 所有服務的設定檔,建立服務的依賴樹。常用在服務新增刪除,或納入開機程序。
daemon-reload
Reload systemd manager configuration. This will rerun all generators (see systemd.generator(7)), reload all unit files, and recreate the entire dependency tree. While the daemon is being reloaded, all sockets systemd listens on behalf of user configuration will stay accessible.
This command should not be confused with the reload command.
reference: Ubuntu Manpage: systemctl — 控制 systemd 系統與服務管理器
確認執行
這邊是透過 service_facts
來做狀態的收集,可收集 systemd, sysv, upstart, AIX SRC 所啟動的服務狀態

上圖是透過 service_facts
拿到的 return value。
下面的第一步驟,我們會先收集 service 狀態
第二步驟,我們透過 assert
來檢查服務狀態
- 服務是否有登記
- 服務是否正在運行
- 服務是否有開機自動帶啟
- name: check service status
block:
- name: Populate service
service_facts:
- name: Assert service is running
assert:
that:
- "{{ service_name in ansible_facts.services }}"
- "{{ 'running' ==ansible_facts.services[service_name]['state']}}"
- "{{ 'enables' ==ansible_facts.services[service_name]['status']}}"