1. 概述
systemd 是 Linux 系统中现代的系统和服务管理器,负责初始化用户空间并管理服务的生命周期。而 Ansible 是一个广泛使用的开源自动化工具,适用于应用部署、配置管理和基础设施编排。
本文将介绍如何使用 Ansible 控制 systemd 服务。我们将演示如何启动和停止一个简单的 systemd 服务。示例中使用的 Ansible 版本为 2.12.0。
2. 示例服务
本节将介绍我们即将使用的 systemd 服务。它是一个简单的 shell 脚本,并通过 systemd 单元文件运行。
2.1. 服务脚本
我们将使用以下脚本 simple_service.sh,内容如下:
$ cat simple_service.sh
#!/bin/bash
while true
do
sleep 1
done
该脚本在一个无限的 while
循环中调用 sleep 1
命令,持续运行。
2.2. 单元文件
我们使用以下单元文件 simple_service.service 来注册该脚本为 systemd 服务:
$ cat simple_service.service
[Unit]
Description=Simple Service
[Service]
ExecStart=/home/baeldung/work/systemd-ansible/simple_service.sh
[Install]
WantedBy=multi-user.target
✅ 说明:
ExecStart
指定 systemd 启动服务时运行的可执行文件路径,这里是 simple_service.sh。WantedBy=multi-user.target
表示服务在系统进入多用户模式时启动。
3. 使用 Ansible 控制服务
本节将使用 Ansible 启动并启用我们之前定义的 systemd 服务。
使用 Ansible 控制 systemd 服务有以下优势:
- ✅ 幂等性:Ansible 会检查服务当前状态,仅在需要时执行操作,避免重复启动。
- ✅ 集中管理:一个 playbook 即可控制多个主机上的多个服务,管理更高效。
3.1. Playbook 文件
我们使用以下 playbook 文件 playbook_systemd.yml:
$ cat playbook_systemd.yml
---
- name: Ansible enable service
hosts: localhost
tasks:
- name: Create unit file link
file:
state: link
src: /home/baeldung/work/systemd-ansible/simple_service.service
dest: /etc/systemd/system/simple_service.service
- name: Enable and start the service
systemd:
name: simple_service
enabled: true
state: started
✅ 说明:
- 第一个任务使用
file
模块创建指向单元文件的符号链接。 - 第二个任务使用
systemd
模块启用并启动服务。
3.2. Inventory 文件
我们使用以下本地 inventory 文件:
$ cat inventory
localhost ansible_connection=local
仅在本地测试即可满足需求。
3.3. 使用 file
模块
file
模块用于管理文件属性。其常用参数如下:
state: link
:表示创建符号链接src
:源文件路径dest
:链接路径(通常位于/etc/systemd/system/
)
⚠️ 注意:该目录是 systemctl enable
命令默认写入的位置。
3.4. 使用 systemd
模块
systemd
模块用于管理 systemd 单元(如服务、定时器、套接字等)。其关键参数如下:
name
:服务名称(默认带.service
扩展)enabled
:是否开机自启(布尔值)state
:服务当前状态(如started
,stopped
)
⚠️ 注意:在 Ansible 较新版本中,此模块已更名为 systemd_service
,但 systemd
仍保留为别名。
其他常用参数:
daemon_reload
:重载 systemd 配置(如服务文件变更后需设置为true
)masked
:是否屏蔽服务(屏蔽后无法启动)
3.5. 运行 Playbook
使用以下命令运行 playbook:
$ sudo ansible-playbook playbook_systemd.yml -i inventory
输出如下:
PLAY [Ansible enable service] **************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create unit file link] ***************************************************
changed: [localhost]
TASK [Enable and start the service] ********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
✅ 说明:
- 符号链接已创建
- 服务已启用并启动
3.6. 验证服务状态
验证符号链接是否存在:
$ ls -l /etc/systemd/system/simple_service.service
lrwxrwxrwx 1 root root 56 Jul 18 05:51 /etc/systemd/system/simple_service.service -> /home/baeldung/work/systemd-ansible/simple_service.service
验证服务运行状态:
$ systemctl status simple_service
● simple_service.service - Simple Service
Loaded: loaded (/etc/systemd/system/simple_service.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2025-07-18 05:51:18 EDT; 10min ago
Main PID: 3084 (simple_service.)
Tasks: 2 (limit: 4601)
Memory: 560.0K
CPU: 2.502s
CGroup: /system.slice/simple_service.service
├─3084 /bin/bash /home/baeldung/work/systemd-ansible/simple_service.sh
└─4284 sleep 1
Jul 18 05:51:18 ubuntu-2204 systemd[1]: Started Simple Service.
服务状态正常,且支持多次运行 playbook(幂等性)。
3.7. 停止服务
要停止并禁用服务,使用以下任务:
- name: Disable and stop the service
systemd:
name: simple_service
enabled: false
state: stopped
✅ 说明:
enabled: false
:禁用开机自启(同时会自动删除符号链接)state: stopped
:立即停止服务
4. 总结
本文介绍了如何使用 Ansible 控制 systemd 服务:
- ✅ 使用
file
模块创建符号链接,将服务单元文件链接到/etc/systemd/system/
- ✅ 使用
systemd
模块启用并启动服务 - ✅ 使用
systemd
模块停用并停止服务 - ✅ 支持多次运行 playbook(幂等性)
使用 Ansible 管理 systemd 服务,不仅操作简洁,还能确保配置一致性,适合自动化运维场景。