devoinc.systemd_service
Ansible systemd 服务角色
这是一个 Ansible 角色,创建和配置 systemd 服务单元
文件。它允许你在后台自动运行某些服务,为特定事件启用和禁用它们,管理进程组,并配置对其他单元的依赖关系。
该角色包括以下任务:
- 在
/etc/systemd/system/
下为每个systemd_service
项创建一个名为service_name.service
的 systemd 服务文件。 - 配置重要的单元、服务和安装节选项。
- 通知 systemd 存在新服务文件。重启服务。
- 如有必要,启用服务在启动时自动运行。
该角色可以在所有版本的 Ubuntu 上运行。
需求
该角色需要根权限,因此要么在播放中使用全局参数 become: yes
运行,要么在你的播放中按如下方式调用该角色:
- hosts: apps
roles:
- role: systemd-service
become: yes
角色变量
所有必要的服务可以通过 systemd_service
字典变量指定(见 defaults/main.yml
):
systemd_service: {}
对于每个服务,你需要设置 service_name
和必要的参数值。例如,要指定服务是否应在启动时启动,可以使用参数 enabled
。
systemd_service:
service_name:
enabled:
所有其他可用参数应为特定 service_name
键(作为嵌套参数)指定,以下是要设置的参数。
单元节选项
此组参数包括关于单元的常规信息。
description: # 描述单元的自由文本
接下来的两个参数配置对其他单元的依赖关系。如果服务被激活,列出的单元也将被激活。如果其中一个 requires
单元无法运行或突然失败,服务也将停止。至于 wants
列表,如果其中某个单元被停用,服务不会停止。参数可以包含多个以空格分隔的单元名称,也可以被多次指定。
requires: # 必须与服务一起启动的单元
wants: # 应该与服务一起启动的单元
要配置服务启动或停止的顺序,可以使用以下参数。请注意,如果单元之间没有顺序依赖关系,它们将同时关闭或启动。两个参数通过以空格分隔的单元列表设置。
after: # 必须在服务之后启动的单元
before: # 必须在服务之前启动的单元
服务节选项
这部分包括服务及其管理的进程的信息。参数 type
配置该服务单元的进程启动类型。
type:
它可以取的值:
simple
- 此类型假设服务会立即启动。进程不能分叉。如果其他服务与该服务有启动顺序依赖关系,请勿使用此类型。如果该服务为系统上的其他进程提供功能,则其通信通道应在守护进程启动之前安装。forking
- 假设服务启动一次,并且进程在父进程完成后分叉。此类型用于启动经典的守护进程。如果使用此模式,建议也使用pid_file
参数(见下文),以便系统能够识别守护进程的主进程。
其他值的行为类似于 simple
值,但存在一些差异:
oneshot
- 预计服务将在 systemd 启动后续单元之前退出;dbus
- 预计守护进程会在D-Bus
总线上获取名称;notify
- 守护进程在启动完成后会通过sd_notify(3)
或类似调用发送通知消息;idle
- 服务二进制文件的实际执行将在所有活动作业分派完毕后延迟。注意,此类型仅用于改善控制台输出,不作为一般单元排序工具。
设置 PID 文件的路径以使用 forking
启动类型。
pid_file: # 指向该守护进程 PID 文件的绝对文件名
你可以指定服务执行的 UNIX 用户和组。参数的值可以是单个用户或组名,或数值 ID。对于系统服务和 root 用户的用户服务,默认值为 root
,可以更改为其他值。对于其他用户的用户服务,不允许切换用户身份。因此,唯一允许的值是与用户服务管理器运行的相同用户。如果未设置组,则使用默认用户组。
user:
group:
使用以下参数设置单元的调度优先级。它取值为 -20(最高优先级)到 19(最低优先级)之间的整数。
nice: # 服务的默认 nice 等级
通过以下选项指定进程的内存不足杀手的调整级别。它取值为 -1000(禁用 OOM 杀死)到 1000(OOM 杀死为更优先)。
oom_score_adjust:
下一组参数允许你指定将根据服务状态执行的命令。参数可以多次使用,或者它们的值可以包含多个命令。多个命令行可以通过分号连接在一个指令中。要执行的命令必须是绝对路径名。它可以包含空格,但不允许控制字符。对于每个命令,第一个参数必须是可执行文件的绝对路径。空字符串将重置该参数之前指定的命令列表。
# 启动该服务时执行的命令
# 除非 `type` 为 `oneshot`,这里必须提供一个命令
exec_start:
# 在 `exec_start` 命令之前执行的命令
exec_start_pre:
# 在 `exec_start` 命令之后执行的命令
exec_start_post:
# 启动的进程通过 `exec_start` 停止时执行的命令
exec_stop:
# 服务停止后执行的命令
exec_stop_post:
# 触发服务的配置重载时执行的命令
exec_reload:
设置服务在服务进程(主服务进程或由 'exec_start_pre'、'exec_start_post'、'exec_stop'、'exec_stop_post' 或 'exec_reload' 参数指定的进程)退出、被杀死或达到超时时应重新启动的条件。restart
参数取以下值之一:
no
(默认值) - 服务将不被重新启动;on-success
- 只有当服务进程正常退出(退出码为 0,或信号 SIGHUP、SIGINT、SIGTERM 或 SIGPIPE)时,服务才会重新启动;on-failure
- 当进程以非零退出码退出,被信号终止,操作超时,以及配置的看门狗超时触发时,服务将重新启动;on-abnormal
- 当进程被信号终止,操作超时,或看门狗超时触发时,服务将重新启动;on-watchdog
- 仅当服务进程因为未捕获的信号退出且未指定为正常退出状态时,才重新启动服务;on-abort
- 仅当服务的看门狗超时到期时,才重新启动服务;always
- 服务将始终被重新启动。
# 服务必须重新启动的条件
restart:
你可以通过以下参数为上述命令指定时间延迟。它们的值可以是秒数或时间段值,例如 '5min 20s'。restart_sec
参数配置在重新启动服务(如使用 restart
配置)之前的睡眠时间。timeout_sec
选项定义等待启动/停止命令处理的时间。
restart_sec:
timeout_sec:
使用 environment
参数设置执行过程的环境变量列表。它包含以空格分隔的变量及其值。该参数可以多次使用。如果将空字符串分配给此选项,将重置环境变量的列表。如果某个值包含空格,请使用双引号进行赋值。
你还可以从文本文件中读取环境变量。为此,将 environment_file
参数的值设置为文件路径。
environment: # 以空格分隔的变量赋值列表
environment_file: # 包含环境变量的文件路径
通过下一个参数指定工作目录。在启动命令执行之前,设置为当前目录。
working_directory:
以下参数允许选择执行过程的文件描述符(STDIN、STDOUT、STDERR)应连接到哪里。standard_input
参数取值为 "null"、"tty"、"tty-force"、"tty-fail"、"socket" 或 "fd"。standard_output
参数可以等于 "inherit"、"null"、"tty"、"journal"、"syslog"、"kmsg"、"journal+console"、"syslog+console"、"kmsg+console"、"socket" 或 "fd"。standard_error
的可用值与 standard_output
相同。
standard_input:
standard_output:
standard_error:
安装节选项
此部分变量携带单元的安装信息。以下两个参数可以多次使用,或者可以指定空格分隔的单元名称列表。这些列表包含通过其 requires
和 wants
字段引用此服务的单元。
wanted_by:
required_by:
依赖关系
无
示例播放
- hosts: app
roles:
- role: systemd-service
systemd_service:
# 服务名称
railsapp:
# 在启动时启动服务
enabled: Yes
# 启动服务时执行指定参数的命令
exec_start: "/bin/bash -lc 'puma -C config/puma.rb'"
# 使用指定目录作为当前目录
working_directory: "/var/www/myapp"
# 以此用户和组运行进程
user: "deploy"
group: "deploy"
# 仅在获得干净的退出码或信号时重启服务
restart: "on-failure"
# 尽可能激活 'redis'
wants: "redis.service"
# 激活 'postgresql' 或在失败时停止工作
requires: "postgresql.service"
# multi-user.target 单元更倾向于运行该服务
wanted_by: "multi-user.target"
许可证
根据 MIT许可证 授权。