Ansible Systemd 的管理確認

介紹如何用 ansible 管理 systemd 及確認 service 是否有成功運行及開機自動帶起。

Kiwi lee
5 min readMay 24, 2022

--

主要參考這篇,然後加上自己寫的確認 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 所啟動的服務狀態

ansible.builtin.service_facts module — Return service state information as fact data — Ansible Documentation

上圖是透過 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']}}"

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Kiwi lee
Kiwi lee

Written by Kiwi lee

Hi, I'm kiwi, Platform Engineer (SRE, DevOps). Python Engineer. Love art, books, longboard. https://kiwi-walk.com

No responses yet

Write a response