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 服务,不仅操作简洁,还能确保配置一致性,适合自动化运维场景。


原始标题:How to Control systemd With Ansible

« 上一篇: FoundationDB 指南
» 下一篇: OpenNMS 入门指南