0x0i.systemd
Ansible 角色 :vertical_traffic_light: Systemd
目录
这个 Ansible 角色用于安装和配置 Systemd 单元:由 Linux systemd
系统/服务管理器管理的系统组件和服务。
支持的平台:
* Debian
* Redhat(CentOS/Fedora)
* Ubuntu
要求
systemd
通常被视为 Linux 发行版的事实上的服务管理工具,应该包含在大多数操作系统安装中。虽然通常不是问题,但值得注意的是,systemd
需要 Linux 内核 >= 3.13 且 Linux 内核 >= 4.2 需要支持统一 cgroup 层次结构。
请参考 systemd 的 README 获取更多详细信息。
角色变量
变量可用,并根据以下软件和机器配置阶段进行组织:
- 安装
- 配置
- 启动
安装
[unit_config: <config-list-entry>:] path:
(默认: /etc/systemd/system
)
加载 systemd 单元配置的路径。
除了 /etc/systemd/system(默认),单元配置和相关的 ".d" 目录覆盖可以放在
/usr/lib/systemd/system
或/run/systemd/system
目录中。/etc 中的文件具有优先权,其次是 /run,最后是 /usr/lib。在任何这些目录下的覆盖文件优先于位于任何地方的单元文件。不同名称的多个覆盖文件会按字母顺序应用,不论它们位于哪个目录。请参阅下表,并查阅 systemd(1) 以获取关于路径加载优先级的更多详细信息。
在 system 模式 (--system)下加载路径
单元加载文件路径 | 描述 |
---|---|
/etc/systemd/system | 本地配置 |
/run/systemd/system | 运行时单元 |
/usr/local/lib/systemd/system | 为本地系统管理安装的单元 |
/usr/lib/systemd/system | 安装包的单元 |
在 用户模式 (--user)下加载路径
单元加载文件路径 | 描述 |
---|---|
$XDG_CONFIG_HOME/systemd/user 或 $HOME/.config/systemd/user | 用户配置 ($XDG_CONFIG_HOME 如果设置则使用,否则使用 ~/.config) |
/etc/systemd/user | 管理员创建的用户单元 |
$XDG_RUNTIME_DIR/systemd/user | 运行时单元(仅在 $XDG_RUNTIME_DIR 设置时使用) |
/run/systemd/user | 运行时单元 |
$dir/systemd/user 对于 $XDG_DATA_DIRS 中的每个 $dir | 为安装的用户单元提供的附加位置,针对 $XDG_DATA_DIRS 中的每个条目 |
/usr/local/lib/systemd/user | 为本地系统管理安装的用户单元 |
/usr/lib/systemd/user | 由发行版包管理器安装的用户单元 |
示例
unit_config:
- name: apache
path: /run/systemd/system
Service:
ExecStart: /usr/sbin/httpd
ExecReload: /usr/sbin/httpd $OPTIONS -k graceful
Install:
WantedBy: multi-user.target
[unit_config: <config-list-entry>:] type: <string>
(默认: service
)
- 要配置的 systemd 单元的类型。目前有 11 种不同的单元类型,从守护进程及其组成的进程到路径修改触发器。请参阅 systemd(1) 以获取可用单元的完整列表。
示例
unit_config:
- name: apache
type: socket
Socket:
ListenStream: 0.0.0.0:8080
Accept: yes
Install:
WantedBy: sockets.target
配置
systemd
单元的配置在 ini 风格 的配置文件中声明。systemd
单元 INI 配置由部分组成:所有单元类型共有的 2 个部分(Unit
和 Install
)以及每个单元类型特有的 1 个部分。这些单元配置可以在角色的 unit_config
哈希变量中以字典列表的形式表达,包含代表单元名称、类型、加载路径和前面提到的部分定义的键值对。
每个配置部分定义提供一个字典,其中包含对应部分选项的一组键值对(例如,系统或 Web 服务的 [Service]
部分的 ExecStart
规范或 Web [Socket]
部分的 ListenStream
选项)。
[unit_config: <list-entry>:] Unit | <unit-type 例如 Service, Socket, Device 或 Mount> | Install: <dict>
(默认: {})
- 单元配置的部分定义
任何由相应的 Systemd 单元类型规范支持的配置设置/值键对,都应能够在每个 unit_config
集合中表达,且在相关的 INI 配置中正确呈现。
_以下提供了每种单元类型的概述和示例配置以供参考_。
[Service]
管理守护进程及其组成的进程。
示例
unit_config:
# path: /etc/systemd/system/example-service.service
- name: example-service
Unit:
Description: Sleepy service
Service:
ExecStart: /usr/bin/sleep infinity
Install:
WantedBy: multi-user.target
[Socket]
封装系统内的本地 IPC 或网络套接字。
示例
unit_config:
- name: docker
type: socket
Unit:
Description: Listens/accepts connection requests at /var/run/docker/sock (implicitly *Requires=* associated docker.service)
Socket:
ListenStream: /var/run/docker.sock
SocketMode: 0660
SockerUser: root
SocketGroup: docker
Install:
WantedBy: sockets.target
[Mount]
控制系统中的挂载点。
示例
unit_config:
- name: tmp_new
type: mount
Unit:
Description: New Temporary Directory (/tmp_new)
Conflicts: umount.target
Before: local-fs.target umount.target
After: swap.target
Mount:
What: tmpfs
Where: /tmp_new
Type: tmpfs
Options: mode=1777,strictatime,nosuid,nodev
提供按需挂载文件系统的自动挂载功能,以及并行启动。
示例
unit_config:
- name: proc-sys-fs-binfmt_misc
type: automount
Unit:
Description: Arbitrary Executable File Formats File System Automount Point
Documentation: https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html
ConditionPathExists: /proc/sys/fs/binfmt_misc/
ConditionPathIsReadWrite: /proc/sys/
Automount:
Where: /proc/sys/fs/binfmt_misc
[Device]
暴露内核设备并实现基于设备的激活。
这种单元类型没有特定选项,因此没有单独的 [Device]
部分。通用配置项在通用的 [Unit]
和 [Install]
部分中配置。systemd
会为所有标记为 "systemd" udev 标签的内核设备动态创建设备单元(默认情况下是所有块设备和网络设备,以及其他一些设备)。要标记一个 udev 设备,请在 udev 规则文件中使用 TAG+="systemd。还要注意,设备单元的命名与它们控制的 /sys 和 /dev 路径相对应。
示例
# /usr/lib/udev/rules.d/10-nvidia.rules
SUBSYSTEM=="pci", ATTRS{vendor}=="0x12d2", ATTRS{class}=="0x030000", TAG+="systemd", ENV{SYSTEMD_WANTS}="nvidia-fallback.service"
# 这将导致自动生成一个 nvidia-fallback.device 文件,并设置适当的 [Unit] 和 [Install] 部分
[Target]
提供单元组织能力,并在启动期间设置众所周知的同步点。
这种单元类型没有特定选项,因此没有单独的 [Target]
部分。通用配置项在通用的 [Unit]
和 [Install]
部分中配置。
示例
unit_config:
- name: graphical
path: /usr/lib/systemd/system/graphical.target
type: target
Unit:
Description: Graphical Interface
Documentation: man:systemd.special(7)
Requires: multi-user.target
Wants: display-manager.service
Conflicts: rescue.service rescue.target
After: multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate: yes
[Timer]
根据定时器触发其他单元的激活。
示例
unit_config:
- name: dnf-makecache
type: timer
Timer:
OnBootSec: 10min
OnUnitInactiveSec: 1h
Unit: dnf-makecache.service
Install:
WantedBy: multi-user.target
[Swap]
封装操作系统的内存交换分区或文件。
示例
# 确保交换文件存在
mkdir -p /var/vm
fallocate -l 1024m /var/vm/swapfile
chmod 600 /var/vm/swapfile
mkswap /var/vm/swapfile
------------------------------------
unit_config:
- name: var-vm-swap
type: swap
Unit:
Description=Turn on swap for /var/vm/swapfile
Swap:
What: /var/vm/swapfile
Install:
WantedBy: multi-user.target
[Path]
在文件系统对象发生变化或被修改时激活其他服务。
示例
unit_config:
- name: Repository Code Coverage Analysis trigger
type: path
Unit:
Description: Activate code coverage analysis on modified git repositories
Path:
PathChanged: /path/to/git/repo
Unit: code-coverage-analysis
[Scope]
管理一组系统或远程进程。
Scope 单元不是通过单元配置文件配置的,而是仅通过 systemd 的总线接口以编程方式创建。 与服务单元不同,Scope 单元管理外部创建的进程,不会自己启动进程。Scope 单元的主要目的是将系统服务的工作进程进行分组,以便组织和管理资源。
示例
# *此配置是为一个瞬态单元文件,使用 systemd API 编程创建。请勿复制或编辑。*
unit_config:
- name: user-session
type: scope
Unit:
Description: Session of user
Wants: [email protected]
Wants: [email protected]
After: systemd-logind.service systemd-user-sessions.service [email protected] [email protected]
RequiresMountsFor: /home/user
Scope:
Slice: user-1000.slice
Scope:
SendSIGHUP=yes
TasksMax=infinity
[Slice]
在层次树中分组和管理系统进程,以便进行资源管理。
切片的名称编码了在树中的位置。名称由用短划线分隔的一系列名称组成,描述切片从根切片开始的路径。默认情况下,服务和范围单元被放置在 system.slice 中,与 systemd-machined(1) 注册的虚拟机和容器被放置在 machine.slice 中,用户会话由 systemd-logind(1) 处理则在 user.slice 中。
有关更多详细信息,请参阅 systemd.slice(5)。
[Drop-in]
提供单元的覆盖功能。
示例
unit_config:
- name: override.conf
type: conf
path: "/lib/systemd/system/[email protected]"
Service:
ExecStart:
- ""
- "-/sbin/agetty -a muru --noclear %I $TERM"
EnvironmentFile=/path/to/some/file
启动
[unit_config: <config-list-entry>:] enabled:
(默认: no
)
- 服务是否应该在启动时启动
[unit_config: <config-list-entry>:] state:
(默认: stopped
)
- 单元激活状态
依赖关系
无
示例剧本
默认示例(未指定自定义单元配置):
- hosts: all
roles:
- role: 0x0I.systemd
服务/套接字/挂载对:
- hosts: webservers
roles:
- role: 0x0i.systemd
vars:
unit_config:
- name: "my-service"
Unit:
After: network-online.target
Wants: network-online.target
Requires: my-service.socket
Service:
User: 'web'
Group: 'web'
ExecStart: '/usr/local/bin/my_service $ARGS'
ExecReload: '/bin/kill -s HUP $MAINPID'
Install:
WantedBy: 'multi-user.target'
- name: "my-service"
type: "socket"
Socket:
ListenStream: '0.0.0.0:4321'
Accept: 'true'
Install:
WantedBy: 'sockets.target'
- name: "var-data-my_service"
type: "mount"
path: "/run/systemd/system"
Mount:
What: '/dev/nvme0'
Where: '/var/data/my_service'
Install:
WantedBy: 'multi-user.target'
许可证
MIT
作者信息
此角色由 O1.IO 于 2019 年创建。