linux-system-roles.kernel_settings
内核设置角色
这个角色用于修改内核设置。例如,在 Linux 上,设置位于 /proc/sys
(使用 sysctl
)、/sys/fs
和其他一些设置。它在企业 Linux 及其衍生系统(如 RHEL 和 CentOS)以及 Fedora 中使用 tuned
作为默认提供者。
tuned
首页 - https://github.com/redhat-performance/tuned
需求
见下文
集合要求
如果您想使用此角色管理 rpm-ostree
系统,您需要安装附加的集合。请运行以下命令安装集合。
ansible-galaxy collection install -vv -r meta/collection-requirements.yml
角色变量
某些 kernel_settings_GROUP
参数的值是 dict
对象的 list
。每个 dict
有以下键:
name
- 通常需要 - 设置的名称,或/sys
下的文件名(对于sysfs
组)。使用replaced
时省略name
。value
- 通常需要 - 设置的值。使用state
或previous
时省略value
。值不能是 YAML 布尔类型。一个可能的问题是使用value: on
或其他 YAML 布尔类型的值。您必须将这些值用引号括起来,或作为str
类型的值传递,例如value: "on"
。state
- 可选 - 值absent
表示从组中移除名称为name
的设置 - 必须提供name
。previous
- 可选 - 唯一值是replaced
- 用于指定组中的先前值应替换为给定值。
kernel_settings_sysctl
要使用 sysctl
应用的设置的 list
。
设置的格式如上所述。请注意,设置是 累加的 - 默认情况下,每个设置都将添加到现有设置中,如果同名设置已存在则替换之。如果要移除特定设置,请使用 state: absent
而不是给出 value
。如果要移除所有现有的 sysctl
设置并用给定的设置替换它们,请在列表中指定 previous: replaced
作为其中的一个值。如果要移除所有的 sysctl
设置,请将 dict
值 {"state": "empty"}
作为参数的唯一值,而不是 list
。请参见下文的示例。
kernel_settings_sysfs
要应用于 /sys
的设置的 list
。设置的格式如上所述。请注意,设置是 累加的 - 默认情况下,每个设置都将添加到现有设置中,如果同名设置已存在则替换之。如果要移除特定设置,请使用 state: absent
而不是给出 value
。如果要移除所有现有的 sysfs
设置并用给定的设置替换它们,请在列表中指定 previous: replaced
作为其中的一个值。如果要移除所有的 sysfs
设置,请将 dict
值 {"state": "empty"}
作为参数的唯一值,而不是 list
。请参见下文的示例。
kernel_settings_systemd_cpu_affinity
要设置值,请指定符合 https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html#CPUAffinity= 的格式的 string
。如果要移除设置,请使用 dict
值 {"state": "absent"}
,而不是 string
,作为参数的值。
kernel_settings_transparent_hugepages
要设置值,请指定以下之一的 string
值:always
madvise
never
。这是内存子系统中透明大页的值。如果要移除设置,请使用 dict
值 {"state": "absent"}
,而不是 string
,作为参数的值。
kernel_settings_transparent_hugepages_defrag
要设置值,请指定以下之一的 string
值:always
defer
defer+madvise
madvise
never
。这是内存子系统中透明大页的碎片处理值。实际支持的值可能因您的操作系统而异。如果要移除设置,请使用 dict
值 {"state": "absent"}
,而不是 string
,作为参数的值。
kernel_settings_purge
默认值为 false
- 如果为 true
,则现有配置将完全清除并替换为您给定的 kernel_settings_GROUP
设置。
kernel_settings_reboot_ok
默认值为 false
- 如果为 true
,则如果角色检测到某些更改需要重启才能生效,角色将重新启动管理主机。如果为 false
,则由您决定何时重启管理主机。角色将返回变量 kernel_settings_reboot_required
(见下文),其值为 true
,表示某些更改已发生,需要重启以生效。
kernel_settings_transactional_update_reboot_ok
此变量用于处理事务更新所需的重启。如果事务更新需要重启,则如果 kernel_settings_transactional_update_reboot_ok
设置为 true
,角色将继续重启。如果设置为 false
,角色将通知用户需要重启,以便自定义处理重启要求。如果此变量未设置,角色将无法确保重启要求不会被忽视。
角色导出的变量
角色将导出以下变量:
kernel_settings_reboot_required
- 默认值 false
- 如果为 true
,则表示发生了更改,需要重启管理主机以使其生效。如果您希望角色重启管理主机,请设置 kernel_settings_reboot_ok: true
,否则您需要自行处理重启。
设置用法示例
kernel_settings_sysctl:
- name: fs.epoll.max_user_watches
value: 785592
- name: fs.file-max
value: 379724
kernel_settings_sysfs:
- name: /sys/kernel/debug/x86/pti_enabled
value: 0
- name: /sys/kernel/debug/x86/retp_enabled
value: 0
- name: /sys/kernel/debug/x86/ibrs_enabled
value: 0
kernel_settings_systemd_cpu_affinity: "1,3,5,7"
kernel_settings_transparent_hugepages: madvise
kernel_settings_transparent_hugepages_defrag: defer
注意,list
值的设置是 累加的。也就是说,它们是 在现有设置之外 应用的。例如,如果您已经有
kernel_settings_sysctl:
- name: kernel.threads-max
value: 29968
- name: vm.max_map_count
value: 65530
然后在应用上面的设置后,您会有:
kernel_settings_sysctl:
- name: kernel.threads-max
value: 29968
- name: vm.max_map_count
value: 65530
- name: fs.epoll.max_user_watches
value: 785592
- name: fs.file-max
value: 379724
这允许多个更高级别的角色或剧本使用此角色来提供该组件特定的内核设置。例如,如果您在同一台机器上安装网页服务器和数据库服务器,并且它们都需要设置内核参数,kernel_settings
角色允许您同时设置它们。
如果您在一个部分中指定多个同名设置,将使用最后一个。
如果您想用提供的值替换 所有 设置,请使用 previous: replaced
作为设置列表中的唯一(优先放在首位)元素。这表示系统中的 previous
设置应被给定的设置 replaced
。例如:
kernel_settings_sysctl:
- previous: replaced
- name: kernel.threads-max
value: 30000
- name: vm.max_map_count
value: 50000
这将删除所有现有的 kernel_settings_sysctl
设置,并添加指定的设置。如果要移除单个设置,请在单个设置中指定 state: absent
,而不是 value
:
kernel_settings_sysctl:
- name: kernel.threads-max
value: 30000
- name: vm.max_map_count
state: absent
这将从 kernel_settings_sysctl
设置中移除 vm.max_map_count
设置。如果要从组中移除所有设置,请将 state: empty
作为 dict
指定,而不是 list
:
kernel_settings_sysctl:
state: empty
这将移除所有 kernel_settings_sysctl
设置。
使用 {"state":"absent"}
移除一个标量值参数。例如,要移除所有 kernel_settings_systemd_cpu_affinity
、kernel_settings_transparent_hugepages
和 kernel_settings_transparent_hugepages_defrag
设置,可以使用以下内容:
kernel_settings_systemd_cpu_affinity:
state: absent
kernel_settings_transparent_hugepages:
state: absent
kernel_settings_transparent_hugepages_defrag:
state: absent
示例剧本
- name: 管理内核设置
hosts: all
vars:
kernel_settings_sysctl:
- name: fs.epoll.max_user_watches
value: 785592
- name: fs.file-max
value: 379724
- name: kernel.threads-max
state: absent
kernel_settings_sysfs:
- name: /sys/kernel/debug/x86/pti_enabled
value: 0
- name: /sys/kernel/debug/x86/retp_enabled
value: 0
- name: /sys/kernel/debug/x86/ibrs_enabled
value: 0
kernel_settings_systemd_cpu_affinity: "1,3,5,7"
kernel_settings_transparent_hugepages: madvise
kernel_settings_transparent_hugepages_defrag: defer
roles:
- linux-system-roles.kernel_settings
警告
使用 tuned
实现时,kernel_settings
角色将导致应用其他 sysctl
设置,这是默认行为。这可能发生在您手动编辑 /etc/sysctl.d/
文件,或如果某个系统包安装了 sysctl.d
文件时。例如,在 Fedora 上,安装 libreswan
包提供 /etc/sysctl.d/50-libreswan.conf
。使用 kernel_settings
角色将导致此文件重新加载和重新应用。如果不希望这种行为,您需要在托管主机的 /etc/tuned/tuned-main.conf
中编辑 tuned
配置,并将 reapply_sysctl=0
设置为 0
。
您使用 kernel_settings
角色应用的设置可能与其他设置冲突。例如,如果您手动运行 sysctl
命令、手动编辑 /etc/sysctl.d/
文件,或者如果某个系统包安装了 sysctl.d
文件,它们可能会设置与您使用 kernel_settings
角色设置相同的值。对于 sysctl
设置,优先级如下:
sysctl
文件具有最高优先级 -/etc/sysctl.conf
和/etc/sysctl.d/*
将覆盖所有内容kernel_settings
角色设置具有第二高优先级- 手动使用
sysctl
命令设置的设置优先级最低
对于其他所有设置,如 sysfs
,来自 kernel_settings
角色的设置具有最高优先级。
rpm-ostree
请参见 README-ostree.md
许可证
与 tuned
相关的某些部分是 GPLv2+
。这些在文件的头部中有所说明。其他所有部分是 MIT
许可,除非另有说明。有关更多信息,请参见文件 LICENSE
。
作者信息
Rich Megginson (richm 在 github 上,rmeggins 在我的公司)