devoinc.systemd_service

Ansible systemd 服务角色

这是一个 Ansible 角色,创建和配置 systemd 服务单元 文件。它允许你在后台自动运行某些服务,为特定事件启用和禁用它们,管理进程组,并配置对其他单元的依赖关系。

该角色包括以下任务:

  1. /etc/systemd/system/ 下为每个 systemd_service 项创建一个名为 service_name.service 的 systemd 服务文件。
  2. 配置重要的单元、服务和安装节选项。
  3. 通知 systemd 存在新服务文件。重启服务。
  4. 如有必要,启用服务在启动时自动运行。

该角色可以在所有版本的 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:

安装节选项

此部分变量携带单元的安装信息。以下两个参数可以多次使用,或者可以指定空格分隔的单元名称列表。这些列表包含通过其 requireswants 字段引用此服务的单元。

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许可证 授权。

关于项目

Create and configure a systemd service

安装
ansible-galaxy install devoinc.systemd_service
许可证
Unknown
下载
53.6k
拥有者
Data. Evolved