cimon-io.systemd-service
Ansible systemd 服务角色
一个创建和配置 systemd 服务单元
文件的 ansible 角色。它允许您在后台自动运行某些服务,并为特定事件启用或禁用它们,管理进程组并配置对其他单元的依赖。
该角色包括以下任务:
- 在
/etc/systemd/system/
下为每个systemd_service
项创建名为service_name.service
的 systemd 服务文件。 - 配置重要的单元、服务和安装部分选项。
- 通知 systemd 新服务文件已存在,重启服务。
- 如果必要,使服务在启动时自动运行。
需求
此角色需要根访问权限,因此可以在播放本中使用全局的 become: yes
参数运行,或像下面这样在播放本中调用该角色:
- hosts: apps
roles:
- role: systemd_service
become: yes
角色变量
所有必要的服务可以通过 systemd_service
字典变量指定(见 defaults/main.yml
):
systemd_service: {}
对于每个服务,您需要设置 service_name
和必要的参数值。例如,指定服务是否应在启动时运行,可以使用参数 enabled
。
systemd_service:
service:
service_name:
enabled:
所有已为特定 service_name
键(作为嵌套参数)提供的可用参数如下所示。
单元部分选项
这一组参数包括有关单元的一般信息。
description: # 描述单元的自由文本字符串
接下来的两个参数配置对其他单元的依赖关系。如果服务被激活,列出的单元也将被激活。如果其中一个 requires
单元无法运行或突然失败,服务也会停止。对于 wants
列表,如果其中某个单元被停用,服务不会停止。参数可以由多个以空格分隔的单元名称组成。它们也可以被指定多次。
requires: # 必须与服务一起启动的单元
wants: # 应与服务一起启动的单元
要配置服务启动或停止的顺序,可以使用以下参数。请注意,如果单元之间没有顺序依赖关系,它们将同时关闭或启动。两个参数由以空格分隔的单元列表设置。
after: # 服务后必须启动的单元
before: # 服务前必须启动的单元
服务部分选项
该部分包含有关服务及其监督的进程的信息。type
参数配置此服务单元的进程启动类型。
type:
可以取以下值:
simple
- 该类型假定服务将立即启动。进程不得分叉。如果其他服务对该服务启动有顺序依赖,切勿使用此类型。如果该服务向系统中的其他进程提供功能,则其通信通道应在守护进程启动之前安装。forking
- 假定服务仅启动一次,进程在父进程完成后分叉。此类型用于启动经典守护进程。如果使用此模式,建议也使用pid_file
参数(见下文),以便 systemd 可以识别守护进程的主进程。
其他值的行为与简单值类似。然而,它们有一些区别:
oneshot
- 服务预计在系统d启动后续单元之前退出;dbus
- 预计守护进程在D-Bus
总线上获取名称;notify
- 守护进程发送通知消息,通过sd_notify(3)
或类似调用,当它完成启动时;idle
- 服务二进制文件的实际执行被延迟,直到所有活动作业被调度。请注意,此类型仅对改进控制台输出有用,并不作为一般单元排序工具。
设置 PID 文件的路径以使用 forking
启动类型。
pid_file: # 一个绝对文件名,指向此守护进程的PID文件
您可以指定服务应该在其下执行的 UNIX 用户和组。参数可以取单个用户或组名,或一个数字 ID 作为值。对于系统服务和根用户的用户服务,默认值为 root
,可以切换到另一个用户。对于任何其他用户的用户服务,不允许切换用户身份。因此,唯一允许的值是用户服务管理器正在运行的相同用户。如果未设置组,则使用默认用户组。
user:
group:
用下一个参数设置单元的调度优先级。它取值为 -20(最高优先级)到 19(最低优先级)之间的整数。
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
参数配置在重启(如配置)服务之前的睡眠时间。timeout_sec
选项定义等待启动/停止命令处理的时间。
restart_sec:
timeout_sec:
使用 environment
参数为执行的进程设置环境变量列表。它包括变量及其值的字典。如果某个值包含空格,请使用双引号进行赋值。
您还可以从文本文件读取环境变量。为此,请将 environment_file
参数值设置为文件路径。
environment: # 包含ENV变量的字典
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:
如果对任何 "standard_*" 参数指定 "tty"、"tty-force" 或 "tty-fail",那么您可以指定 tty 的路径。
tty_path:
如果服务在创建或修改后应处于重新启动/重新加载/启动/停止状态。
state:
它可以取值:restarted
(默认)reloaded
started
stopped
安装部分选项
此部分变量承载单元的安装信息。可以多次使用以下两个参数,或指定以空格分隔的单元名称列表。列表包括从 requires
和 wants
字段引用此服务的单元。
wanted_by:
required_by:
依赖
无
示例播放本
- hosts: app
roles:
- role: systemd_service
systemd_service:
# 默认服务名称
railsapp:
# 服务名称
service_name: railsapp
# 在启动时启动服务
enabled: Yes
# 启动服务时执行带有指定参数的命令
exec_start: "/bin/bash -lc 'puma -C config/puma.rb'"
# 使用指定目录作为当前目录
working_directory: "/var/www/myapp"
# 指定环境变量
environment: {ENVVAR: value}
# 使用此用户和组运行进程
user: "deploy"
group: "deploy"
# 仅在未获得干净的退出代码或信号时重启服务
restart: "on-failure"
# 尝试在可能的情况下激活 'redis'
wants: "redis.service"
# 激活 'postgresql' 或在失败的情况下停止工作
requires: "postgresql.service"
# 多用户目标单元更倾向于运行此服务
wanted_by: "multi-user.target"
许可
根据 MIT 许可 许可。