使用 RHEL 系统角色自动化系统管理
使用 Red Hat Ansible Automation Platform playbook 在多个主机上进行一致且可重复配置的 RHEL 部署
摘要
对红帽文档提供反馈
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 RHEL 系统角色简介
通过使用 RHEL 系统角色,您可以远程管理跨 RHEL 主版本的多个 RHEL 系统的系统配置。
重要术语和概念
下面描述了 Ansible 环境中的重要术语和概念:
- 控制节点
- 控制节点是您运行 Ansible 命令和 playbook 的系统。您的控制节点可以是 Ansible Automation Platform、Red Hat Satellite 或 RHEL 9、8 或 7 主机。如需更多信息,请参阅 在 RHEL 9 上准备一个控制节点。
- 受管节点
- 受管节点是您通过 Ansible 管理的服务器和网络设备。受管节点有时也称为主机。Ansible 不必安装到受管节点上。如需更多信息,请参阅 准备一个受管节点。
- Ansible playbook
- 在 playbook 中,您可以定义要在受管节点上实现的配置,或受管节点上系统要执行的一组步骤。Playbook 是 Ansible 的配置、部署和编配语言。
- 清单(Inventory)
- 在清单文件中,您可以列出受管节点并指定每个受管节点的信息,如 IP 地址。在清单中,您还可以通过创建和嵌套组来组织受管节点,以便于扩展。清单文件有时也称为 hostfile。
Red Hat Enterprise Linux 9 控制节点上的可用角色和模块
rhel-system-roles
软件包提供的角色:
-
ad_integration
:活动目录集成 -
aide
:高级入侵检测环境 -
引导加载程序
:GRUB 引导装载程序管理 -
证书
:证书颁发和续订 -
cockpit
:Web 控制台安装和配置 -
crypto_policies
: 系统范围的加密策略 -
fapolicy
: 文件访问策略守护进程配置 -
firewall
: Firewalld management -
ha_cluster
: HA 集群管理 -
journald
: Systemd journald 管理 -
kdump
: 内核转储管理 -
kernel_settings
: 内核设置管理 -
日志记录
:配置日志记录 -
指标
:性能监控和指标 -
nbde_client
: Network Bound Disk Encryption client -
nbde_server
: Network Bound Disk Encryption server -
网络:网络配置
-
Podman
: Podman 容器管理 -
Postfix
:Postfix 配置 -
PostgreSQL
: PostgreSQL 配置 -
rhc
:订阅 RHEL 并配置 Insights 客户端 -
SELinux
: SELinux 管理 -
SSH
:SSH 客户端配置 -
sshd
:SSH 服务器配置 -
存储
:存储管理 -
systemd
: 管理 systemd 单元 -
timesync
: 时间同步 -
tlog
: 终端会话记录 -
VPN
:配置 IPsec VPN
ansible-collection-microsoft-sql
软件包提供的角色:
-
Microsoft.sql.server
: Microsoft SQL Server
ansible-collection-redhat-rhel_mgmt
软件包提供的模块:
-
rhel_mgmt.ipmi_boot
: 设置引导设备 -
rhel_mgmt.ipmi_power
:设置系统电源状态 -
rhel_mgmt.redfish_command
: 管理带外控制器(OOB) -
rhel_mgmt.redfish_command
: 从 OOB 控制器查询信息 -
rhel_mgmt.redfish_command
: 管理 BIOS、UEFI 和 OOB 控制器
第 2 章 准备一个控制节点和受管节点以使用 RHEL 系统角色
在使用单独的 RHEL 系统角色管理服务和设置前,您必须准备控制节点和受管节点。
2.1. 在 RHEL 9 上准备一个控制节点
在使用 RHEL 系统角色前,您必须配置一个控制节点。然后,此系统根据 playbook 从清单中配置受管主机。
先决条件
- 该系统已注册到客户门户网站。
-
Red Hat Enterprise Linux Server
订阅被附加到系统上。 -
可选:
Ansible Automation Platform
订阅被附加到系统上。
步骤
创建一个名为
ansible
的用户,来管理并运行 playbook:useradd ansible
[root@control-node]# useradd ansible
Copy to Clipboard Copied! 切换到新创建的
ansible
用户:su - ansible
[root@control-node]# su - ansible
Copy to Clipboard Copied! 以这个用户身份执行其余步骤。
创建一个 SSH 公钥和私钥:
ssh-keygen
[ansible@control-node]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ansible/.ssh/id_rsa): Enter passphrase (empty for no passphrase): <password> Enter same passphrase again: <password> ...
Copy to Clipboard Copied! 为密钥文件使用推荐的默认位置。
- 可选: 要防止 Ansible 在每次建立连接时提示您输入 SSH 密钥密码,请配置一个 SSH 代理。
使用以下内容创建
~/.ansible.cfg
文件:[defaults] inventory = /home/ansible/inventory remote_user = ansible [privilege_escalation] become = True become_method = sudo become_user = root become_ask_pass = True
[defaults] inventory = /home/ansible/inventory remote_user = ansible [privilege_escalation] become = True become_method = sudo become_user = root become_ask_pass = True
Copy to Clipboard Copied! 注意~/.ansible.cfg
文件中的设置具有更高的优先级,并覆盖全局/etc/ansible/ansible.cfg
文件中的设置。使用这些设置,Ansible 执行以下操作:
- 管理指定清单文件中的主机。
-
当帐户建立到受管节点的 SSH 连接时,使用
remote_user
参数中设置的帐户。 -
使用
sudo
工具,以root
用户身份在受管节点上执行任务。 - 每次应用 playbook 时,都会提示输入远程用户的 root 密码。出于安全考虑,建议这样做。
创建一个列出受管主机主机名的 INI 或 YAML 格式的
~/inventory
文件。您还可以在清单文件中定义主机组。例如,以下是 INI 格式的清单文件,它有三个主机,以及一个名为US
的主机组:managed-node-01.example.com [US] managed-node-02.example.com ansible_host=192.0.2.100 managed-node-03.example.com
managed-node-01.example.com [US] managed-node-02.example.com ansible_host=192.0.2.100 managed-node-03.example.com
Copy to Clipboard Copied! 请注意,控制节点必须能够解析主机名。如果 DNS 服务器无法解析某些主机名,请在主机条目旁边添加
ansible_host
参数来指定其 IP 地址。安装 RHEL 系统角色:
在没有 Ansible Automation Platform 的 RHEL 主机上,安装
rhel-system-roles
软件包:dnf install rhel-system-roles
[root@control-node]# dnf install rhel-system-roles
Copy to Clipboard Copied! 此命令在
/usr/share/ansible/collections/ansible_collections/redhat/rhel_system_roles/
目录中安装集合,并且ansible-core
软件包作为依赖项。在 Ansible Automation Platform 上,以
ansible
用户身份执行以下步骤:-
对
~/.ansible.cfg
文件中的内容 将 Red Hat Automation hub 定义为主要源。 从 Red Hat Automation Hub 安装
redhat.rhel_system_roles
集合:ansible-galaxy collection install redhat.rhel_system_roles
[ansible@control-node]$ ansible-galaxy collection install redhat.rhel_system_roles
Copy to Clipboard Copied! 此命令在
~/.ansible/collections/ansible_collections/redhat/rhel_system_roles/
目录中安装集合。
-
对
后续步骤
- 准备受管节点。如需更多信息,请参阅 准备一个受管节点。
2.2. 准备受管节点
受管节点是在清单中列出的系统,它由控制节点根据 playbook 进行配置。您不必在受管主机上安装 Ansible。
先决条件
- 您已准备好了控制节点。如需更多信息,请参阅 在 RHEL 9 上准备一个控制节点。
您从控制节点进行 SSH 访问的权限。
重要以
root
用户身份进行直接的 SSH 访问是一个安全风险。要降低这个风险,您将在此节点上创建一个本地用户,并在准备受管节点时配置一个sudo
策略。然后,控制节点上的 Ansible 可以使用本地用户帐户登录到受管节点,并以不同的用户身份(如root
)运行 playbook。
流程
创建一个名为
ansible
的用户:useradd ansible
[root@managed-node-01]# useradd ansible
Copy to Clipboard Copied! 控制节点稍后使用这个用户建立与这个主机的 SSH 连接。
为
ansible
用户设置密码:passwd ansible
[root@managed-node-01]# passwd ansible Changing password for user ansible. New password: <password> Retype new password: <password> passwd: all authentication tokens updated successfully.
Copy to Clipboard Copied! 当 Ansible 使用
sudo
以root
用户身份执行任务时,您必须输入此密码。在受管主机上安装
ansible
用户的 SSH 公钥:以
ansible
用户身份登录到控制节点,并将 SSH 公钥复制到受管节点:ssh-copy-id managed-node-01.example.com
[ansible@control-node]$ ssh-copy-id managed-node-01.example.com /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub" The authenticity of host 'managed-node-01.example.com (192.0.2.100)' can't be established. ECDSA key fingerprint is SHA256:9bZ33GJNODK3zbNhybokN/6Mq7hu3vpBXDrCxe7NAvo.
Copy to Clipboard Copied! 当提示时,输入
yes
进行连接:Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Copy to Clipboard Copied! 当提示时,输入密码:
ansible@managed-node-01.example.com's password: <password> Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'managed-node-01.example.com'" and check to make sure that only the key(s) you wanted were added.
ansible@managed-node-01.example.com's password: <password> Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'managed-node-01.example.com'" and check to make sure that only the key(s) you wanted were added.
Copy to Clipboard Copied! 通过在控制节点上远程执行命令来验证 SSH 连接:
ssh managed-node-01.example.com whoami
[ansible@control-node]$ ssh managed-node-01.example.com whoami ansible
Copy to Clipboard Copied!
为
ansible
用户创建一个sudo
配置:使用
visudo
命令创建并编辑/etc/sudoers.d/ansible
文件:visudo /etc/sudoers.d/ansible
[root@managed-node-01]# visudo /etc/sudoers.d/ansible
Copy to Clipboard Copied! 与普通编辑器相比,使用
visudo
的好处是,该工具在安装文件前提供基本的检查,如,检查解析错误。在
/etc/sudoers.d/ansible
文件中配置满足您要求的sudoers
策略,例如:要为
ansible
用户授予权限,以便在输入ansible
用户密码后以此主机上的任何用户和组身份运行所有命令,请使用:ansible ALL=(ALL) ALL
ansible ALL=(ALL) ALL
Copy to Clipboard Copied! 要向
ansible
用户授予权限,以便在不输入ansible
用户密码的情况下以该主机上任何用户和组的身份运行所有命令,请使用:ansible ALL=(ALL) NOPASSWD: ALL
ansible ALL=(ALL) NOPASSWD: ALL
Copy to Clipboard Copied!
或者,配置匹配您安全要求的更精细的策略。有关
sudoers
策略的详情,请查看sudoers (5)
手册页。
验证
验证您可以在所有受管节点上执行来自控制节点的命令:
ansible all -m ping
[ansible@control-node]$ ansible all -m ping BECOME password: <password> managed-node-01.example.com | SUCCESS => { ... "ping": "pong" } ...
Copy to Clipboard Copied! 硬编码的所有组会动态包含清单文件中列出的所有主机。
使用 Ansible
command
模块在所有受管节点上运行whoami
工具来验证特权升级是否正常工作:ansible all -m command -a whoami
[ansible@control-node]$ ansible all -m command -a whoami BECOME password: <password> managed-node-01.example.com | CHANGED | rc=0 >> root ...
Copy to Clipboard Copied! 如果命令返回 root,则您在受管节点上正确地配置了
sudo
。
第 3 章 Ansible vault
有时,您的 playbook 需要使用敏感数据,如密码、API 密钥和其他 secret 来配置受管主机。将此信息以纯文本形式存储在变量或其他与 Ansible 兼容的文件中存在安全风险,因为有权访问这些文件的任何用户都可以读取敏感数据。
使用 Ansible vault,您可以加密、解密、查看和编辑敏感信息。它们可能包括:
- 在 Ansible Playbook 中插入的变量文件
- 主机和组变量
- 执行 playbook 时作为参数传递的变量文件
- Ansible 角色中定义的变量
您可以使用 Ansible vault 安全地管理单个变量、整个文件,甚至像 YAML 文件这样的结构化的数据。然后,此数据可以被安全地存储在版本控制系统中,或者与团队成员共享,而不会暴露敏感信息。
文件通过高级加密标准(AES256)的对称加密进行了保护,其中单个密码或密码短语用于加密和解密数据。请注意,这一操作方式尚未经过第三方的正式审核。
为了简化管理,设置您的 Ansible 项目,以便敏感变量和所有其他变量都保存在单独的文件或目录中是有意义的。然后,您可以使用 ansible-vault
命令保护包含敏感变量的文件。
创建加密的文件
以下命令提示您输入新的 vault 密码。然后,它使用默认的编辑器打开一个文件来存储敏感变量。
ansible-vault create vault.yml
# ansible-vault create vault.yml
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
查看加密的文件
以下命令提示您输入现有的 vault 密码。然后,它显示已加密的文件的敏感内容。
ansible-vault view vault.yml
# ansible-vault view vault.yml
Vault password: <vault_password>
my_secret: "yJJvPqhsiusmmPPZdnjndkdnYNDjdj782meUZcw"
编辑加密的文件
以下命令提示您输入现有的 vault 密码。然后,它打开已加密的文件,以供您使用默认编辑器更新敏感变量。
ansible-vault edit vault.yml
# ansible-vault edit vault.yml
Vault password: <vault_password>
加密现有文件
以下命令提示您输入新的 vault 密码。然后,它加密现有的未加密的文件。
ansible-vault encrypt vault.yml
# ansible-vault encrypt vault.yml
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
Encryption successful
解密现有文件
以下命令提示您输入现有的 vault 密码。然后,它会解密现有的加密文件。
ansible-vault decrypt vault.yml
# ansible-vault decrypt vault.yml
Vault password: <vault_password>
Decryption successful
更改加密的文件的密码
以下命令提示您输入原始 vault 密码,然后提示输入新的 vault 密码。
ansible-vault rekey vault.yml
# ansible-vault rekey vault.yml
Vault password: <vault_password>
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
Rekey successful
playbook 中 Ansible vault 变量的基本应用程序
--- - name: Create user accounts for all servers hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create user from vault.yml file user: name: "{{ username }}" password: "{{ pwhash }}"
---
- name: Create user accounts for all servers
hosts: managed-node-01.example.com
vars_files:
- ~/vault.yml
tasks:
- name: Create user from vault.yml file
user:
name: "{{ username }}"
password: "{{ pwhash }}"
您使用 Ansible Playbook 的 vars_files
部分中的变量(vault.yml
)读取文件,并且就像使用普通变量一样使用大括号。然后,您可以使用 ansible-playbook --ask-vault-pass
命令运行 playbook,并手动输入密码。或者,您可以将密码保存到单独的文件中,并使用 ansible-playbook --vault-password-file /path/to/my/vault-password-file
命令运行 playbook。
第 4 章 使用 RHEL 系统角色将 RHEL 系统加入到活动目录
如果您的组织使用 Microsoft Active Directory (AD)集中管理用户、组和其他资源,您可以将您的 Red Hat Enterprise Linux (RHEL)主机加入到这个 AD 中。例如,AD 用户然后可以登录到 RHEL,您可以使 RHEL 主机上的服务为经过身份验证的 AD 用户使用。通过使用 ad_integration
RHEL 系统角色,您可以将 Red Hat Enterprise Linux 系统自动集成到活动目录(AD)域中。
ad_integration
角色用于使用没有身份管理(IdM)环境的直接 AD 集成的部署。对于 IdM 环境,请使用 ansible-freeipa
角色。
4.1. 使用 ad_integration
RHEL 系统角色将 RHEL 加入到活动目录域中
您可以使用 ad_integration
RHEL 系统角色来自动化将 RHEL 加入到活动目录(AD)域的过程。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 受管节点使用可以解析 AD DNS 条目的 DNS 服务器。
- AD 帐户的凭证,该帐户有权将计算机加入到域中。
确保所需的端口已打开:
步骤
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:usr: administrator pwd: <password>
usr: administrator pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Active Directory integration hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Join an Active Directory ansible.builtin.include_role: name: redhat.rhel_system_roles.ad_integration vars: ad_integration_user: "{{ usr }}" ad_integration_password: "{{ pwd }}" ad_integration_realm: "ad.example.com" ad_integration_allow_rc4_crypto: false ad_integration_timesync_source: "time_server.ad.example.com"
--- - name: Active Directory integration hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Join an Active Directory ansible.builtin.include_role: name: redhat.rhel_system_roles.ad_integration vars: ad_integration_user: "{{ usr }}" ad_integration_password: "{{ pwd }}" ad_integration_realm: "ad.example.com" ad_integration_allow_rc4_crypto: false ad_integration_timesync_source: "time_server.ad.example.com"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ad_integration_allow_rc4_crypto: <true|false>
配置角色是否在受管节点上激活
AD-SUPPORT
加密策略。默认情况下,RHEL 不支持弱 RC4 加密,但如果 AD 中的 Kerberos 仍然需要 RC4,则您可以通过设置ad_integration_allow_rc4_crypto: true
来启用这个加密类型。如果 Kerberos 使用 AES 加密,则可省略此变量或将其设置为
false
。ad_integration_timesync_source: <time_server>
-
指定用于时间同步的 NTP 服务器。Kerberos 需要在 AD 域控制器和域成员之间同步时间,以防止重播攻击。如果省略此变量,
ad_integration
角色不会利用timesync
RHEL 系统角色在受管节点上配置时间同步。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ad_integration/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
检查 AD 用户(如
administrator
)是否在受管节点上本地可用:ansible managed-node-01.example.com -m command -a 'getent passwd administrator@ad.example.com'
$ ansible managed-node-01.example.com -m command -a 'getent passwd administrator@ad.example.com' administrator@ad.example.com:*:1450400500:1450400513:Administrator:/home/administrator@ad.example.com:/bin/bash
Copy to Clipboard Copied!
第 5 章 使用 RHEL 系统角色配置 GRUB 引导装载程序
通过使用 引导装载程序
RHEL 系统角色,您可以自动化与 GRUB 引导装载程序相关的配置和管理任务。
此角色目前支持配置 GRUB 引导装载程序,该加载程序运行在以下 CPU 构架上:
- AMD 和 Intel 64 位构架(x86-64)
- 64 位 ARM 架构(ARMv8.0)
- IBM Power Systems, Little Endian(POWER9)
5.1. 使用 bootloader
RHEL 系统角色更新现有引导装载程序条目
您可以使用 bootloader
RHEL 系统角色,以自动的方式更新 GRUB 引导菜单中的现有条目。这样,您可以有效地传递可以优化系统性能或行为的特定内核命令行参数。
例如,如果您利用不需要来自内核和 init 系统的详细引导消息的系统,请使用 bootloader
将 quiet
参数应用到受管节点上现有的引导装载程序条目中,以实现更干净、更整洁、更用户友好的引导体验。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您确定了与您要更新的引导装载程序条目对应的内核。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuration and management of GRUB boot loader hosts: managed-node-01.example.com tasks: - name: Update existing boot loader entries ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: path: /boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64 options: - name: quiet state: present bootloader_reboot_ok: true
--- - name: Configuration and management of GRUB boot loader hosts: managed-node-01.example.com tasks: - name: Update existing boot loader entries ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: path: /boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64 options: - name: quiet state: present bootloader_reboot_ok: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
kernel
- 指定与您要更新的引导装载程序条目连接的内核。
options
- 为所选引导装载程序条目指定要更新的内核命令行参数(内核)。
bootloader_reboot_ok: true
- 该角色检测是否需要重启才能使更改生效,并执行受管节点的重启。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.bootloader/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
检查您指定的引导装载程序条目是否已更新了内核命令行参数:
ansible managed-node-01.example.com -m ansible.builtin.command -a 'grubby --info=ALL'
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'grubby --info=ALL' managed-node-01.example.com | CHANGED | rc=0 >> ... index=1 kernel="/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64" args="ro crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap $tuned_params quiet" root="/dev/mapper/rhel-root" initrd="/boot/initramfs-5.14.0-362.24.1.el9_3.aarch64.img $tuned_initrd" title="Red Hat Enterprise Linux (5.14.0-362.24.1.el9_3.aarch64) 9.4 (Plow)" id="2c9ec787230141a9b087f774955795ab-5.14.0-362.24.1.el9_3.aarch64" ...
Copy to Clipboard Copied!
5.4. 使用 bootloader
RHEL 系统角色收集引导装载程序配置信息
您可以使用 bootloader
RHEL 系统角色,以自动的方式收集有关 GRUB 引导装载程序条目的信息。您可以使用这些信息来验证系统引导参数的正确配置,如内核和初始 RAM 磁盘镜像路径。
因此,您可以,例如:
- 防止引导失败。
- 在故障排除时恢复回已知的良好状态。
- 确保与安全相关的内核命令行参数被正确配置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuration and management of GRUB boot loader hosts: managed-node-01.example.com tasks: - name: Gather information about the boot loader configuration ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_gather_facts: true - name: Display the collected boot loader configuration information debug: var: bootloader_facts
--- - name: Configuration and management of GRUB boot loader hosts: managed-node-01.example.com tasks: - name: Gather information about the boot loader configuration ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_gather_facts: true - name: Display the collected boot loader configuration information debug: var: bootloader_facts
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.bootloader/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在控制节点上运行前面的 playbook 后,您会看到类似的命令行输出,如下例中所示:
... "bootloader_facts": [ { "args": "ro crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap $tuned_params quiet", "default": true, "id": "2c9ec787230141a9b087f774955795ab-5.14.0-362.24.1.el9_3.aarch64", "index": "1", "initrd": "/boot/initramfs-5.14.0-362.24.1.el9_3.aarch64.img $tuned_initrd", "kernel": "/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64", "root": "/dev/mapper/rhel-root", "title": "Red Hat Enterprise Linux (5.14.0-362.24.1.el9_3.aarch64) 9.4 (Plow)" } ] ...
... "bootloader_facts": [ { "args": "ro crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap $tuned_params quiet", "default": true, "id": "2c9ec787230141a9b087f774955795ab-5.14.0-362.24.1.el9_3.aarch64", "index": "1", "initrd": "/boot/initramfs-5.14.0-362.24.1.el9_3.aarch64.img $tuned_initrd", "kernel": "/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64", "root": "/dev/mapper/rhel-root", "title": "Red Hat Enterprise Linux (5.14.0-362.24.1.el9_3.aarch64) 9.4 (Plow)" } ] ...
Copy to Clipboard Copied! 命令行输出显示以下值得注意的有关引导条目的配置信息:
args
- 在引导过程中 GRUB2 引导装载程序传递给内核的命令行参数。它们配置内核、initramfs 和其他引导时组件的各种设置和行为。
id
- 引导装载程序菜单中分配给每个引导条目的唯一标识符。它由机器 ID 和内核版本组成。
root
- 内核要挂载的根文件系统,并在启动过程中作为主文件系统使用。
第 6 章 使用 RHEL 系统角色从 CA 请求证书并创建自签名证书
许多服务(如 Web 服务器)都使用 TLS 加密与客户端的连接。这些服务需要一个私钥和一个证书,以及签名证书的可信证书颁发机构(CA)。
通过使用 certificate
RHEL 系统角色,您可以在受管节点上自动生成私钥。另外,角色配置 certmonger
服务,来向 CA 发送证书签名请求(CSR),且服务会在证书过期前自动更新证书。
出于测试目的,您可以使用 certificate
角色创建自签名证书,而不是从 CA 请求签名的证书。
6.1. 使用 certificate
RHEL 系统角色从 IdM CA 请求一个新证书
如果 Red Hat Enterprise Linux 主机是 RHEL 身份管理(IdM)环境的成员,则您可以从 IdM 证书颁发机构(CA)请求 TLS 证书,并在此主机上运行的服务中使用它们。通过使用 证书
RHEL 系统角色,您可以自动化创建私钥的过程,并让 certmonger
服务从 CA 请求一个证书。默认情况下,certmonger
会在证书过期前更新证书。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 受管节点是 IdM 域的成员,且域使用 IdM 集成的 CA。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create certificates hosts: managed-node-01.example.com tasks: - name: Create a self-signed certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.certificate vars: certificate_requests: - name: web-server ca: ipa dns: www.example.com principal: HTTP/www.example.com@EXAMPLE.COM run_before: systemctl stop httpd.service run_after: systemctl start httpd.service
--- - name: Create certificates hosts: managed-node-01.example.com tasks: - name: Create a self-signed certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.certificate vars: certificate_requests: - name: web-server ca: ipa dns: www.example.com principal: HTTP/www.example.com@EXAMPLE.COM run_before: systemctl stop httpd.service run_after: systemctl start httpd.service
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
name: <path_or_file_name>
定义生成的私钥的名称或路径,以及证书文件:
-
如果将变量设置为
web-server
,角色会将私钥存储在/etc/pki/tls/private/web-server.key
中,并将证书存储在/etc/pki/tls/certs/web-server.crt
文件中。 如果将变量设置为一个路径,如
/tmp/web-server
,则角色会将私钥存储在/tmp/web-server.key
中,并将证书存储在/tmp/web-server.crt
文件中。请注意,您使用的目录必须设置
cert_t
SELinux 上下文。您可以使用selinux
RHEL 系统角色来管理 SELinux 上下文。
-
如果将变量设置为
ca: ipa
- 定义角色从 IdM CA 请求证书。
dns: <hostname_or_list_of_hostnames>
-
设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(
*
)或以 YAML 列表格式指定多个名称。 principal: <kerberos_principal>
- 可选:设置应该包含在证书中的 Kerberos 主体。
run_before: <command>
-
可选:定义
certmonger
在从 CA 请求证书之前应执行的命令。 run_after: < command>
-
可选:定义
certmonger
在从 CA 收到发布的证书后应该执行的命令。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.certificate/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
列出
certmonger
服务管理的证书:ansible managed-node-01.example.com -m command -a 'getcert list'
# ansible managed-node-01.example.com -m command -a 'getcert list' ... Number of certificates and requests being tracked: 1. Request ID '20240918142211': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/web-server.key' certificate: type=FILE,location='/etc/pki/tls/certs/web-server.crt' CA: IPA issuer: CN=Certificate Authority,O=EXAMPLE.COM subject: CN=www.example.com issued: 2024-09-18 16:22:11 CEST expires: 2025-09-18 16:22:10 CEST dns: www.example.com key usage: digitalSignature,keyEncipherment eku: id-kp-serverAuth,id-kp-clientAuth pre-save command: systemctl stop httpd.service post-save command: systemctl start httpd.service track: yes auto-renew: yes
Copy to Clipboard Copied!
6.2. 使用 certificate
RHEL 系统角色请求一个新的自签名证书
如果需要用于测试环境的 TLS 证书,您可以使用自签名证书。通过使用 certificate
RHEL 系统角色,您可以自动化创建私钥的过程,并让 certmonger
服务创建自签名证书。默认情况下,certmonger
会在证书过期前更新证书。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create certificates hosts: managed-node-01.example.com tasks: - name: Create a self-signed certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.certificate vars: certificate_requests: - name: web-server ca: self-sign dns: test.example.com
--- - name: Create certificates hosts: managed-node-01.example.com tasks: - name: Create a self-signed certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.certificate vars: certificate_requests: - name: web-server ca: self-sign dns: test.example.com
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
name: <path_or_file_name>
定义生成的私钥的名称或路径,以及证书文件:
-
如果将变量设置为
web-server
,角色会将私钥存储在/etc/pki/tls/private/web-server.key
中,并将证书存储在/etc/pki/tls/certs/web-server.crt
文件中。 如果将变量设置为一个路径,如
/tmp/web-server
,则角色会将私钥存储在/tmp/web-server.key
中,并将证书存储在/tmp/web-server.crt
文件中。请注意,您使用的目录必须设置
cert_t
SELinux 上下文。您可以使用selinux
RHEL 系统角色来管理 SELinux 上下文。
-
如果将变量设置为
ca: self-sign
- 定义角色创建一个自签名证书。
dns: <hostname_or_list_of_hostnames>
-
设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(
*
)或以 YAML 列表格式指定多个名称。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.certificate/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
列出
certmonger
服务管理的证书:ansible managed-node-01.example.com -m command -a 'getcert list'
# ansible managed-node-01.example.com -m command -a 'getcert list' ... Number of certificates and requests being tracked: 1. Request ID '20240918133610': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/web-server.key' certificate: type=FILE,location='/etc/pki/tls/certs/web-server.crt' CA: local issuer: CN=c32b16d7-5b1a4c5a-a953a711-c3ca58fb,CN=Local Signing Authority subject: CN=test.example.com issued: 2024-09-18 15:36:10 CEST expires: 2025-09-18 15:36:09 CEST dns: test.example.com key usage: digitalSignature,keyEncipherment eku: id-kp-serverAuth,id-kp-clientAuth pre-save command: post-save command: track: yes auto-renew: yes
Copy to Clipboard Copied!
第 7 章 使用 RHEL 系统角色安装和配置 web 控制台
使用 cockpit
RHEL 系统角色,您可以在多个 RHEL 系统上自动部署和启用 Web 控制台。
7.1. 使用 cockpit
RHEL 系统角色安装 Web 控制台
您可以使用 cockpit
系统角色在多个系统上自动安装和启用 RHEL web 控制台。
在本例中,您可以使用 cockpit
系统角色来:
- 安装 RHEL web 控制台。
-
允许
firewalld
和selinux
系统角色配置系统,以开放新端口。 -
将 web 控制台设置为使用
ipa
trusted 证书颁发机构的证书,而不使用自签名证书。
您不必在 playbook 中调用 firewall
或 certificate
系统角色来管理防火墙或创建证书。cockpit
系统角色根据需要自动调用它们。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage the RHEL web console hosts: managed-node-01.example.com tasks: - name: Install RHEL web console ansible.builtin.include_role: name: redhat.rhel_system_roles.cockpit vars: cockpit_packages: default cockpit_manage_selinux: true cockpit_manage_firewall: true cockpit_certificates: - name: /etc/cockpit/ws-certs.d/01-certificate dns: ['localhost', 'www.example.com'] ca: ipa
--- - name: Manage the RHEL web console hosts: managed-node-01.example.com tasks: - name: Install RHEL web console ansible.builtin.include_role: name: redhat.rhel_system_roles.cockpit vars: cockpit_packages: default cockpit_manage_selinux: true cockpit_manage_firewall: true cockpit_certificates: - name: /etc/cockpit/ws-certs.d/01-certificate dns: ['localhost', 'www.example.com'] ca: ipa
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
cockpit_manage_selinux: true
-
允许使用
selinux
系统角色配置 SELinux,来对websm_port_t
SELinux 类型设置正确的端口权限。 cockpit_manage_firewall: true
-
允许
cockpit
系统角色使用firewalld
系统角色来添加端口。 cockpit_certificates: <YAML_dictionary>
默认情况下,RHEL web 控制台使用自签名证书。或者,您可以将
cockpit_certificates
变量添加到 playbook 中,并将角色配置为请求 IdM 证书颁发机构(CA)中的证书,或使用受管节点上提供的现有证书和私钥。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.cockpit/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 8 章 使用 RHEL 系统角色设置自定义加密策略
自定义加密策略是一组管理加密算法和协议使用的规则和配置。这些策略帮助您在多个系统和应用程序中维护受保护的、一致且可管理的安全环境。
通过使用 crypto_policies
RHEL 系统角色,您可以以自动的方式,快速且一致地在多个操作系统中配置自定义加密策略。
8.1. 使用 crypto_policies
RHEL 系统角色,使用 FUTURE
加密策略增强安全性
您可以使用 crypto_policies
RHEL 系统角色在受管节点上配置 FUTURE
策略。例如,此策略有助于实现:
- 防范未来新出现的威胁:预测计算能力的进步。
- 增强了安全性:更强大的加密标准需要更长的密钥长度和更安全的算法。
- 遵守高安全性标准:例如在医疗保健、电信和财务方面,数据敏感度很高,并且强大的加密可用性至关重要。
通常,FUTURE
适合处理高度敏感数据,为未来法规做准备或采用长期安全策略的环境。
传统系统或软件不必支持FUTURE
策略强制执行的更现代化且更严格的算法和协议。例如,旧的系统可能不支持 TLS 1.3 或更大的密钥大小。这可能导致兼容性问题。
另外,使用强大的算法通常会增加计算工作负载,这可能会对您的系统性能造成负面影响。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
--- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
crypto_policies_policy: FUTURE
-
在受管节点上配置所需的加密策略(
FUTURE
)。它可以是基本策略,也可以是带有一些子策略的基本策略。指定的基本策略和子策略必须在受管节点上提供。默认值为null
。这意味着配置没有被更改,crypto_policies
RHEL 系统角色将只收集 Ansible 事实。 crypto_policies_reboot_ok: true
-
导致系统在加密策略更改后重启,以确保所有服务和应用程序将读取新的配置文件。默认值为
false
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
因为 FIPS:OSPP
系统范围的子策略包含对通用标准(CC)认证所需的加密算法的进一步限制,所以在设置它后系统的互操作性较差。例如,您无法使用少于 3072 位的 RSA 和 DH 密钥、其它 SSH 算法和几个 TLS 组。设置 FIPS:OSPP
也会阻止连接到 Red Hat Content Delivery Network (CDN)结构。另外,您无法将活动目录(AD)集成到使用 FIPS:OSPP
的 IdM 部署中 ,使用 FIPS:OSPP
的 RHEL 主机和 AD 域之间的通信可能无法工作,或者某些 AD 帐户可能无法进行身份验证。
请注意,在设置了 FIPS:OSPP
加密子策略后,您的 系统不符合 CC。使 RHEL 系统符合 CC 标准的唯一正确方法是遵循 cc-config
软件包中提供的指导。有关已认证的 RHEL 版本的列表、验证报告以及 国家信息保障合作伙伴(NIAP) 网站上托管的 CC 指南的链接,请参阅有关 产品合规 红帽客户门户网站上的 通用标准 部分。
验证
在控制节点上,创建另一个 playbook,例如
verify_playbook.yml
:--- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active
--- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
crypto_policies_active
-
导出的 Ansible 事实含有当前活动的策略名称,格式为
crypto_policies_policy
变量所接受的格式。
验证 playbook 语法:
ansible-playbook --syntax-check ~/verify_playbook.yml
$ ansible-playbook --syntax-check ~/verify_playbook.yml
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook ~/verify_playbook.yml
$ ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }
Copy to Clipboard Copied! crypto_policies_active
变量显示受管节点上活动的策略。
第 9 章 使用 fapolicyd
RHEL 系统角色限制应用程序的执行
通过使用 fapolicyd
软件框架,您可以根据用户定义的策略限制应用程序的执行,框架会在执行前验证应用程序的完整性。这是一种防止运行不可靠的且可能恶意的应用程序的有效方法。您可以使用 fapolicyd
RHEL 系统角色自动化 fapolicyd
的安装和配置。
fapolicyd
服务只阻止以常规用户身份,而不是以 root
身份执行未授权的应用程序。
9.1. 使用 fapolicyd
RHEL 系统角色防止用户执行不可靠代码
您可以使用 fapolicyd
RHEL 系统角色自动化 fapolicyd
服务的安装和配置。使用此角色,您可以远程配置服务,以允许用户仅执行可信的应用程序,例如 RPM 数据库和允许列表中列出的应用程序。另外,该服务也可以在执行允许的应用程序之前执行完整性检查。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring fapolicyd hosts: managed-node-01.example.com tasks: - name: Allow only executables installed from RPM database and specific files ansible.builtin.include_role: name: redhat.rhel_system_roles.fapolicyd vars: fapolicyd_setup_permissive: false fapolicyd_setup_integrity: sha256 fapolicyd_setup_trust: rpmdb,file fapolicyd_add_trusted_file: - <path_to_allowed_command> - <path_to_allowed_service>
--- - name: Configuring fapolicyd hosts: managed-node-01.example.com tasks: - name: Allow only executables installed from RPM database and specific files ansible.builtin.include_role: name: redhat.rhel_system_roles.fapolicyd vars: fapolicyd_setup_permissive: false fapolicyd_setup_integrity: sha256 fapolicyd_setup_trust: rpmdb,file fapolicyd_add_trusted_file: - <path_to_allowed_command> - <path_to_allowed_service>
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
fapolicyd_setup_permissive: <true|false>
-
启用或禁用向内核发送策略决策以强制执行。出于调试和测试目的,将此变量设置为
false
。 fapolicyd_setup_integrity: <type_type>
定义完整性检查方法。您可以设置以下值之一:
-
none
(默认):禁用完整性检查。 -
size
:服务仅比较允许的应用程序的文件大小。 -
ima
: 服务检查内核完整性测量架构(IMA)存储在文件的扩展属性中的 SHA-256 哈希。此外,该服务执行大小检查。请注意,该角色不配置 IMA 内核子系统。要使用这个选项,您必须手动配置 IMA 子系统。 -
sha256
:服务比较允许的应用程序的 SHA-256 哈希。
-
fapolicyd_setup_trust: <trust_backends>
-
定义信任后端的列表。如果您包含
file
后端,请在fapolicyd_add_trusted_file
列表中指定允许的可执行文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.fapolicyd.README.md
文件。验证 playbook 语法:
ansible-playbook ~/playbook.yml --syntax-check
$ ansible-playbook ~/playbook.yml --syntax-check
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
以用户身份执行不在允许列表中的二进制应用程序:
ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>'
$ ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>' bash: line 1: /bin/not_authorized_application: Operation not permitted non-zero return code
Copy to Clipboard Copied!
第 10 章 使用 RHEL 系统角色配置 firewalld
RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供一致的配置接口,来一次远程管理多个系统。
rhel-system-roles
软件包包含 rhel-system-roles.firewall
RHEL 系统角色。此角色是为 firewalld
服务的自动配置而引入的。
使用 firewall
RHEL 系统角色,您可以配置许多不同的 firewalld
参数,例如:
- 区域
- 应允许哪些数据包的服务
- 授予、拒绝或丢弃访问端口的流量
- 区域的端口转发或端口范围
10.1. 使用 firewall
RHEL 系统角色重置 firewalld
设置
随着时间的推移,对防火墙配置的更新可能会积累到一定程度,从而导致意外的安全风险。使用 firewall
RHEL 系统角色,您可以以自动的方式将 firewalld
设置重置为其默认状态。这样,您可以有效地删除任何非预期的或不安全的防火墙规则,并简化其管理。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replaced
--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replaced
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
previous: replaced
删除所有现有的用户定义的设置,并将
firewalld
设置重置为默认值。如果将previous:replaced
参数与其他设置相结合,则firewall
角色会在应用新设置前删除所有现有设置。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在控制节点上运行此命令,来远程检查受管节点上的所有防火墙配置是否已重置为其默认值:
ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
Copy to Clipboard Copied!
10.2. 使用 firewall
RHEL 系统角色,将 firewalld
中的传入流量从一个本地端口转发到不同的本地端口
您可以使用 firewall
RHEL 系统角色来远程配置流量从一个本地端口到另一个本地端口的转发。
例如,如果您有一个环境,其中同一机器上有多个服务共存,且需要相同的默认端口,则可能会出现端口冲突。这些冲突可能会中断服务并导致停机。使用 firewall
RHEL 系统角色,您可以高效地将流量转发到替代端口,以确保您的服务可以在不修改其配置的情况下同时运行。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime: true permanent: true
--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime: true permanent: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
forward_port: 8080/tcp;443
- 使用 TCP 协议将到本地端口 8080 的流量转发到端口 443。
runtime: true
在运行时配置中启用更改。默认值被设置为
true
。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在控制节点上,运行以下命令来远程检查受管节点上的转发端口:
ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports'
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports' managed-node-01.example.com | CHANGED | rc=0 >> port=8080:proto=tcp:toport=443:toaddr=
Copy to Clipboard Copied!
10.3. 使用 firewall
RHEL 系统角色配置 firewalld
DMZ 区域
作为系统管理员,您可以使用 firewall
RHEL 系统角色在 enp1s0 接口上配置 dmz
区域,以允许到区域的 HTTPS
流量。这样,您可以让外部用户访问您的 web 服务器。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: true
--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: true
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在控制节点上,运行以下命令来远程检查受管节点上
dmz
区域的信息:ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all'
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all' managed-node-01.example.com | CHANGED | rc=0 >> dmz (active) target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks:
Copy to Clipboard Copied!
第 11 章 使用 RHEL 系统角色配置高可用性集群
通过 ha_cluster
系统角色,您可以配置和管理使用 Pacemaker 高可用性集群资源管理器的高可用性集群。
11.1. ha_cluster
RHEL 系统角色的变量
在 ha_cluster
RHEL 系统角色 playbook 中,您可以根据集群部署的要求为高可用性集群定义变量。
您可以为 ha_cluster
RHEL 系统角色设置的变量如下:
ha_cluster_enable_repos
-
启用包含
ha_cluster
RHEL 系统角色所需的软件包的存储库的布尔值标志。当此变量被设置为默认值true
时,您必须在将用作集群成员的系统上有活跃的覆盖 RHEL 和 RHEL 高可用性附加组件订阅,否则系统角色将失败。 ha_cluster_enable_repos_resilient_storage
-
(RHEL 9.4 及更高版本)一个布尔值标志,它启用包含弹性存储软件包(如
dlm
或gfs2
)的存储库。要使此选项生效,ha_cluster_enable_repos
必须被设为true
。此变量的默认值为false
。 ha_cluster_manage_firewall
(RHEL 9.2 及更高版本)一个决定
ha_cluster
RHEL 系统角色是否管理防火墙的布尔值标志。当ha_cluster_manage_firewall
设为true
时,防火墙高可用性服务和fence-virt
端口被启用。当ha_cluster_manage_firewall
被设置为false
时,ha_cluster
RHEL 系统角色不管理防火墙。如果您的系统正在运行firewalld
服务,则必须在 playbook 中将该参数设置为true
。您可以使用
ha_cluster_manage_firewall
参数来添加端口,但您无法使用该参数删除端口。要删除端口,请直接使用firewall
系统角色。在 RHEL 9.2 及更高版本中,防火墙不再会被默认配置,因为它仅在
ha_cluster_manage_firewall
设为true
时才进行配置。ha_cluster_manage_selinux
(RHEL 9.2 及更高版本)一个决定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理属于防火墙高可用性服务的端口的布尔值标志。当ha_cluster_manage_selinux
设为true
时,属于防火墙高可用性服务的端口与 SELinux 端口类型cluster_port_t
相关联。当ha_cluster_manage_selinux
被设置为false
时,ha_cluster
RHEL 系统角色不管理 SELinux。如果您的系统正在运行
selinux
服务,则必须在 playbook 中将此参数设置为true
。防火墙配置是管理 SELinux 的先决条件。如果没有安装防火墙,则管理 SELinux 策略会被跳过。您可以使用
ha_cluster_manage_selinux
参数添加策略,但您无法使用该参数删除策略。要删除策略,请直接使用selinux
RHEL 系统角色。ha_cluster_cluster_present
布尔值标志,如果设为
true
,则会根据传递给角色的变量,决定是否在主机上配置 HA 集群。playbook 中没有指定且不被角色支持的任何集群配置都将丢失。如果
ha_cluster_cluster_present
设为false
,则会从目标主机中删除所有 HA 集群配置。此变量的默认值为
true
。以下示例 playbook 删除了
node1
和node2
上的所有集群配置- hosts: node1 node2 vars: ha_cluster_cluster_present: false roles: - rhel-system-roles.ha_cluster
- hosts: node1 node2 vars: ha_cluster_cluster_present: false roles: - rhel-system-roles.ha_cluster
Copy to Clipboard Copied! ha_cluster_start_on_boot
-
确定是否将集群服务配置为在引导时启动的布尔值标志。此变量的默认值为
true
。 ha_cluster_install_cloud_agents
-
(RHEL 9.5 及更高版本)一个决定是否安装了云环境的资源和隔离代理的布尔值标志。这些代理默认不会安装。另外,您可以使用
ha_cluster_fence_agent_packages
和ha_cluster_extra_packages
变量为云环境指定软件包。此变量的默认值为false
。 ha_cluster_fence_agent_packages
-
要安装的隔离代理软件包列表。此变量的默认值为
fence-agents-all
,fence-virt
。 ha_cluster_extra_packages
要安装的其他软件包列表。此变量的默认值是 no packages。
此变量可用于安装角色未自动安装的其他软件包,如自定义资源代理。
可以将隔离代理指定为这个列表的成员。但是,
ha_cluster_fence_agent_packages
是用于指定隔离代理的推荐的角色变量,因此其默认值会被覆盖。ha_cluster_hacluster_password
-
指定
hacluster
用户的密码的字符串值。hacluster
用户对集群具有完全访问权限。为保护敏感数据,vault 会加密密码,如使用 Ansible Vault 加密内容 中所述。没有默认密码值,必须指定此变量。 ha_cluster_hacluster_qdevice_password
-
(RHEL 9.3 及更高版本)指定仲裁设备的
hacluster
用户的密码的字符串值。只有在ha_cluster_quorum
参数被配置为使用类型net
的仲裁设备,且仲裁设备上hacluster
用户的密码与ha_cluster_hacluster_password
参数指定的hacluster
用户的密码不同时,才需要此参数。hacluster
用户对集群具有完全访问权限。为保护敏感数据,vault 会加密密码,如使用 Ansible Vault 加密内容 中所述。此密码没有默认值。 ha_cluster_corosync_key_src
Corosync
authkey
文件的路径,它是 Corosync 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的authkey
值。密钥应为 256 字节的随机数据。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。
如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys
。此变量的默认值为 null。
ha_cluster_pacemaker_key_src
Pacemaker
authkey
文件的路径,它是 Pacemaker 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的authkey
值。密钥应为 256 字节的随机数据。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。
如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys
。此变量的默认值为 null。
ha_cluster_fence_virt_key_src
fence-virt
或fence-xvm
预共享密钥文件的路径,它是fence-virt
或fence-xvm
隔离代理验证密钥的位置。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。如果
ha_cluster
RHEL 系统角色以这种方式生成一个新密钥,则您应该将密钥复制到节点的 hypervisor ,以确保隔离正常工作。如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys
。此变量的默认值为 null。
ha_cluster_pcsd_public_key_srcr
,ha_cluster_pcsd_private_key_src
pcsd
TLS 证书和私钥的路径。如果没有指定,则使用节点上已存在的证书密钥对。如果没有证书密钥对,则会生成一个随机的新密钥对。如果为此变量指定了私钥值,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果设置了这些变量,则将忽略此证书密钥对的
ha_cluster_regenerate_keys
。这些变量的默认值为 null。
ha_cluster_pcsd_certificates
(RHEL 9.2 及更高版本)使用
certificate
RHEL 系统角色创建pcsd
私钥和证书。如果您的系统没有使用
pcsd
私钥和证书配置,则您可以使用以下两种方式之一创建它们:-
设置
ha_cluster_pcsd_certificates
变量。当您设置了ha_cluster_pcsd_certificates
变量时,certificate
RHEL 系统角色在内部使用,并按照定义为pcsd
创建私钥和证书。 -
不要设置
ha_cluster_pcsd_public_key_src
、ha_cluster_pcsd_private_key_src
或ha_cluster_pcsd_certificates
变量。如果没有设置这些变量中的任何一个,则ha_cluster
RHEL 系统角色将通过pcsd
本身创建pcsd
证书。ha_cluster_pcsd_certificates
的值被设置为变量certificate_requests
的值,如certificate
RHEL 系统角色中所指定的。有关certificate
RHEL 系统角色的更多信息,请参阅 使用 RHEL 系统角色请求证书。
-
设置
以下操作注意事项适用于
ha_cluster_pcsd_certificate
变量的使用:-
除非您使用 IPA 并将系统加入到 IPA 域,否则
certificate
RHEL 系统角色会创建自签名证书。在这种情况下,您必须在 RHEL 系统角色上下文之外明确配置信任设置。系统角色不支持配置信任设置。 -
当您设置
ha_cluster_pcsd_certificates
变量时,不要设置ha_cluster_pcsd_public_key_src
和ha_cluster_pcsd_private_key_src
变量。 -
当您设置
ha_cluster_pcsd_certificates
变量时,此证书-密钥对会忽略ha_cluster_regenerate_keys
。
-
除非您使用 IPA 并将系统加入到 IPA 域,否则
此变量的默认值为
[]
。有关在高可用性集群中创建 TLS 证书和密钥文件的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 为高可用性集群创建 pcsd TLS 证书和密钥文件。ha_cluster_regenerate_keys
-
布尔值标志,当设为
true
时,决定将重新生成预共享密钥和 TLS 证书。有关重新生成密钥和证书的更多信息,请参阅ha_cluster_corosync_key_src
、ha_cluster_pacemaker_key_src
ha_cluster_fence_virt_key_src
、ha_cluster_pcsd_public_key_src
和ha_cluster_pcsd_private_key_src
变量的描述。 -
此变量的默认值为
false
。 ha_cluster_pcs_permission_list
配置使用
pcsd
管理集群的权限。您使用这个变量配置的项目如下:-
type
-用户
或组
-
name
- 用户或组名称 allow_list
- 对指定的用户或组允许的操作:-
read
- 查看集群状态和设置 -
write
- 修改集群设置,权限和 ACL 除外 -
grant
- 修改集群权限和 ACL -
full
- 对集群的无限制访问,包括添加和删除节点,以及访问密钥和证书
-
-
ha_cluster_pcs_permission_list
变量的结构及其默认值如下:ha_cluster_pcs_permission_list: - type: group name: hacluster allow_list: - grant - read - write
ha_cluster_pcs_permission_list: - type: group name: hacluster allow_list: - grant - read - write
Copy to Clipboard Copied! ha_cluster_cluster_name
-
集群的名称。这是一个字符串值,默认值为
my-cluster
。 ha_cluster_transport
(RHEL 9.1 及更高版本) 设置集群传输方法。您使用这个变量配置的项目如下:
-
type
(可选) - 传输类型:knet
,udp
, 或udpu
。udp
和udpu
传输类型只支持一个链接。对于udp
和udpu
,始终禁用加密。若未指定,则默认为knet
。 -
options
(可选)- 带有传输选项的“名称-值”的字典列表。 -
links
(可选)- “名称-值”的字典列表。每个 name-value 字典列表都包含适用于一个 Corosync 链接的选项。建议您为每个链接设置linknumber
值。否则,第一个字典列表被默认分配给第一个链接,第二个分配给第二个链接,以此类推。 -
compression
(可选)- 配置传输压缩的 name-value 字典列表。仅支持knet
传输类型。 -
crypto
(可选)- 配置传输加密的 name-value 字典列表。默认情况下启用加密。仅支持knet
传输类型。
-
有关允许的选项列表,请查看
pcs -h cluster setup
帮助页或pcs
(8) 手册页的cluster
部分中的setup
描述。有关更详细的描述,请查看corosync.conf
(5) man page。ha_cluster_transport
变量的结构如下:ha_cluster_transport: type: knet options: - name: option1_name value: option1_value - name: option2_name value: option2_value links: - - name: option1_name value: option1_value - name: option2_name value: option2_value - - name: option1_name value: option1_value - name: option2_name value: option2_value compression: - name: option1_name value: option1_value - name: option2_name value: option2_value crypto: - name: option1_name value: option1_value - name: option2_name value: option2_value
ha_cluster_transport: type: knet options: - name: option1_name value: option1_value - name: option2_name value: option2_value links: - - name: option1_name value: option1_value - name: option2_name value: option2_value - - name: option1_name value: option1_value - name: option2_name value: option2_value compression: - name: option1_name value: option1_value - name: option2_name value: option2_value crypto: - name: option1_name value: option1_value - name: option2_name value: option2_value
Copy to Clipboard Copied! 有关配置传输方法的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。ha_cluster_totem
(RHEL 9.1 及更高版本) 配置 Corosync totem。有关允许的选项列表,请查看
pcs -h cluster setup
帮助页或pcs
(8) 手册页的cluster
部分中的setup
描述。有关更详细的说明,请查看corosync.conf
(5) man page。ha_cluster_totem
变量的结构如下:ha_cluster_totem: options: - name: option1_name value: option1_value - name: option2_name value: option2_value
ha_cluster_totem: options: - name: option1_name value: option1_value - name: option2_name value: option2_value
Copy to Clipboard Copied! 有关配置 Corosync totem 的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。ha_cluster_quorum
(RHEL 9.1 及更高版本) 配置集群仲裁。您可以为集群仲裁配置以下项目:
-
options
(可选)- 配置仲裁的名称-值字典的列表。允许的选项有:auto_tie_breaker
、last_man_standing
、last_man_standing_window
和wait_for_all
。有关仲裁选项的详情,请查看votequorum
(5)手册页。 device
(可选)- (RHEL 9.2 及更高版本)将集群配置为使用仲裁设备。默认情况下,不使用仲裁设备。-
model
(必需)- 指定仲裁设备型号。仅支持net
model_options
(可选)- 配置指定仲裁设备型号的名称-值字典的列表。对于型号net
,您必须指定host
和algorithm
选项。使用
pcs-address
选项设置连接到qnetd
主机的自定义pcsd
地址和端口。如果没有指定这个选项,角色会连接到主机
上的默认pcsd
端口。-
generic_options
(可选)- 不特定于型号的名称0值字典设置仲裁设备选项的列表。 heuristics_options
(可选)- 配置仲裁设备启发式的名称-值字典的列表。有关仲裁设备选项的详情,请查看
corosync-qdevice
(8)手册页。通用选项为sync_timeout
和timeout
。有关型号net
选项,请查看quorum.device.net
部分。有关启发式选项,请查看quorum.device.heuristics
部分。要重新生成仲裁设备 TLS 证书,请将
ha_cluster_regenerate_keys
变量设置为true
。
-
-
ha_cluster_quorum
变量的结构如下:ha_cluster_quorum: options: - name: option1_name value: option1_value - name: option2_name value: option2_value device: model: string model_options: - name: option1_name value: option1_value - name: option2_name value: option2_value generic_options: - name: option1_name value: option1_value - name: option2_name value: option2_value heuristics_options: - name: option1_name value: option1_value - name: option2_name value: option2_value
ha_cluster_quorum: options: - name: option1_name value: option1_value - name: option2_name value: option2_value device: model: string model_options: - name: option1_name value: option1_value - name: option2_name value: option2_value generic_options: - name: option1_name value: option1_value - name: option2_name value: option2_value heuristics_options: - name: option1_name value: option1_value - name: option2_name value: option2_value
Copy to Clipboard Copied! 有关配置集群仲裁的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。有关使用仲裁设备配置集群的ha_cluster
RHEL 系统角色的 playbook 的示例,请参阅 使用仲裁设备配置高可用性集群。ha_cluster_sbd_enabled
-
(RHEL 9.1 和更高版本) 一个布尔值标记,它决定集群是否可以使用 SBD 节点隔离机制。此变量的默认值为
false
。有关启用 SBD 的ha_cluster
系统角色 playbook 的示例,请参阅 使用 ha_cluster_node_options 变量配置具有 SBD 节点隔离的高可用性集群,并 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群。 ha_cluster_sbd_options
(RHEL 9.1 及更高版本) 指定 SBD 选项的 name-value 字典列表。有关这些选项的详情,请参考
sbd
(8)手册页中的Configuration via environment
部分。支持的选项包括:
-
delay-start
- 默认为false
,记录为SBD_DELAY_START
-
startmode
- 默认为always
,记录为SBD_START_MODE
-
timeout-action
- 默认为flush,reboot
,记录为SBD_TIMEOUT_ACTION
-
watchdog-timeout
- 默认为5
,记录为SBD_WATCHDOG_TIMEOUT
-
Watchdog 和 SBD 设备可以在节点到节点的基础上配置为以下两个变量之一:
-
ha_cluster_node_options
,您可以在 playbook 文件中定义(RHEL 9.5 及更高版本)。有关使用ha_cluster_node_options
变量逐个节点配置 SBD 选项的ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 使用 ha_cluster_node_options 变量配置具有 SBD 节点隔离的高可用性集群。 -
ha_cluster
,您可以在清单文件中定义。有关在清单文件中将节点配置为节点 SBD 选项的示例的流程,请参阅 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群。
-
ha_cluster_cluster_properties
Pacemaker 集群范围配置的集群属性集列表。仅支持一组集群属性。
一组集群属性的结构如下:
ha_cluster_cluster_properties: - attrs: - name: property1_name value: property1_value - name: property2_name value: property2_value
ha_cluster_cluster_properties: - attrs: - name: property1_name value: property1_value - name: property2_name value: property2_value
Copy to Clipboard Copied! 默认情况下,不设置任何属性。
以下示例 playbook 配置包含
node1
和node2
的集群,并设置stonith-enabled
和no-quorum-policy
集群属性。- hosts: node1 node2 vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: password ha_cluster_cluster_properties: - attrs: - name: stonith-enabled value: 'true' - name: no-quorum-policy value: stop roles: - rhel-system-roles.ha_cluster
- hosts: node1 node2 vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: password ha_cluster_cluster_properties: - attrs: - name: stonith-enabled value: 'true' - name: no-quorum-policy value: stop roles: - rhel-system-roles.ha_cluster
Copy to Clipboard Copied! ha_cluster_node_options
(RHEL 9.4 及更高版本)此变量定义因集群节点而异的设置。它为指定节点设置选项,但不指定哪些节点组成集群。您可以在清单或 playbook 中使用
hosts
参数指定哪些节点组成集群。您使用这个变量配置的项目如下:
-
node_name
(必需)- 为其定义 Pacemaker 节点属性的节点的名称。它必须与为节点而定义的名称相匹配。 -
pcs_address
(可选)- (RHEL 9.5 及更新版本)pcs
用来与节点进行通信的地址。您可以指定名称、FQDN 或 IP 地址。您还可以指定端口。 -
corosync_addresses
(可选)-(RHEL 9.5 及更高版本)Corosync 使用的地址的列表。所有节点必须有相同数量的地址。对于所有节点,地址的顺序必须相同,以便为所有节点在同一位置指定属于特定链接的地址。 -
sbd_watchdog_modules
(可选)-(RHEL 9.5 及更高版本)要加载的 Watchdog 内核模块,其创建/dev/watchdog*
设备。如果没有设置,则默认为空。 -
sbd_watchdog_modules_blocklist
(可选)-(RHEL 9.5 及更高版本)要卸载和阻止的 Watchdog 内核模块。如果没有设置,则默认为空。 -
sbd_watchdog
(可选)-(RHEL 9.5 及更高版本)要被 SBD 使用的 Watchdog 设备。如果没有设置,则默认为/dev/watchdog
。 -
sbd_devices
(可选)-(RHEL 9.5 及更高版本)用于交换 SBD 信息和监控的设备。如果没有设置,则默认为空。总是使用长而稳定的设备名称(/dev/disk/by-id/
)引用设备。 -
attributes
(可选)- 节点的 Pacemaker 节点属性的集合的列表。目前,只支持一个集合。第一个集合被使用,其余集合被忽略。 -
utilization
(可选)-(RHEL 9.5 及更高版本)节点利用率的集合的列表。字段值必须是整数。目前,只支持一个集合。第一个集合被使用,其余集合被忽略。
-
ha_cluster_node_options
变量的结构如下:ha_cluster_node_options: - node_name: node1 pcs_address: node1-address corosync_addresses: - 192.168.1.11 - 192.168.2.11 sbd_watchdog_modules: - module1 - module2 sbd_watchdog_modules_blocklist: - module3 sbd_watchdog: /dev/watchdog2 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 attributes: - attrs: - name: attribute1 value: value1_node1 - name: attribute2 value: value2_node1 utilization: - attrs: - name: utilization1 value: value1_node1 - name: utilization2 value: value2_node1 - node_name: node2 pcs_address: node2-address:2224 corosync_addresses: - 192.168.1.12 - 192.168.2.12 sbd_watchdog_modules: - module1 sbd_watchdog_modules_blocklist: - module3 sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 attributes: - attrs: - name: attribute1 value: value1_node2 - name: attribute2 value: value2_node2 utilization: - attrs: - name: utilization1 value: value1_node2 - name: utilization2 value: value2_node2
ha_cluster_node_options: - node_name: node1 pcs_address: node1-address corosync_addresses: - 192.168.1.11 - 192.168.2.11 sbd_watchdog_modules: - module1 - module2 sbd_watchdog_modules_blocklist: - module3 sbd_watchdog: /dev/watchdog2 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 attributes: - attrs: - name: attribute1 value: value1_node1 - name: attribute2 value: value2_node1 utilization: - attrs: - name: utilization1 value: value1_node1 - name: utilization2 value: value2_node1 - node_name: node2 pcs_address: node2-address:2224 corosync_addresses: - 192.168.1.12 - 192.168.2.12 sbd_watchdog_modules: - module1 sbd_watchdog_modules_blocklist: - module3 sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 attributes: - attrs: - name: attribute1 value: value1_node2 - name: attribute2 value: value2_node2 utilization: - attrs: - name: utilization1 value: value1_node2 - name: utilization2 value: value2_node2
Copy to Clipboard Copied! 默认情况下,没有定义节点选项。
有关包含节点选项配置的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置带有节点属性的高可用性集群。ha_cluster_resource_primitives
此变量定义 RHEL 系统角色配置的 pacemaker 资源,包括隔离资源。您可以为每个资源配置以下项目:
-
id
(必需)- 资源的 ID。 -
agent
(必需)- 资源或隔离代理的名称,如ocf:pacemaker:Dummy
或stonith:fence_xvm
。对于 STONITH 代理,必须指定stonith:
。对于资源代理,可以使用短名称,如Dummy
,而不是ocf:pacemaker:Dummy
。但是,如果安装了多个具有相同短名称的代理,则角色将失败,因为它将无法决定应使用哪个代理。因此,建议您在指定资源代理时使用全名。 -
instance_attrs
(可选) - 资源的实例属性集合列表。目前,只支持一个集合。属性的确切名称和值,以及它们是否是必需的,取决于资源或隔离代理。 -
meta_attrs
(可选) - 资源的元属性集合列表。目前,只支持一个集合。 -
copy_operations_from_agent
(可选)- (RHEL 9.3 及更新版本)资源代理通常会为资源操作定义默认设置,如interval
和timeout
,为特定代理进行了优化。如果此变量设为true
,则这些设置将被复制到资源配置。否则,集群范围的默认值应用到资源。如果您使用ha_cluster_resource_operation_defaults
角色变量为资源定义资源操作默认值,则您可以将其设置为false
。此变量的默认值为true
。 operations
(可选) - 资源操作列表。-
action
(必需)- pacemaker 以及资源或隔离代理定义的操作。 -
attrs
(必需)- 操作选项,必须至少指定一个选项。(RHEL 9.5 及更高版本)
-
-
utilization
(可选)- 资源利用率集合的列表。value
字段必须是整数。只支持一个集合,因此第一个集合被使用,其余集合被忽略。
-
使用
ha_cluster
RHEL 系统角色配置的资源定义的结构如下:- id: resource-id agent: resource-agent instance_attrs: - attrs: - name: attribute1_name value: attribute1_value - name: attribute2_name value: attribute2_value meta_attrs: - attrs: - name: meta_attribute1_name value: meta_attribute1_value - name: meta_attribute2_name value: meta_attribute2_value copy_operations_from_agent: bool operations: - action: operation1-action attrs: - name: operation1_attribute1_name value: operation1_attribute1_value - name: operation1_attribute2_name value: operation1_attribute2_value - action: operation2-action attrs: - name: operation2_attribute1_name value: operation2_attribute1_value - name: operation2_attribute2_name value: operation2_attribute2_value
- id: resource-id agent: resource-agent instance_attrs: - attrs: - name: attribute1_name value: attribute1_value - name: attribute2_name value: attribute2_value meta_attrs: - attrs: - name: meta_attribute1_name value: meta_attribute1_value - name: meta_attribute2_name value: meta_attribute2_value copy_operations_from_agent: bool operations: - action: operation1-action attrs: - name: operation1_attribute1_name value: operation1_attribute1_value - name: operation1_attribute2_name value: operation1_attribute2_value - action: operation2-action attrs: - name: operation2_attribute1_name value: operation2_attribute1_value - name: operation2_attribute2_name value: operation2_attribute2_value
Copy to Clipboard Copied! 默认情况下不定义任何资源。
有关包含资源配置的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群。ha_cluster_resource_groups
此变量定义由系统角色配置的 pacemaker 资源组。您可以为每个资源组配置以下项目:
-
id
(必需)- 组的 ID. -
resources
(必需) - 组的资源列表.每个资源通过其 ID 引用,资源必须在ha_cluster_resource_primitives
变量中定义。必须至少列出一个资源。 -
meta_attrs
(可选) - 组的元属性集合列表。目前,只支持一个集合。
-
使用
ha_cluster
RHEL 系统角色配置的资源组定义的结构如下:ha_cluster_resource_groups: - id: group-id resource_ids: - resource1-id - resource2-id meta_attrs: - attrs: - name: group_meta_attribute1_name value: group_meta_attribute1_value - name: group_meta_attribute2_name value: group_meta_attribute2_value
ha_cluster_resource_groups: - id: group-id resource_ids: - resource1-id - resource2-id meta_attrs: - attrs: - name: group_meta_attribute1_name value: group_meta_attribute1_value - name: group_meta_attribute2_name value: group_meta_attribute2_value
Copy to Clipboard Copied! 默认情况下,不定义任何资源组。
有关包含资源组配置的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群。ha_cluster_resource_clones
此变量定义由系统角色配置的 pacemaker 资源克隆。您可以为资源克隆配置以下项目:
-
resource_id
(必需)- 要克隆的资源.资源必须在ha_cluster_resource_primitives
变量或ha_cluster_resource_groups
变量中定义。 -
promotable
(可选)- 表示要创建的资源克隆是否是可升级的克隆,用true
或false
表示。 -
id
(可选)- 克隆的自定义 ID。如果未指定 ID,将会生成它。如果集群不支持这个选项,则会显示一个警告。 -
meta_attrs
(可选)- 克隆的元属性集合列表。目前,只支持一个集合。
-
使用
ha_cluster
RHEL 系统角色配置的资源克隆定义的结构如下:ha_cluster_resource_clones: - resource_id: resource-to-be-cloned promotable: true id: custom-clone-id meta_attrs: - attrs: - name: clone_meta_attribute1_name value: clone_meta_attribute1_value - name: clone_meta_attribute2_name value: clone_meta_attribute2_value
ha_cluster_resource_clones: - resource_id: resource-to-be-cloned promotable: true id: custom-clone-id meta_attrs: - attrs: - name: clone_meta_attribute1_name value: clone_meta_attribute1_value - name: clone_meta_attribute2_name value: clone_meta_attribute2_value
Copy to Clipboard Copied! 默认情况下,没有定义资源克隆。
有关包含资源克隆配置的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群。ha_cluster_resource_defaults
(RHEL 9.3 及更新版本)此变量定义资源默认值的集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源。您使用
ha_cluster_resource_defaults
变量指定的默认值不会应用到使用它们自己定义值的覆盖它们的资源。只有 meta 属性可以被指定为默认值。
您可以为每个默认值集合配置以下项目:
-
id
(可选)- 默认值集合的 ID。如果没有指定,它会自动生成。 -
rule
(可选)- 使用pcs
语法编写的规则,定义何时以及集合适用于哪些资源。有关指定规则的详情,请查看pcs
(8)手册页中的资源默认值集合创建
部分。 -
score
(可选)- 默认值集合的权重。 -
attrs
(可选)- 作为默认值应用到资源的元数据属性。
-
ha_cluster_resource_defaults
变量的结构如下:ha_cluster_resource_defaults: meta_attrs: - id: defaults-set-1-id rule: rule-string score: score-value attrs: - name: meta_attribute1_name value: meta_attribute1_value - name: meta_attribute2_name value: meta_attribute2_value - id: defaults-set-2-id rule: rule-string score: score-value attrs: - name: meta_attribute3_name value: meta_attribute3_value - name: meta_attribute4_name value: meta_attribute4_value
ha_cluster_resource_defaults: meta_attrs: - id: defaults-set-1-id rule: rule-string score: score-value attrs: - name: meta_attribute1_name value: meta_attribute1_value - name: meta_attribute2_name value: meta_attribute2_value - id: defaults-set-2-id rule: rule-string score: score-value attrs: - name: meta_attribute3_name value: meta_attribute3_value - name: meta_attribute4_name value: meta_attribute4_value
Copy to Clipboard Copied! 有关配置资源默认值的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有资源和资源操作默认值的高可用性集群。ha_cluster_resource_operation_defaults
(RHEL 9.3 及更新版本)此变量定义资源操作默认值集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源和特定的资源操作。使用
ha_cluster_resource_operation_defaults
变量指定的默认值不应用到使用它们自己定义的值覆盖它们的资源操作。默认情况下,ha_cluster
RHEL 系统角色配置资源,来为资源操作定义自己的值。有关使用ha_cluster_resource_operations_defaults
变量覆盖这些默认值的详情,请查看ha_cluster_resource_primitives
中的copy_operations_from_agent
项的描述。只有 meta 属性可以被指定为默认值。
ha_cluster_resource_operations_defaults
变量的结构与ha_cluster_resource_defaults
变量的结构一样,但指定规则的方式除外。有关指定规则来描述集合应用到的资源操作的详情,请查看pcs
(8)手册页中的资源操作默认值集合创建
部分。ha_cluster_stonith_levels
(RHEL 9.4 及更高版本)此变量定义 STONITH 级别,也称为隔离拓扑。隔离级别将集群为使用多个设备来隔离节点。如果一个设备失败了,您可以定义替代设备,且您可以要求多个设备成功执行,来将节点视为成功隔离。有关隔离级别的更多信息,请参阅 配置和管理高可用性集群 中的 配置隔离级别。
您可以在定义隔离级别时配置以下项目:
-
level
(必需)- 尝试隔离级别的顺序。Pacemaker 会按照升序尝试级别,直到一个成功。 -
target
(可选)- 此级别应用到的节点的名称。 您必须指定以下三个选择之一:
-
target_pattern
- 与这个级别应用到的节点名称匹配的 POSIX 扩展正则表达式。 -
target_attribute
- 为此级别应用到的节点设置的节点属性的名称。 -
target_attribute
和target_value
- 为此级别应用到的节点设置的节点属性的名称和值。
-
resouce_ids
(必需)- 必须为此级别尝试的所有隔离资源的列表。默认情况下,没有定义隔离级别。
-
使用
ha_cluster
RHEL 系统角色配置的隔离级别定义的结构如下:ha_cluster_stonith_levels: - level: 1..9 target: node_name target_pattern: node_name_regular_expression target_attribute: node_attribute_name target_value: node_attribute_value resource_ids: - fence_device_1 - fence_device_2 - level: 1..9 target: node_name target_pattern: node_name_regular_expression target_attribute: node_attribute_name target_value: node_attribute_value resource_ids: - fence_device_1 - fence_device_2
ha_cluster_stonith_levels: - level: 1..9 target: node_name target_pattern: node_name_regular_expression target_attribute: node_attribute_name target_value: node_attribute_value resource_ids: - fence_device_1 - fence_device_2 - level: 1..9 target: node_name target_pattern: node_name_regular_expression target_attribute: node_attribute_name target_value: node_attribute_value resource_ids: - fence_device_1 - fence_device_2
Copy to Clipboard Copied! 有关配置隔离默认值的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离级别的高可用性集群。ha_cluster_constraints_location
此变量定义资源位置限制。资源位置限制表示资源可在哪些节点上运行。您可以指定资源 ID 或模式匹配的资源,它们可以匹配多个资源。您可以通过节点名称或规则指定节点。
您可以为资源位置约束配置以下项目:
-
resource
(必需)- 约束应用到的资源规格。 -
node
(必需)- 资源应首选或避免的节点的名称。 -
id
(可选)- 约束 ID。如果未指定,它将自动生成。 options
(可选)- “名称-值”字典列表。score
- 设置约束的权重。-
正
score
值表示资源首选在节点上运行。 -
负
score
值表示资源应避免在节点上运行。 -
score
值为-INFINITY
表示资源必须避免在节点上运行。 -
如果没有指定
score
,分数值默认为INFINITY
。
-
正
-
默认情况下,没有定义资源位置限制。
指定资源 ID 和节点名称的资源位置约束的结构如下:
ha_cluster_constraints_location: - resource: id: resource-id node: node-name id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
ha_cluster_constraints_location: - resource: id: resource-id node: node-name id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
Copy to Clipboard Copied! 您为资源位置约束配置的项目,用于指定资源模式是为资源位置约束配置的相同项目,用于指定资源 ID,但资源规格本身除外。您为资源规格指定的项目如下:
-
pattern
(必需)- POSIX 扩展正则表达式资源 ID 与.
-
指定资源模式和节点名称的资源位置约束结构如下:
ha_cluster_constraints_location: - resource: pattern: resource-pattern node: node-name id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
ha_cluster_constraints_location: - resource: pattern: resource-pattern node: node-name id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
Copy to Clipboard Copied! 您可以为指定资源 ID 和规则的资源位置约束配置以下项目:
resource
(必需)- 约束应用到的资源规格。-
id
(必需)- 资源 ID。 -
role
(可选)- 约束限制的资源角色:Started
、Unpromoted
,Promoted
。
-
-
rule
(必需)- 使用pcs
语法编写的 Constraint 规则。如需更多信息,请参阅pcs
(8)man page的约束位置
部分。 - 指定的其他项目的含义与未指定规则的资源约束相同。
指定资源 ID 和规则的资源位置约束的结构如下:
ha_cluster_constraints_location: - resource: id: resource-id role: resource-role rule: rule-string id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
ha_cluster_constraints_location: - resource: id: resource-id role: resource-role rule: rule-string id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
Copy to Clipboard Copied! 为资源位置约束配置的项目,用于指定资源模式,规则是用于资源位置约束的相同项目,用于指定资源 ID 和规则,但资源规格本身除外。您为资源规格指定的项目如下:
-
pattern
(必需)- POSIX 扩展正则表达式资源 ID 与.
-
指定资源模式和规则的资源位置约束结构如下:
ha_cluster_constraints_location: - resource: pattern: resource-pattern role: resource-role rule: rule-string id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
ha_cluster_constraints_location: - resource: pattern: resource-pattern role: resource-role rule: rule-string id: constraint-id options: - name: score value: score-value - name: resource-discovery value: resource-discovery-value
Copy to Clipboard Copied! 有关创建具有资源约束的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群。ha_cluster_constraints_colocation
此变量定义资源 colocation 约束。资源共存限制表示一个资源的位置取决于另一个资源的位置。存在两种类型的 colocation 约束:两个资源的一个简单 colocation 约束,并为多个资源设置 colocation 约束。
您可以为简单资源托管约束配置以下项目:
resource_follower
(必需)- 应相对于resource_leader
的资源。-
id
(必需)- 资源 ID。 -
role
(可选)- 约束限制的资源角色:Started
、Unpromoted
,Promoted
。
-
resource_leader
(必需)- 集群将决定优先放置此资源的位置,然后决定放置resource_follower
的位置。-
id
(必需)- 资源 ID。 -
role
(可选)- 约束限制的资源角色:Started
、Unpromoted
,Promoted
。
-
-
id
(可选)- 约束 ID。如果未指定,它将自动生成。 options
(可选)- “名称-值”字典列表。score
- 设置约束的权重。-
正
score
值表示资源应该在同一节点上运行。 -
负
score
值表示资源应在不同的节点上运行。 -
score
值为+INFINITY
表示资源必须在同一节点上运行。 -
score
值为-INFINITY
表示资源必须在不同的节点上运行。 -
如果没有指定
score
,分数值默认为INFINITY
。
-
正
默认情况下,没有定义资源 colocation 约束。
简单资源 colocation 约束的结构如下:
ha_cluster_constraints_colocation: - resource_follower: id: resource-id1 role: resource-role1 resource_leader: id: resource-id2 role: resource-role2 id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
ha_cluster_constraints_colocation: - resource_follower: id: resource-id1 role: resource-role1 resource_leader: id: resource-id2 role: resource-role2 id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
Copy to Clipboard Copied! 您可以为资源集托管约束配置以下项目:
resource_sets
(必需)- 资源集合列表。-
resource_ids
(必需)- 资源列表。 -
options
(可选)- “名称/值”字典列表精细调整集合中资源如何被约束处理。
-
-
id
(可选)- Same 值作为简单 colocation 约束。 -
options
(可选)- Same 值作为简单 colocation 约束。
资源集 colocation 约束的结构如下:
ha_cluster_constraints_colocation: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
ha_cluster_constraints_colocation: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
Copy to Clipboard Copied! 有关创建具有资源约束的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群。ha_cluster_constraints_order
此变量定义资源顺序约束。资源顺序限制表示应发生某些资源操作的顺序。有两种资源顺序约束:两个资源的简单顺序约束,以及多个资源的设置顺序约束。
您可以为简单资源顺序约束配置以下项目:
resource_first
(必需)-resource_then
资源依赖的资源。-
id
(必需)- 资源 ID。 -
action
(可选)- 在为resource_then
资源启动操作前必须完成的操作。允许的值:start
、stop
、promote
、demote
。
-
resource_then
(必需)- 依赖资源。-
id
(必需)- 资源 ID。 -
action
(可选)- 资源只能在resource_first
资源执行操作后执行的操作。允许的值:start
、stop
、promote
、demote
。
-
-
id
(可选)- 约束 ID。如果未指定,它将自动生成。 -
options
(可选)- “名称-值”字典列表。
默认情况下,没有定义资源顺序限制。
简单资源顺序约束的结构如下:
ha_cluster_constraints_order: - resource_first: id: resource-id1 action: resource-action1 resource_then: id: resource-id2 action: resource-action2 id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
ha_cluster_constraints_order: - resource_first: id: resource-id1 action: resource-action1 resource_then: id: resource-id2 action: resource-action2 id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
Copy to Clipboard Copied! 您可以为资源集顺序约束配置以下项目:
resource_sets
(必需)- 资源集合列表。-
resource_ids
(必需)- 资源列表。 -
options
(可选)- “名称/值”字典列表精细调整集合中资源如何被约束处理。
-
-
id
(可选)- 相同值作为简单顺序约束。 -
options
(可选)- 相同值作为简单顺序约束。
资源集顺序约束的结构如下:
ha_cluster_constraints_order: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
ha_cluster_constraints_order: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value id: constraint-id options: - name: score value: score-value - name: option-name value: option-value
Copy to Clipboard Copied! 有关创建具有资源限制的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群。ha_cluster_constraints_ticket
此变量定义资源 ticket 约束。资源票据限制表示依赖于特定票据的资源。有两种类型的资源 ticket 约束:一个资源的简单 ticket 约束,多个资源的 ticket 顺序约束。
您可以为简单资源票据约束配置以下项目:
resource
(必需)- 约束应用到的资源规格。-
id
(必需)- 资源 ID。 -
role
(可选)- 约束限制的资源角色:Started
、Unpromoted
,Promoted
。
-
-
ticket
(必需)- 资源所依赖的票据的名称。 -
id
(可选)- 约束 ID。如果未指定,它将自动生成。 options
(可选)- “名称-值”字典列表。-
loss-policy
(可选)- 在撤销 ticket 时要对资源执行的操作。
-
默认情况下,没有定义资源 ticket 约束。
简单资源票据约束的结构如下:
ha_cluster_constraints_ticket: - resource: id: resource-id role: resource-role ticket: ticket-name id: constraint-id options: - name: loss-policy value: loss-policy-value - name: option-name value: option-value
ha_cluster_constraints_ticket: - resource: id: resource-id role: resource-role ticket: ticket-name id: constraint-id options: - name: loss-policy value: loss-policy-value - name: option-name value: option-value
Copy to Clipboard Copied! 您可以为资源集票据约束配置以下项目:
resource_sets
(必需)- 资源集合列表。-
resource_ids
(必需)- 资源列表。 -
options
(可选)- “名称/值”字典列表精细调整集合中资源如何被约束处理。
-
-
ticket
(必需)- 相同值作为一个简单 ticket 约束。 -
id
(可选)- 相同值作为简单票据约束。 -
选项
(可选)- 相同值作为简单票据约束。
资源集 ticket 约束的结构如下:
ha_cluster_constraints_ticket: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value ticket: ticket-name id: constraint-id options: - name: option-name value: option-value
ha_cluster_constraints_ticket: - resource_sets: - resource_ids: - resource-id1 - resource-id2 options: - name: option-name value: option-value ticket: ticket-name id: constraint-id options: - name: option-name value: option-value
Copy to Clipboard Copied! 有关创建具有资源约束的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群。ha_cluster_acls
(RHEL 9.5 及更高版本)此变量定义 ACL 角色、用户和组。
您可以为
acl_roles
配置以下项目:-
id
(必需)- ACL 角色的 ID。 -
description
(可选)- ACL 角色的描述。 permissions
(可选)- ACL 角色权限的列表。-
kind
(必需)- 被授予的访问权限。允许的值有read
、write
和deny
。 -
xpath
(可选)- 在 CIB 中选择权限应用的一个 XML 元素的 XPath 规范。必须准确指定其中一个项目xpath
或reference
。 -
reference
(可选)- 在 CIB 中权限应用的一个 XML 元素的 ID。必须准确指定其中一个项目:xpath 或 reference。ID 必须存在。
-
-
您可以为
acl_users
配置以下项目:-
id
(必需)- ACL 用户的 ID。 -
roles
(可选)- 分配给用户的 ACL 角色 ID 的列表。
-
您可以为
acl_group
配置以下项目:-
id
(必需)- ACL 组的 ID。 -
roles
(可选)- 分配给组的 ACL 角色 ID 的列表。
-
ACL 定义的结构如下:
ha_cluster_acls: acl_roles: - id: role-id-1 description: role description permissions: - kind: access-type xpath: XPath expression - kind: access-type reference: cib-element-id - id: role-id-2 permissions: - kind: access-type xpath: XPath expression acl_users: - id: user-name roles: - role-id-1 - role-id-2 acl_groups: - id: group-name roles: - role-id-2
ha_cluster_acls: acl_roles: - id: role-id-1 description: role description permissions: - kind: access-type xpath: XPath expression - kind: access-type reference: cib-element-id - id: role-id-2 permissions: - kind: access-type xpath: XPath expression acl_users: - id: user-name roles: - role-id-1 - role-id-2 acl_groups: - id: group-name roles: - role-id-2
Copy to Clipboard Copied! 要在集群中启用 ACLS,您必须配置
enable-acl
集群属性:ha_cluster_cluster_properties: - attrs: - name: enable-acl value: 'true'
ha_cluster_cluster_properties: - attrs: - name: enable-acl value: 'true'
Copy to Clipboard Copied! 有关创建具有 ACL 角色、用户和组的集群
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 使用 RHEL 系统角色配置实现访问控制列表(ACLS)的高可用性集群。ha_cluster_alerts
(RHEL 9.5 及更高版本)此变量定义 Pacemaker 警报。
注意ha_cluster
角色将集群配置为调用外部程序来处理警报。您必须提供程序,并将它们分发给集群节点。您可以为
alerts
配置以下项目:-
id
(必需)- 警报的 ID -
ipath
(必需)- 警报代理可执行文件的路径。 -
description
(可选)- 警报的描述。 -
instance_attrs
(可选)- 警报的实例属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。 -
meta_attrs
(可选)- 警报元属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。*recipients
(可选)- 警报接收者的列表。
-
您可以为
recipients
配置以下项目:-
value
(必需)- 接收者的值。 -
id
(可选)- 接收者的 ID。 -
description
(可选)- 接收者的描述。 -
instance_attrs
(可选)- 接收者实例属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。 -
meta_attrs
(可选)- 接收者元属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。
-
警报定义的结构如下:
ha_cluster_alerts: - id: alert1 path: /alert1/path description: Alert1 description instance_attrs: - attrs: - name: alert_attr1_name value: alert_attr1_value meta_attrs: - attrs: - name: alert_meta_attr1_name value: alert_meta_attr1_value recipients: - value: recipient_value id: recipient1 description: Recipient1 description instance_attrs: - attrs: - name: recipient_attr1_name value: recipient_attr1_value meta_attrs: - attrs: - name: recipient_meta_attr1_name value: recipient_meta_attr1_value
ha_cluster_alerts: - id: alert1 path: /alert1/path description: Alert1 description instance_attrs: - attrs: - name: alert_attr1_name value: alert_attr1_value meta_attrs: - attrs: - name: alert_meta_attr1_name value: alert_meta_attr1_value recipients: - value: recipient_value id: recipient1 description: Recipient1 description instance_attrs: - attrs: - name: recipient_attr1_name value: recipient_attr1_value meta_attrs: - attrs: - name: recipient_meta_attr1_name value: recipient_meta_attr1_value
Copy to Clipboard Copied! 有关配置带有警报的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 使用 ha_cluster RHEL 系统角色为高可用性集群配置警报 。ha_cluster_qnetd
(RHEL 9.2 及更高版本)此变量配置一个
qnetd
主机,然后其充当集群的外部仲裁设备。您可以为
qnetd
主机配置以下项目:-
present
(可选)- 如果为true
,则在主机上配置qnetd
实例。如果为false
,请从主机中删除qnetd
配置。默认值为false
。如果将其设置为true
,则必须将ha_cluster_cluster_present
设置为false
。 -
start_on_boot
(可选)- 配置qnetd
实例是否应在引导时自动启动。默认值为true
。 -
regenerate_keys
(可选)- 将此变量设置为true
以重新生成qnetd
TLS 证书。如果重新生成了证书,则必须重新运行角色,以便每个集群再次连接到qnetd
主机,或者手动运行pcs
。
-
您无法在集群节点上运行
qnetd
,因为隔离会破坏qnetd
操作。有关配置使用仲裁设备的集群的
ha_cluster
RHEL 系统角色 playbook 的示例,请参阅 配置使用仲裁设备的集群。
11.2. 为 ha_cluster
RHEL 系统角色指定一个清单
使用 ha_cluster
RHEL 系统角色 playbook 配置 HA 集群时,您可以在清单中为集群配置节点的名称和地址。
对于清单中的每个节点,您可以选择指定以下项目:
-
node_name
- 集群中节点的名称。 -
pcs_address
-pcs
用于与节点进行通信的地址。它可以是名称、FQDN 或 IP 地址,并且可以包含端口号。 -
corosync_addresses
- Corosync 使用的地址列表.组成特定集群的所有节点必须具有相同数量的地址。对于所有节点,地址的顺序必须相同,以便为所有节点在同一位置指定属于特定链接的地址。
以下示例显示了一个具有目标 node1
和 node2
的清单。node1
和 node2
必须是完全限定域名,或者必须能够连接到节点,例如,名称可以通过 /etc/hosts
文件解析。
all: hosts: node1: ha_cluster: node_name: node-A pcs_address: node1-address corosync_addresses: - 192.168.1.11 - 192.168.2.11 node2: ha_cluster: node_name: node-B pcs_address: node2-address:2224 corosync_addresses: - 192.168.1.12 - 192.168.2.12
all:
hosts:
node1:
ha_cluster:
node_name: node-A
pcs_address: node1-address
corosync_addresses:
- 192.168.1.11
- 192.168.2.11
node2:
ha_cluster:
node_name: node-B
pcs_address: node2-address:2224
corosync_addresses:
- 192.168.1.12
- 192.168.2.12
在 RHEL 9.1 及更新的版本中,您可以选择性地为清单中的每个节点配置 watchdog 和 SBD 设备。所有 SBD 设备都必须可以从所有节点共享和访问。每个节点的 watchdog 设备也可以不同。有关在清单文件中配置 SBD 节点隔离的流程示例,请参阅 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群。
11.3. 为高可用性集群创建 pcsd TLS 证书和密钥文件
(RHEL 9.2 及更高版本)集群节点之间的连接使用传输层安全(TLS)加密进行保护。默认情况下,pcsd
守护进程生成自签名证书。但是,对于许多部署,您可能希望将默认证书替换为您公司的证书颁发机构发布的证书,并为 pcsd
应用您的公司证书策略。
您可以使用 ha_cluster
RHEL 系统角色在高可用性集群中创建 TLS 证书和密钥文件。运行此 playbook 时,ha_cluster
RHEL 系统角色在内部使用 certificate
RHEL 系统角色来管理 TLS 证书。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
步骤
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create TLS certificates and key files in a high availability cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_pcsd_certificates: - name: FILENAME common_name: "{{ ansible_hostname }}" ca: self-sign
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create TLS certificates and key files in a high availability cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_pcsd_certificates: - name: FILENAME common_name: "{{ ansible_hostname }}" ca: self-sign
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_pcsd_certificates: <certificate_properties>
-
在
/var/lib/pcsd
中创建自签名pcsd
证书和私钥文件的变量。在本例中,pcsd
证书有文件名FILENAME.crt
,密钥文件名为FILENAME.key
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.4. 配置不运行任何资源的高可用性集群
您可以使用 ha_cluster
系统角色,以简单、自动的方式配置基本集群。创建基本集群后,您可以使用 pcs
命令行界面逐个资源地配置其他集群组件和行为。以下示例流程配置基本的双节点集群,但没有使用最低所需参数配置隔离。
ha_cluster
系统角色替换指定节点上任何现有的群集配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
步骤
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with minimum required parameters and no fencing ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with minimum required parameters and no fencing ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.5. 配置带有隔离和资源的高可用性集群
集群配置的特定组件取决于您的各个需求,这因站点而异。以下示例流程显示了使用 ha_cluster
RHEL 系统角色配置不同集群组件的格式。配置的群集包括隔离设备、集群资源、资源组和克隆的资源。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
步骤
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with fencing and resources ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_resource_primitives: - id: xvm-fencing agent: 'stonith:fence_xvm' instance_attrs: - attrs: - name: pcmk_host_list value: node1 node2 - id: simple-resource agent: 'ocf:pacemaker:Dummy' - id: resource-with-options agent: 'ocf:pacemaker:Dummy' instance_attrs: - attrs: - name: fake value: fake-value - name: passwd value: passwd-value meta_attrs: - attrs: - name: target-role value: Started - name: is-managed value: 'true' operations: - action: start attrs: - name: timeout value: '30s' - action: monitor attrs: - name: timeout value: '5' - name: interval value: '1min' - id: dummy-1 agent: 'ocf:pacemaker:Dummy' - id: dummy-2 agent: 'ocf:pacemaker:Dummy' - id: dummy-3 agent: 'ocf:pacemaker:Dummy' - id: simple-clone agent: 'ocf:pacemaker:Dummy' - id: clone-with-options agent: 'ocf:pacemaker:Dummy' ha_cluster_resource_groups: - id: simple-group resource_ids: - dummy-1 - dummy-2 meta_attrs: - attrs: - name: target-role value: Started - name: is-managed value: 'true' - id: cloned-group resource_ids: - dummy-3 ha_cluster_resource_clones: - resource_id: simple-clone - resource_id: clone-with-options promotable: yes id: custom-clone-id meta_attrs: - attrs: - name: clone-max value: '2' - name: clone-node-max value: '1' - resource_id: cloned-group promotable: yes
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with fencing and resources ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_resource_primitives: - id: xvm-fencing agent: 'stonith:fence_xvm' instance_attrs: - attrs: - name: pcmk_host_list value: node1 node2 - id: simple-resource agent: 'ocf:pacemaker:Dummy' - id: resource-with-options agent: 'ocf:pacemaker:Dummy' instance_attrs: - attrs: - name: fake value: fake-value - name: passwd value: passwd-value meta_attrs: - attrs: - name: target-role value: Started - name: is-managed value: 'true' operations: - action: start attrs: - name: timeout value: '30s' - action: monitor attrs: - name: timeout value: '5' - name: interval value: '1min' - id: dummy-1 agent: 'ocf:pacemaker:Dummy' - id: dummy-2 agent: 'ocf:pacemaker:Dummy' - id: dummy-3 agent: 'ocf:pacemaker:Dummy' - id: simple-clone agent: 'ocf:pacemaker:Dummy' - id: clone-with-options agent: 'ocf:pacemaker:Dummy' ha_cluster_resource_groups: - id: simple-group resource_ids: - dummy-1 - dummy-2 meta_attrs: - attrs: - name: target-role value: Started - name: is-managed value: 'true' - id: cloned-group resource_ids: - dummy-3 ha_cluster_resource_clones: - resource_id: simple-clone - resource_id: clone-with-options promotable: yes id: custom-clone-id meta_attrs: - attrs: - name: clone-max value: '2' - name: clone-node-max value: '1' - resource_id: cloned-group promotable: yes
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_primitives: <cluster_resources>
- 由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
ha_cluster_resource_groups: <resource_groups>
-
由
ha_cluster
RHEL 系统角色配置的资源组定义的列表。 ha_cluster_resource_clones: <resource_clones>
-
ha_cluster
RHEL 系统角色配置的资源克隆定义的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.6. 配置具有资源和资源操作默认值的高可用性集群
(RHEL 9.3 及更高版本)在集群配置中,您可以更改所有资源的资源选项的 Pacemaker 默认值。您还可以更改集群中所有资源操作的默认值。
有关更改资源选项的默认值的详情,请参考 更改资源选项的默认值。有关全局资源操作默认值的详情,请参考 配置全局资源操作默认值。
以下示例流程使用 ha_cluster
RHEL 系统角色创建定义资源和资源操作默认值的高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
步骤
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with fencing and resource operation defaults ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # Set a different resource-stickiness value during # and outside work hours. This allows resources to # automatically move back to their most # preferred hosts, but at a time that # does not interfere with business activities. ha_cluster_resource_defaults: meta_attrs: - id: core-hours rule: date-spec hours=9-16 weekdays=1-5 score: 2 attrs: - name: resource-stickiness value: INFINITY - id: after-hours score: 1 attrs: - name: resource-stickiness value: 0 # Default the timeout on all 10-second-interval # monitor actions on IPaddr2 resources to 8 seconds. ha_cluster_resource_operation_defaults: meta_attrs: - rule: resource ::IPaddr2 and op monitor interval=10s score: INFINITY attrs: - name: timeout value: 8s
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with fencing and resource operation defaults ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # Set a different resource-stickiness value during # and outside work hours. This allows resources to # automatically move back to their most # preferred hosts, but at a time that # does not interfere with business activities. ha_cluster_resource_defaults: meta_attrs: - id: core-hours rule: date-spec hours=9-16 weekdays=1-5 score: 2 attrs: - name: resource-stickiness value: INFINITY - id: after-hours score: 1 attrs: - name: resource-stickiness value: 0 # Default the timeout on all 10-second-interval # monitor actions on IPaddr2 resources to 8 seconds. ha_cluster_resource_operation_defaults: meta_attrs: - rule: resource ::IPaddr2 and op monitor interval=10s score: INFINITY attrs: - name: timeout value: 8s
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_defaults: <resource_defaults>
- 定义资源默认值集合的变量。
ha_cluster_resource_operation_defaults: <resource_operation_defaults>
- 定义资源操作默认值集合的变量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.7. 配置具有隔离级别的高可用性集群
(RHEL 9.4 及更高版本)当您为节点配置多个隔离设备时,您需要为这些设备定义隔离级别,以确定 Pacemaker 将使用设备尝试隔离节点的顺序。有关隔离级别的详情,请参考 配置隔离级别。
以下示例流程使用 ha_cluster
RHEL 系统角色创建定义隔离级别的高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password> fence1_password: <fence1_password> fence2_password: <fence2_password>
cluster_password: <cluster_password> fence1_password: <fence1_password> fence2_password: <fence2_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个 playbook 文件,如
~/playbook.yml
。这个示例 playbook 文件配置一个运行firewalld
和selinux
服务的集群。--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster that defines fencing levels ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_resource_primitives: - id: apc1 agent: 'stonith:fence_apc_snmp' instance_attrs: - attrs: - name: ip value: apc1.example.com - name: username value: user - name: password value: "{{ fence1_password }}" - name: pcmk_host_map value: node1:1;node2:2 - id: apc2 agent: 'stonith:fence_apc_snmp' instance_attrs: - attrs: - name: ip value: apc2.example.com - name: username value: user - name: password value: "{{ fence2_password }}" - name: pcmk_host_map value: node1:1;node2:2 # Nodes have redundant power supplies, apc1 and apc2. Cluster must # ensure that when attempting to reboot a node, both power # supplies # are turned off before either power supply is turned # back on. ha_cluster_stonith_levels: - level: 1 target: node1 resource_ids: - apc1 - apc2 - level: 1 target: node2 resource_ids: - apc1 - apc2
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster that defines fencing levels ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_resource_primitives: - id: apc1 agent: 'stonith:fence_apc_snmp' instance_attrs: - attrs: - name: ip value: apc1.example.com - name: username value: user - name: password value: "{{ fence1_password }}" - name: pcmk_host_map value: node1:1;node2:2 - id: apc2 agent: 'stonith:fence_apc_snmp' instance_attrs: - attrs: - name: ip value: apc2.example.com - name: username value: user - name: password value: "{{ fence2_password }}" - name: pcmk_host_map value: node1:1;node2:2 # Nodes have redundant power supplies, apc1 and apc2. Cluster must # ensure that when attempting to reboot a node, both power # supplies # are turned off before either power supply is turned # back on. ha_cluster_stonith_levels: - level: 1 target: node1 resource_ids: - apc1 - apc2 - level: 1 target: node2 resource_ids: - apc1 - apc2
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_primitives: <cluster_resources>
- 由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
ha_cluster_stonith_levels: <stonith_levels>
- 定义 STONITH 级别,也称为隔离拓扑的变量,它将集群配置为使用多个设备来隔离节点。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.8. 使用资源限制配置高可用性集群
在配置集群时,您可以指定集群资源的行为与应用程序要求保持一致。您可以通过配置资源约束来控制集群资源的行为。
您可以定义以下资源约束的类别:
- 位置约束,期决定资源可在哪些节点上运行。有关位置约束的详情,请参阅 确定资源可在哪些节点上运行。
- 对约束排序,其决定了资源运行的顺序。有关对约束排序的详情,请参考 确定集群资源运行的顺序。
- 托管约束,其根据另一个资源的位置指定资源的位置。有关托管约束的详情,请参考 托管集群资源。
- 票据约束,其指示依赖于特定 Booth 票据的资源。有关 Booth 票据约束的详情,请参考 多站点 Pacemaker 集群。
以下示例流程使用 ha_cluster
RHEL 系统角色创建高可用性集群,其中包括资源位置约束、资源托管约束、资源顺序约束和资源票据约束。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with resource constraints ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # In order to use constraints, we need resources # the constraints will apply to. ha_cluster_resource_primitives: - id: xvm-fencing agent: 'stonith:fence_xvm' instance_attrs: - attrs: - name: pcmk_host_list value: node1 node2 - id: dummy-1 agent: 'ocf:pacemaker:Dummy' - id: dummy-2 agent: 'ocf:pacemaker:Dummy' - id: dummy-3 agent: 'ocf:pacemaker:Dummy' - id: dummy-4 agent: 'ocf:pacemaker:Dummy' - id: dummy-5 agent: 'ocf:pacemaker:Dummy' - id: dummy-6 agent: 'ocf:pacemaker:Dummy' # location constraints ha_cluster_constraints_location: # resource ID and node name - resource: id: dummy-1 node: node1 options: - name: score value: 20 # resource pattern and node name - resource: pattern: dummy-\d+ node: node1 options: - name: score value: 10 # resource ID and rule - resource: id: dummy-2 rule: '#uname eq node2 and date in_range 2022-01-01 to 2022-02-28' # resource pattern and rule - resource: pattern: dummy-\d+ rule: node-type eq weekend and date-spec weekdays=6-7 # colocation constraints ha_cluster_constraints_colocation: # simple constraint - resource_leader: id: dummy-3 resource_follower: id: dummy-4 options: - name: score value: -5 # set constraint - resource_sets: - resource_ids: - dummy-1 - dummy-2 - resource_ids: - dummy-5 - dummy-6 options: - name: sequential value: "false" options: - name: score value: 20 # order constraints ha_cluster_constraints_order: # simple constraint - resource_first: id: dummy-1 resource_then: id: dummy-6 options: - name: symmetrical value: "false" # set constraint - resource_sets: - resource_ids: - dummy-1 - dummy-2 options: - name: require-all value: "false" - name: sequential value: "false" - resource_ids: - dummy-3 - resource_ids: - dummy-4 - dummy-5 options: - name: sequential value: "false" # ticket constraints ha_cluster_constraints_ticket: # simple constraint - resource: id: dummy-1 ticket: ticket1 options: - name: loss-policy value: stop # set constraint - resource_sets: - resource_ids: - dummy-3 - dummy-4 - dummy-5 ticket: ticket2 options: - name: loss-policy value: fence
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster with resource constraints ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # In order to use constraints, we need resources # the constraints will apply to. ha_cluster_resource_primitives: - id: xvm-fencing agent: 'stonith:fence_xvm' instance_attrs: - attrs: - name: pcmk_host_list value: node1 node2 - id: dummy-1 agent: 'ocf:pacemaker:Dummy' - id: dummy-2 agent: 'ocf:pacemaker:Dummy' - id: dummy-3 agent: 'ocf:pacemaker:Dummy' - id: dummy-4 agent: 'ocf:pacemaker:Dummy' - id: dummy-5 agent: 'ocf:pacemaker:Dummy' - id: dummy-6 agent: 'ocf:pacemaker:Dummy' # location constraints ha_cluster_constraints_location: # resource ID and node name - resource: id: dummy-1 node: node1 options: - name: score value: 20 # resource pattern and node name - resource: pattern: dummy-\d+ node: node1 options: - name: score value: 10 # resource ID and rule - resource: id: dummy-2 rule: '#uname eq node2 and date in_range 2022-01-01 to 2022-02-28' # resource pattern and rule - resource: pattern: dummy-\d+ rule: node-type eq weekend and date-spec weekdays=6-7 # colocation constraints ha_cluster_constraints_colocation: # simple constraint - resource_leader: id: dummy-3 resource_follower: id: dummy-4 options: - name: score value: -5 # set constraint - resource_sets: - resource_ids: - dummy-1 - dummy-2 - resource_ids: - dummy-5 - dummy-6 options: - name: sequential value: "false" options: - name: score value: 20 # order constraints ha_cluster_constraints_order: # simple constraint - resource_first: id: dummy-1 resource_then: id: dummy-6 options: - name: symmetrical value: "false" # set constraint - resource_sets: - resource_ids: - dummy-1 - dummy-2 options: - name: require-all value: "false" - name: sequential value: "false" - resource_ids: - dummy-3 - resource_ids: - dummy-4 - dummy-5 options: - name: sequential value: "false" # ticket constraints ha_cluster_constraints_ticket: # simple constraint - resource: id: dummy-1 ticket: ticket1 options: - name: loss-policy value: stop # set constraint - resource_sets: - resource_ids: - dummy-3 - dummy-4 - dummy-5 ticket: ticket2 options: - name: loss-policy value: fence
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_primitives: <cluster_resources>
- 由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
ha_cluster_constraints_location: <location_constraints>
- 定义资源位置约束的变量。
ha_cluster_constraints_colocation: <colocation_constraints>
- 定义资源托管约束的变量。
ha_cluster_constraints_order: <order_constraints>
- 定义资源顺序约束的变量。
ha_cluster_constraints_ticket: <ticket_constraints>
- 定义 Booth 票据约束的变量。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.9. 在高可用性集群中配置 Corosync 值
(RHEL 9.1 及更高版本) corosync.conf
文件提供 Corosync 使用的集群参数,Pacemaker 构建的集群成员资格和消息传递层。对于您的系统配置,您可以更改 corosync.conf
文件中的一些默认参数。通常,您不应该直接编辑 corosync.conf
文件。但是,您可以使用 ha_cluster
RHEL 系统角色配置 Corosync 值。
以下示例流程使用 ha_cluster
RHEL 系统角色创建配置 Corosync 值的高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster that configures Corosync values ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_transport: type: knet options: - name: ip_version value: ipv4-6 links: - - name: linknumber value: 1 - name: link_priority value: 5 - - name: linknumber value: 0 - name: link_priority value: 10 compression: - name: level value: 5 - name: model value: zlib crypto: - name: cipher value: none - name: hash value: none ha_cluster_totem: options: - name: block_unlisted_ips value: 'yes' - name: send_join value: 0 ha_cluster_quorum: options: - name: auto_tie_breaker value: 1 - name: wait_for_all value: 1
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster that configures Corosync values ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_transport: type: knet options: - name: ip_version value: ipv4-6 links: - - name: linknumber value: 1 - name: link_priority value: 5 - - name: linknumber value: 0 - name: link_priority value: 10 compression: - name: level value: 5 - name: model value: zlib crypto: - name: cipher value: none - name: hash value: none ha_cluster_totem: options: - name: block_unlisted_ips value: 'yes' - name: send_join value: 0 ha_cluster_quorum: options: - name: auto_tie_breaker value: 1 - name: wait_for_all value: 1
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_transport: <transport_method>
- 设置集群传输方法的变量。
ha_cluster_totem: <totem_options>
- 配置 Corosync totem 选项的变量。
ha_cluster_quorum: <quorum_options>
- 配置集群仲裁选项的变量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.10. 导出集群配置以创建 RHEL 系统角色 playbook
从 RHEL 9.6 开始,您可以使用 ha_cluster
RHEL 系统角色将集群的 Corosync 配置导出到 ha_cluster
变量中,这些变量可以重定向到角色来重新创建同一集群。如果您没有使用 ha_cluster
创建集群,或者无法访问集群的原始 playbook,您可以使用此功能来构建用于创建集群的新 playbook。
当您使用 ha_cluster
RHEL 系统角色导出集群的配置时,不会导出所有变量。您必须手动修改配置以考虑这些变量。
导出中存在以下变量:
-
ha_cluster_cluster_present
-
ha_cluster_start_on_boot
-
ha_cluster_cluster_name
-
ha_cluster_transport
-
ha_cluster_totem
-
ha_cluster_quorum
-
ha_cluster_node_options
- 仅存在node_name
、corosync_addresses
和pcs_address
选项。
导出中不存在以下变量:
-
ha_cluster_hacluster_password
- 这是角色的强制变量,但不能从现有集群中提取。 -
ha_cluster_corosync_key_src
,ha_cluster_pacemaker_key_src
和ha_cluster_fence_virt_key_src
- 这些变量应包含使用 Corosync 和 Pacemaker 密钥的文件的路径。由于密钥本身没有导出,因此这些变量不会存在于导出中。这些密钥对于每个集群应该是唯一的。 -
ha_cluster_regenerate_keys
- 您应该决定是否使用现有密钥或生成新的密钥。
要导出当前的集群配置,请运行 ha_cluster
RHEL 系统角色并设置 ha_cluster_export_configuration: true
。这会在角色完成集群或 qnetd
主机后触发导出,并将其存储在 ha_cluster_facts
变量中。
默认情况下,ha_cluster_cluster_present
设为 true
,ha_cluster_qnetd.present
设为 false
。这些设置将在指定的主机上重新配置集群,从指定的主机中删除 qnetd
配置,然后导出配置。要在不修改现有配置的情况下触发导出,请使用以下设置运行角色:
- hosts: node1 vars: ha_cluster_cluster_present: null ha_cluster_qnetd: null ha_cluster_export_configuration: true roles: - linux-system-roles.ha_cluster
- hosts: node1
vars:
ha_cluster_cluster_present: null
ha_cluster_qnetd: null
ha_cluster_export_configuration: true
roles:
- linux-system-roles.ha_cluster
以下流程:
-
将群集配置从集群节点
node1
导出到ha_cluster_facts
变量。 -
将
ha_cluster_cluster_present
和ha_cluster_qnetd
变量设置为 null,以确保运行此 playbook 不会修改现有集群配置。 -
使用 Ansible debug 模块显示
ha_cluster_facts
的内容。 -
以 YAML 格式将
ha_cluster_facts
的内容保存到控制节点上的文件,供您在其中编写 playbook。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您之前已将带有配置的高可用性集群配置为导出。
- 您已在控制节点上创建了一个清单文件,如 在 RHEL 9 上准备控制节点 中所述。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Export high availability cluster configuration hosts: node1 Tasks: - name: Export configuration that does not modify existing cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_present: null ha_cluster_qnetd: null ha_cluster_export_configuration: true - name: Print ha_cluster_info_result variable ansible.builtin.debug: var: ha_cluster_facts - name: Save current cluster configuration to a file delegate_to: localhost ansible.builtin.copy: content: "{{ ha_cluster_facts | to_nice_yaml(sort_keys=false) }}" dest: /path/to/file mode: "0640"
--- - name: Export high availability cluster configuration hosts: node1 Tasks: - name: Export configuration that does not modify existing cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_present: null ha_cluster_qnetd: null ha_cluster_export_configuration: true - name: Print ha_cluster_info_result variable ansible.builtin.debug: var: ha_cluster_facts - name: Save current cluster configuration to a file delegate_to: localhost ansible.builtin.copy: content: "{{ ha_cluster_facts | to_nice_yaml(sort_keys=false) }}" dest: /path/to/file mode: "0640"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
hosts: node1
- 包含要导出的集群信息的节点。
ha_cluster_cluster_present: null
- 设置 以指示在指定主机上不更改集群配置。
ha_cluster_qnetd: null
- 设置 以指示在指定主机上不会更改 qnetd 主机配置。
ha_cluster_export_configuration: true
-
一个变量,用来决定导出当前集群配置并将其存储在
ha_cluster_facts
变量中,该变量由ha_cluster_info
模块生成。 ha_cluster_facts
- 包含导出的集群配置的变量。
delegate_to: localhost
- 将控制节点指定为导出配置文件的位置。
Content: "{{ ha_cluster_facts | to_nice_yaml (sort_keys=false)}"}
,dest: /path/to/file
,mode: "0640"
- 将 YAML 格式的配置文件复制到 /path/to/file,将文件权限设置为 0640。
使用您导出到控制节点上的 /path/to/file 的变量为您的系统编写 playbook。
您必须添加
ha_cluster_hacluster_password
变量,因为它是一个必要的变量,但不存在于导出中。(可选)添加ha_cluster_corosync_key_src
,ha_cluster_pacemaker_key_src
,ha_cluster_fence_virt_key_src
, 和ha_cluster_regenerate_keys
变量(如果您的系统需要它们)。这些变量永远不会导出。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
11.11. 使用 ha_cluster
RHEL 系统角色配置实现访问控制列表(ACL)的高可用性集群
(RHEL 9.5 及更高版本)集群的 pcs
管理帐户是 hacluster
。使用访问控制列表(ACL),您可以为除用户 hacluster
以外的特定本地用户授予权限来管理 Pacemaker 集群。此功能的常见用例是限制未经授权的用户访问业务敏感信息。
默认情况下不启用 ACL。因此,所有节点上的 haclient
组的任何成员都对集群 configuratioan 有完全的本地读写权限。不是 haclient
成员的用户没有访问权限。当启用 ACL 时,即使属于 haclient
组成员的用户也只能访问 ACL 为该用户授予的内容。root
和 hacluster
用户帐户始终对集群配置有完全访问权限,即使当启用了 ACL 时。
当您为具有 ACL 的本地用户设置权限时,您可以创建一个为该角色定义权限的角色。然后,您将该角色分配给用户。如果您为同一用户分配了多个角色,则任何拒绝权限优先,然后是写,再然后是读。
以下示例流程使用 ha_cluster
RHEL 系统角色,以自动方式创建一个集群,该集群实施 ACL ,来控制对配置的访问。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with ACLs assigned ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # To use an ACL role permission reference, the reference must exist in CIB. ha_cluster_resource_primitives: - id: not-for-operator agent: 'ocf:pacemaker:Dummy' # ACLs must be enabled (using the enable-acl cluster property) in order to be effective. ha_cluster_cluster_properties: - attrs: - name: enable-acl value: 'true' ha_cluster_acls: acl_roles: - id: operator description: HA cluster operator permissions: - kind: write xpath: //crm_config//nvpair[@name='maintenance-mode'] - kind: deny reference: not-for-operator - id: administrator permissions: - kind: write xpath: /cib acl_users: - id: alice roles: - operator - administrator - id: bob roles: - administrator acl_groups: - id: admins roles: - administrator
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with ACLs assigned ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true # To use an ACL role permission reference, the reference must exist in CIB. ha_cluster_resource_primitives: - id: not-for-operator agent: 'ocf:pacemaker:Dummy' # ACLs must be enabled (using the enable-acl cluster property) in order to be effective. ha_cluster_cluster_properties: - attrs: - name: enable-acl value: 'true' ha_cluster_acls: acl_roles: - id: operator description: HA cluster operator permissions: - kind: write xpath: //crm_config//nvpair[@name='maintenance-mode'] - kind: deny reference: not-for-operator - id: administrator permissions: - kind: write xpath: /cib acl_users: - id: alice roles: - operator - administrator - id: bob roles: - administrator acl_groups: - id: admins roles: - administrator
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_primitives: <cluster resources>
-
为
ha_cluster
RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。 ha_cluster_cluster_properties: <cluster properties>
- Pacemaker 集群范围配置的集群属性集合的列表。
ha_cluster_acls: <dictionary>
- ACL 角色、用户和组值的字典。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.12. 使用 ha_cluster_node_options
变量配置具有 SBD 节点隔离的高可用性集群
您必须配置具有至少一个隔离设备的红帽高可用性集群,以确保当集群中的节点遇到问题时,集群提供的服务仍然可用。如果您的环境不允许远程访问电源开关来隔离集群节点,您可以使用 STONITH 块设备(SBD)配置隔离。此设备通过利用共享块存储交换消息,来为基于 Pacemaker 的集群提供节点隔离机制。SBD 与 Pacemaker 集成,一个 watchdog 设备,以及可选的共享存储,来在需要隔离时安排节点可靠地自行终止。
您可以使用 ha_cluster
RHEL 系统角色,以自动的方式配置 SBD 隔离。使用 ha_cluster
时,您可以使用以下两个变量之一逐个节点地配置 watchdog 和 SBD 设备:
-
ha_cluster_node_options
: (RHEL 9.5 及更高版本)这是您在 playbook 文件中定义的一个变量。它是字典的列表,其中每个字典为一个节点定义选项。 -
ha_cluster
: (RHEL 9.1 及更高版本)一个只为一个节点定义选项的字典。您可以在清单文件中配置ha_cluster
变量。要为每个节点设置不同的值,您可以分别为每个节点定义变量。
如果 ha_cluster_node_options
和 ha_cluster
变量都包含 SBD 选项,则 ha_cluster_node_options
中的选项具有优先权。
这个示例流程使用 playbook 文件中的 ha_cluster_node_options
变量来基于每个节点配置节点地址和 SBD 选项。有关在清单文件中使用 ha_cluster
变量的示例流程,请参阅 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with SBD fencing ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: my_sbd_devices: # This variable is indirectly used by various variables of the ha_cluster RHEL system role. # Its purpose is to define SBD devices once so they do not need # to be repeated several times in the role variables. - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_sbd_enabled: true ha_cluster_sbd_options: - name: delay-start value: 'no' - name: startmode value: always - name: timeout-action value: 'flush,reboot' - name: watchdog-timeout value: 30 ha_cluster_node_options: - node_name: node1 sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: "{{ my_sbd_devices }}" - node_name: node2 sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: "{{ my_sbd_devices }}" # Best practice for setting SBD timeouts: # watchdog-timeout * 2 = msgwait-timeout (set automatically) # msgwait-timeout * 1.2 = stonith-timeout ha_cluster_cluster_properties: - attrs: - name: stonith-timeout value: 72 ha_cluster_resource_primitives: - id: fence_sbd agent: 'stonith:fence_sbd' instance_attrs: - attrs: - name: devices value: "{{ my_sbd_devices | join(',') }}" - name: pcmk_delay_base value: 30
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with SBD fencing ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: my_sbd_devices: # This variable is indirectly used by various variables of the ha_cluster RHEL system role. # Its purpose is to define SBD devices once so they do not need # to be repeated several times in the role variables. - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003 ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_sbd_enabled: true ha_cluster_sbd_options: - name: delay-start value: 'no' - name: startmode value: always - name: timeout-action value: 'flush,reboot' - name: watchdog-timeout value: 30 ha_cluster_node_options: - node_name: node1 sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: "{{ my_sbd_devices }}" - node_name: node2 sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: "{{ my_sbd_devices }}" # Best practice for setting SBD timeouts: # watchdog-timeout * 2 = msgwait-timeout (set automatically) # msgwait-timeout * 1.2 = stonith-timeout ha_cluster_cluster_properties: - attrs: - name: stonith-timeout value: 72 ha_cluster_resource_primitives: - id: fence_sbd agent: 'stonith:fence_sbd' instance_attrs: - attrs: - name: devices value: "{{ my_sbd_devices | join(',') }}" - name: pcmk_delay_base value: 30
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_sbd_enabled: true
- 确定集群是否可以使用 SBD 节点隔离机制的变量。
ha_cluster_sbd_options: <sbd options>
-
指定 SBD 选项的名称-值字典的列表。有关这些选项的详情,请参考您系统上
sbd
(8)手册页的通过环境配置
部分。 ha_cluster_node_options: <node options>
定义因集群节点而异的设置的变量。您可以配置以下 SBD 和 watchdog 项目:
-
sbd_watchdog_modules
- 要载入的模块,其创建/dev/watchdog*
设备。 -
sbd_watchdog_modules_blocklist
- 要卸载和阻止的 Watchdog 内核模块。 -
sbd_watchdog
- SBD 使用的 Watchdog 设备。 -
sbd_devices
- 用于交换 SBD 信息和监控的设备。总是使用长而稳定的设备名称(/dev/disk/by-id/
)引用设备。
-
ha_cluster_cluster_properties: <cluster properties>
- Pacemaker 集群范围配置的集群属性集合的列表。
ha_cluster_resource_primitives: <cluster resources>
-
为
ha_cluster
RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.13. 使用 ha_cluster
变量配置具有 SBD 节点隔离的高可用性集群
您必须配置具有至少一个隔离设备的红帽高可用性集群,以确保当集群中的节点遇到问题时,集群提供的服务仍然可用。如果您的环境不允许远程访问电源开关来隔离集群节点,您可以使用 STONITH 块设备(SBD)配置隔离。此设备通过利用共享块存储交换消息,来为基于 Pacemaker 的集群提供节点隔离机制。SBD 与 Pacemaker 集成,一个 watchdog 设备,以及可选的共享存储,来在需要隔离时安排节点可靠地自行终止。
您可以使用 ha_cluster
RHEL 系统角色,以自动的方式配置 SBD 隔离。使用 ha_cluster
时,您可以使用以下两个变量之一逐个节点地配置 watchdog 和 SBD 设备:
-
ha_cluster_node_options
: (RHEL 9.5 及更高版本)这是您在 playbook 文件中定义的一个变量。它是字典的列表,其中每个字典为一个节点定义选项。 -
ha_cluster
: (RHEL 9.1 及更高版本)一个只为一个节点定义选项的字典。您可以在清单文件中配置ha_cluster
变量。要为每个节点设置不同的值,您可以分别为每个节点定义变量。
如果 ha_cluster_node_options
和 ha_cluster
变量都包含 SBD 选项,则 ha_cluster_node_options
中的选项具有优先权。
如果 ha_cluster_node_options
和 ha_cluster
变量都包含 SBD 选项,则 ha_cluster_node_options
中的选项具有优先权。
以下示例流程使用 ha_cluster
系统角色创建具有 SBD 隔离的高可用性集群。这个示例流程使用清单文件中的 ha_cluster
变量来基于每个节点配置节点地址和 SBD 选项。有关在 playbook 文件中使用 ha_cluster_node_options
变量的示例流程,请参阅 使用 ha_cluster_nodes_options 变量配置具有 SBD 节点隔离的高可用性集群。
ha_cluster
系统角色替换指定节点上任何现有的群集配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
流程
为集群创建一个清单文件,该集群使用
ha_cluster
变量为每个节点配置 watchdog 和 SBD 设备,如下例中所示:all: hosts: node1: ha_cluster: sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000001 - /dev/disk/by-id/000003 node2: ha_cluster: sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003
all: hosts: node1: ha_cluster: sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000001 - /dev/disk/by-id/000003 node2: ha_cluster: sbd_watchdog_modules: - iTCO_wdt sbd_watchdog_modules_blocklist: - ipmi_watchdog sbd_watchdog: /dev/watchdog1 sbd_devices: - /dev/disk/by-id/000001 - /dev/disk/by-id/000002 - /dev/disk/by-id/000003
Copy to Clipboard Copied! 示例清单中指定的 SBD 和 watchdog 设置包括:
sbd_watchdog_modules
-
要载入的 watchdog 内核模块,其创建
/dev/watchdog*
设备。 sbd_watchdog_modules_blocklist
- 要卸载和阻止的 watchdog 内核模块。
sbd_watchdog
- SBD 使用的 watchdog 设备。
sbd_devices
-
用于交换 SBD 消息和监控的设备。总是使用长而稳定的设备名称(
/dev/disk/by-id/
)引用设备。
有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个 playbook 文件,例如
~/playbook.yml
,如下例所示。因为您已在清单中指定了 SBD 和 watchog 变量,因此您不需要在 playbook 中包含它们。--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with sbd fencing devices configured in an inventory file ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_sbd_enabled: true ha_cluster_sbd_options: - name: delay-start value: 'no' - name: startmode value: always - name: timeout-action value: 'flush,reboot' - name: watchdog-timeout value: 30 # Best practice for setting SBD timeouts: # watchdog-timeout * 2 = msgwait-timeout (set automatically) # msgwait-timeout * 1.2 = stonith-timeout ha_cluster_cluster_properties: - attrs: - name: stonith-timeout value: 72 ha_cluster_resource_primitives: - id: fence_sbd agent: 'stonith:fence_sbd' instance_attrs: - attrs: # taken from host_vars # this only works if all nodes have the same sbd_devices - name: devices value: "{{ ha_cluster.sbd_devices | join(',') }}" - name: pcmk_delay_base value: 30
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with sbd fencing devices configured in an inventory file ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_sbd_enabled: true ha_cluster_sbd_options: - name: delay-start value: 'no' - name: startmode value: always - name: timeout-action value: 'flush,reboot' - name: watchdog-timeout value: 30 # Best practice for setting SBD timeouts: # watchdog-timeout * 2 = msgwait-timeout (set automatically) # msgwait-timeout * 1.2 = stonith-timeout ha_cluster_cluster_properties: - attrs: - name: stonith-timeout value: 72 ha_cluster_resource_primitives: - id: fence_sbd agent: 'stonith:fence_sbd' instance_attrs: - attrs: # taken from host_vars # this only works if all nodes have the same sbd_devices - name: devices value: "{{ ha_cluster.sbd_devices | join(',') }}" - name: pcmk_delay_base value: 30
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: cluster_name
- 您要创建的集群的名称。
ha_cluster_hacluster_password: password
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_sbd_enabled: true
- 确定集群是否可以使用 SBD 节点隔离机制的变量。
ha_cluster_sbd_options: sbd options
-
指定 SBD 选项的名称-值字典的列表。有关这些选项的详情,请参考您系统上
sbd
(8)手册页的通过环境配置
部分。 ha_cluster_cluster_properties: cluster properties
- Pacemaker 集群范围配置的集群属性集合的列表。
ha_cluster_resource_primitives: cluster resources
-
为
ha_cluster
RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.14. 使用 RHEL ha_cluster
RHEL 系统角色为高可用性集群配置放置策略
(RHEL 9.5 及更高版本) Pacemaker 集群根据资源分配分数分配资源。默认情况下,如果所有节点上的资源分配分数都相同,则 Pacemaker 会将资源分配给具有最少分配资源的节点。如果集群中的资源使用的节点容量(如内存或 I/O)的比例差异很大,则默认行为可能不是平衡系统工作负载的最佳策略。在这种情况下,您可以通过为节点和资源配置使用属性和放置策略来自定义分配策略。
有关配置使用属性和放置策略的详细信息,请参阅 配置节点放置策略。
这个示例流程使用 ha_cluster
RHEL 系统角色,以自动的方式创建高可用性集群,其配置使用属性来定义放置策略。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with utilization attributes ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_cluster_properties: - attrs: - name: placement-strategy value: utilization ha_cluster_node_options: - node_name: node1 utilization: - attrs: - name: utilization1 value: 1 - name: utilization2 value: 2 - node_name: node2 utilization: - attrs: - name: utilization1 value: 3 - name: utilization2 value: 4 ha_cluster_resource_primitives: - id: resource1 agent: 'ocf:pacemaker:Dummy' utilization: - attrs: - name: utilization1 value: 2 - name: utilization2 value: 3
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with utilization attributes ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_cluster_properties: - attrs: - name: placement-strategy value: utilization ha_cluster_node_options: - node_name: node1 utilization: - attrs: - name: utilization1 value: 1 - name: utilization2 value: 2 - node_name: node2 utilization: - attrs: - name: utilization1 value: 3 - name: utilization2 value: 4 ha_cluster_resource_primitives: - id: resource1 agent: 'ocf:pacemaker:Dummy' utilization: - attrs: - name: utilization1 value: 2 - name: utilization2 value: 3
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_cluster_properties: <cluster properties>
-
Pacemaker 集群范围配置的集群属性集列表。要使利用率生效,必须设置
placement-strategy
属性,并且其值必须与值default
不同。 - ha_cluster_node_options: <node options>
- 定义因集群节点而异的不同设置的变量。
ha_cluster_resource_primitives: <cluster resources>
为
ha_cluster
RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.15. 使用 ha_cluster
RHEL 系统角色为高可用性集群配置警报
(RHEL 9.5 及更高版本)当 Pacemaker 事件发生(如资源或节点故障或配置更改)时,您可能需要执行一些外部操作。例如,您可能想要发送一封电子邮件消息或记录到文件或更新监控系统。
您可以使用警报代理配置系统,来执行外部操作。这些是集群调用的外部程序,其方式与集群调用资源代理的方式相同,以处理资源配置和操作。集群通过环境变量将关于事件的信息传递给代理。
ha_cluster
RHEL 系统角色配置集群,以调用外部程序来处理警报。但是,您必须提供这些程序,并将它们分发到集群节点。
有关报警代理的详情,请参阅 为集群事件触发脚本。
这个示例流程使用 ha_cluster
RHEL 系统角色,以自动配置 Pacemaker 警报的方式创建高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with alerts ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_alerts: - id: alert1 path: /alert1/path description: Alert1 description instance_attrs: - attrs: - name: alert_attr1_name value: alert_attr1_value meta_attrs: - attrs: - name: alert_meta_attr1_name value: alert_meta_attr1_value recipients: - value: recipient_value id: recipient1 description: Recipient1 description instance_attrs: - attrs: - name: recipient_attr1_name value: recipient_attr1_value meta_attrs: - attrs: - name: recipient_meta_attr1_name value: recipient_meta_attr1_value
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Configure a cluster with alerts ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_alerts: - id: alert1 path: /alert1/path description: Alert1 description instance_attrs: - attrs: - name: alert_attr1_name value: alert_attr1_value meta_attrs: - attrs: - name: alert_meta_attr1_name value: alert_meta_attr1_value recipients: - value: recipient_value id: recipient1 description: Recipient1 description instance_attrs: - attrs: - name: recipient_attr1_name value: recipient_attr1_value meta_attrs: - attrs: - name: recipient_meta_attr1_name value: recipient_meta_attr1_value
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_alerts: <alert definitions>
定义 Pacemaker 警报的变量。
-
id
- 警报的 ID。 -
path
- 警报代理可执行文件的路径。 -
description
- 警报的描述信息。 -
instance_attrs
- 警报实例属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。 -
meta_attrs
- 警报元属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。 -
recipients
- 警报接收者的列表。 -
value
- 接收者的值。 -
id
- 接收者的 ID。 -
description
- 接收者的描述。 -
instance_attrs
- 接收者实例属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。 -
meta_attrs
- 接收者元属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
11.16. 使用仲裁设备配置高可用性集群
(RHEL 9.2 及更高版本),当配置单独的仲裁设备时,集群可以保持比标准仲裁规则允许的多的节点故障。仲裁设备充当集群的轻量级仲裁设备。对于偶数节点的集群,建议使用仲裁设备。对于双节点集群,使用仲裁设备可以更好地决定在脑裂情况下保留哪些节点。
有关仲裁设备的详情,请参考 配置仲裁设备。
要使用 ha_cluster
RHEL 系统角色配置具有单独仲裁设备的高可用性集群,首先要设置仲裁设备。设置仲裁设备后,您可以在任意数量的集群中使用该设备。
11.16.1. 配置仲裁设备
要使用 ha_cluster
RHEL 系统角色配置仲裁设备,请按照本例流程中的步骤操作。请注意,您不能在集群节点上运行仲裁设备。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您要用来运行仲裁设备的系统有涵盖 RHEL 和 RHEL High Availability 附加组件的有效订阅。
- 清单文件指定仲裁设备,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook-qdevice.yml
:--- - name: Configure a host with a quorum device hosts: nodeQ vars_files: - ~/vault.yml tasks: - name: Create a quorum device for the cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_present: false ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_qnetd: present: true
--- - name: Configure a host with a quorum device hosts: nodeQ vars_files: - ~/vault.yml tasks: - name: Create a quorum device for the cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_present: false ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_qnetd: present: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_present: false
-
如果设为
false
,则变量决定所有集群配置都将从目标主机中删除。 ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_qnetd: <quorum_device_options>
-
配置
qnetd
主机的变量。
验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook-qdevice.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-qdevice.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook-qdevice.yml
$ ansible-playbook --ask-vault-pass ~/playbook-qdevice.yml
Copy to Clipboard Copied!
11.16.2. 配置一个集群以使用仲裁设备
要将集群配置为使用仲裁设备,请按照示例流程中的步骤操作。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
- 您已配置了一个仲裁设备。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook-cluster-qdevice.yml
:--- - name: Configure a cluster to use a quorum device hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster that uses a quorum device ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_quorum: device: model: net model_options: - name: host value: nodeQ - name: algorithm value: lms
--- - name: Configure a cluster to use a quorum device hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create cluster that uses a quorum device ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_quorum: device: model: net model_options: - name: host value: nodeQ - name: algorithm value: lms
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_quorum: <quorum_parameters>
- 配置集群仲裁的变量,您可以用来指定集群使用仲裁设备。
验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook-cluster-qdevice.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-cluster-qdevice.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook-cluster-qdevice.yml
$ ansible-playbook --ask-vault-pass ~/playbook-cluster-qdevice.yml
Copy to Clipboard Copied!
11.17. 配置具有节点属性的高可用性集群
(RHEL 9.4 及更高版本),您可以使用 Pacemaker 规则使您的配置更动态。例如,您可以使用节点属性根据时间将机器分配给不同的处理组,然后在创建位置约束时使用该属性。
节点属性表达式用于根据节点或节点定义的属性控制资源。有关节点属性的详情,请参考 使用规则确定资源位置。
以下示例流程使用 ha_cluster
RHEL 系统角色创建配置节点属性的高可用性集群。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create a cluster that defines node attributes ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_node_options: - node_name: node1 attributes: - attrs: - name: attribute1 value: value1A - name: attribute2 value: value2A - node_name: node2 attributes: - attrs: - name: attribute1 value: value1B - name: attribute2 value: value2B
--- - name: Create a high availability cluster hosts: node1 node2 vars_files: - ~/vault.yml tasks: - name: Create a cluster that defines node attributes ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_node_options: - node_name: node1 attributes: - attrs: - name: attribute1 value: value1A - name: attribute2 value: value2A - node_name: node2 attributes: - attrs: - name: attribute1 value: value1B - name: attribute2 value: value2B
Copy to Clipboard Copied! ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_node_options: <node_settings>
- 定义因集群节点而异的各种设置的变量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 其他资源
11.18. 使用 ha_cluster
RHEL 系统角色在高可用性集群中配置一个 Apache HTTP 服务器
高可用性型机器通过消除单点失效以及在一个节点停止运作时将服务从一个群集节点切换到另外一个节点来提供高可用性服务。红帽提供了各种用于规划、配置和维护红帽高可用性集群的文档。有关向 Red Hat 集群文档的不同区域提供索引的文章的列表,请参阅 红帽高可用性附加组件文档指南。
以下示例用例使用 ha_cluster
RHEL 系统角色在双节点 Red Hat Enterprise Linux High Availability Add-On 集群中配置主动/被动 Apache HTTP 服务器。在这种情况下,客户端通过浮动 IP 地址访问 Apache HTTP 服务器。Web 服务器在集群的两个节点之一中运行。如果运行 web 服务器的节点出现问题,则 web 服务器会在集群的第二个节点上再次启动,以实现服务中断的最小化。
这个示例使用主机名为 zapc.example.com
的 APC 电源开关。如果集群不使用任何其他隔离代理,则您可以选择在定义 ha_cluster_fence_agent_packages
变量时只列出集群所需的隔离代理。
ha_cluster
RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点。
- 您已配置了具有 XFS 文件系统的 LVM 逻辑卷,如在 在 Pacemaker 集群中配置具有 XFS 文件系统的 LVM 卷 中所述。
- 您已配置了 Apache HTTP 服务器,如 配置 Apache HTTP 服务器 中所述。
- 您的系统包含一个用于隔离群集节点的 APC 电源开关。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:cluster_password: <cluster_password>
cluster_password: <cluster_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create a high availability cluster hosts: z1.example.com z2.example.com vars_files: - ~/vault.yml tasks: - name: Configure active/passive Apache server in a high availability cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_cluster_name: my_cluster ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_fence_agent_packages: - fence-agents-apc-snmp ha_cluster_resource_primitives: - id: myapc agent: stonith:fence_apc_snmp instance_attrs: - attrs: - name: ipaddr value: zapc.example.com - name: pcmk_host_map value: z1.example.com:1;z2.example.com:2 - name: login value: apc - name: passwd value: apc - id: my_lvm agent: ocf:heartbeat:LVM-activate instance_attrs: - attrs: - name: vgname value: my_vg - name: vg_access_mode value: system_id - id: my_fs agent: Filesystem instance_attrs: - attrs: - name: device value: /dev/my_vg/my_lv - name: directory value: /var/www - name: fstype value: xfs - id: VirtualIP agent: IPaddr2 instance_attrs: - attrs: - name: ip value: 198.51.100.3 - name: cidr_netmask value: 24 - id: Website agent: apache instance_attrs: - attrs: - name: configfile value: /etc/httpd/conf/httpd.conf - name: statusurl value: http://127.0.0.1/server-status ha_cluster_resource_groups: - id: apachegroup resource_ids: - my_lvm - my_fs - VirtualIP - Website
--- - name: Create a high availability cluster hosts: z1.example.com z2.example.com vars_files: - ~/vault.yml tasks: - name: Configure active/passive Apache server in a high availability cluster ansible.builtin.include_role: name: redhat.rhel_system_roles.ha_cluster vars: ha_cluster_hacluster_password: "{{ cluster_password }}" ha_cluster_cluster_name: my_cluster ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_fence_agent_packages: - fence-agents-apc-snmp ha_cluster_resource_primitives: - id: myapc agent: stonith:fence_apc_snmp instance_attrs: - attrs: - name: ipaddr value: zapc.example.com - name: pcmk_host_map value: z1.example.com:1;z2.example.com:2 - name: login value: apc - name: passwd value: apc - id: my_lvm agent: ocf:heartbeat:LVM-activate instance_attrs: - attrs: - name: vgname value: my_vg - name: vg_access_mode value: system_id - id: my_fs agent: Filesystem instance_attrs: - attrs: - name: device value: /dev/my_vg/my_lv - name: directory value: /var/www - name: fstype value: xfs - id: VirtualIP agent: IPaddr2 instance_attrs: - attrs: - name: ip value: 198.51.100.3 - name: cidr_netmask value: 24 - id: Website agent: apache instance_attrs: - attrs: - name: configfile value: /etc/httpd/conf/httpd.conf - name: statusurl value: http://127.0.0.1/server-status ha_cluster_resource_groups: - id: apachegroup resource_ids: - my_lvm - my_fs - VirtualIP - Website
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ha_cluster_cluster_name: <cluster_name>
- 您要创建的集群的名称。
ha_cluster_hacluster_password: < password>
-
hacluster
用户的密码。hacluster
用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true
-
确定
ha_cluster
RHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true
-
确定
ha_cluster
RHEL 系统角色是否使用selinux
RHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_fence_agent_packages: <fence_agent_packages>
- 要安装的隔离代理软件包的列表。
ha_cluster_resource_primitives: <cluster_resources>
- 由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
ha_cluster_resource_groups: <resource_groups>
-
由
ha_cluster
RHEL 系统角色配置的资源组定义的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 当您使用
apache
资源代理来管理 Apache 时,它不会使用systemd
。因此,您必须编辑 Apache 提供的logrotate
脚本,使其不使用systemctl
重新加载 Apache。在集群中的每个节点上删除
/etc/logrotate.d/httpd
文件中的以下行:/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
# /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
Copy to Clipboard Copied! 使用以下三行替换您删除的行,将
/var/run/httpd-website.pid
指定为 PID 文件路径,其中 website 是 Apache 资源的名称。在本例中,Apache 资源名称是Website
。/usr/bin/test -f /var/run/httpd-Website.pid >/dev/null 2>/dev/null && /usr/bin/ps -q $(/usr/bin/cat /var/run/httpd-Website.pid) >/dev/null 2>/dev/null && /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd-Website.pid" -k graceful > /dev/null 2>/dev/null || true
/usr/bin/test -f /var/run/httpd-Website.pid >/dev/null 2>/dev/null && /usr/bin/ps -q $(/usr/bin/cat /var/run/httpd-Website.pid) >/dev/null 2>/dev/null && /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd-Website.pid" -k graceful > /dev/null 2>/dev/null || true
Copy to Clipboard Copied!
验证
从集群中的一个节点检查集群的状态。请注意,所有四个资源都运行在同一个节点上,
z1.example.com
。如果发现配置的资源没有运行,则您可以运行
pcs resource debug-start resource
命令来测试资源配置。pcs status
[root@z1 ~]# pcs status Cluster name: my_cluster Last updated: Wed Jul 31 16:38:51 2013 Last change: Wed Jul 31 16:42:14 2013 via crm_attribute on z1.example.com Stack: corosync Current DC: z2.example.com (2) - partition with quorum Version: 1.1.10-5.el7-9abe687 2 Nodes configured 6 Resources configured Online: [ z1.example.com z2.example.com ] Full list of resources: myapc (stonith:fence_apc_snmp): Started z1.example.com Resource Group: apachegroup my_lvm (ocf::heartbeat:LVM-activate): Started z1.example.com my_fs (ocf::heartbeat:Filesystem): Started z1.example.com VirtualIP (ocf::heartbeat:IPaddr2): Started z1.example.com Website (ocf::heartbeat:apache): Started z1.example.com
Copy to Clipboard Copied! 集群启动并运行后,您可以将浏览器指向定义为
IPaddr2
资源的 IP 地址,来查看示例显示,包含简单的单词"Hello"。Hello
Hello
Copy to Clipboard Copied! 要测试运行在
z1.example.com
上的资源组是否可以切换到节点z2.example.com
,请将节点z1.example.com
置于待机
模式,之后该节点将不能再托管资源。pcs node standby z1.example.com
[root@z1 ~]# pcs node standby z1.example.com
Copy to Clipboard Copied! 将节点
z1
置于待机
模式后,从集群中的某个节点检查集群状态。请注意,资源现在都应运行在z2
上。pcs status
[root@z1 ~]# pcs status Cluster name: my_cluster Last updated: Wed Jul 31 17:16:17 2013 Last change: Wed Jul 31 17:18:34 2013 via crm_attribute on z1.example.com Stack: corosync Current DC: z2.example.com (2) - partition with quorum Version: 1.1.10-5.el7-9abe687 2 Nodes configured 6 Resources configured Node z1.example.com (1): standby Online: [ z2.example.com ] Full list of resources: myapc (stonith:fence_apc_snmp): Started z1.example.com Resource Group: apachegroup my_lvm (ocf::heartbeat:LVM-activate): Started z2.example.com my_fs (ocf::heartbeat:Filesystem): Started z2.example.com VirtualIP (ocf::heartbeat:IPaddr2): Started z2.example.com Website (ocf::heartbeat:apache): Started z2.example.com
Copy to Clipboard Copied! 定义的 IP 地址的网页仍会显示,而不中断。
要从
待机
模式中删除z1
,请输入以下命令。pcs node unstandby z1.example.com
[root@z1 ~]# pcs node unstandby z1.example.com
Copy to Clipboard Copied! 注意从
待机
模式中删除节点本身不会导致资源切换到该节点。这将依赖于资源的resource-stickiness
值。有关resource-stickiness
元属性的详情,请参考 配置资源以首选其当前节点。
第 12 章 使用 RHEL 系统角色配置 systemd
日志
使用 journald
RHEL 系统角色,您可以自动化 systemd
日志,并使用 Red Hat Ansible Automation Platform 配置持久性日志记录。
12.1. 使用 journald
RHEL 系统角色配置持久性日志记录
默认情况下,systemd
日志只将日志存储在 /run/log/journal
中的小环缓冲区中,它不是持久的。重新启动系统也会移除日志数据库日志。您可以使用 journald
RHEL 系统角色在多个系统上一致地配置持久性日志记录。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure journald hosts: managed-node-01.example.com tasks: - name: Configure persistent logging ansible.builtin.include_role: name: redhat.rhel_system_roles.journald vars: journald_persistent: true journald_max_disk_size: <size> journald_per_user: true journald_sync_interval: <interval>
--- - name: Configure journald hosts: managed-node-01.example.com tasks: - name: Configure persistent logging ansible.builtin.include_role: name: redhat.rhel_system_roles.journald vars: journald_persistent: true journald_max_disk_size: <size> journald_per_user: true journald_sync_interval: <interval>
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
journald_persistent: true
- 启用持久性日志记录。
journald_max_disk_size: <size>
-
指定日志文件的最大磁盘空间大小(以 MB 为单位),例如
2048
。 journald_per_user: true
-
配置
journald
,以保持每个用户的日志数据独立。 journald_sync_interval: <interval>
以分钟为单位设置同步间隔,例如
1
。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.journald/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 13 章 使用 RHEL 系统角色配置自动崩溃转储
要使用 Ansible 管理 kdump,您可以使用 kdump
角色,这是 RHEL 9 中提供的 RHEL 系统角色之一。
使用 kdump
角色可让您指定保存系统内存内容的位置,以便稍后进行分析。
13.1. 使用 kdump
RHEL 系统角色配置内核崩溃转储机制
内核崩溃转储是诊断和故障排除系统问题的关键功能。当您的系统遇到内核 panic 或其他关键故障时,崩溃内核转储允许您在失败时捕获内核状态的内存转储(内核转储)。
通过使用 Ansible playbook,您可以使用 kdump
RHEL 系统角色在多个系统上设置内核崩溃转储参数。这确保在所有受管节点上 kdump
服务的一致设置。
kdump
系统角色替换了 /etc/kdump.conf
和 /etc/sysconfig/kdump
配置文件中的内容。之前的设置变为角色变量中指定的变量,如果它们没有在角色变量中指定,则会丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring kernel crash dumping hosts: managed-node-01.example.com tasks: - name: Setting the kdump directory. ansible.builtin.include_role: name: redhat.rhel_system_roles.kdump vars: kdump_target: type: raw location: /dev/sda1 kdump_path: /var/crash/vmcore kernel_settings_reboot_ok: true
--- - name: Configuring kernel crash dumping hosts: managed-node-01.example.com tasks: - name: Setting the kdump directory. ansible.builtin.include_role: name: redhat.rhel_system_roles.kdump vars: kdump_target: type: raw location: /dev/sda1 kdump_path: /var/crash/vmcore kernel_settings_reboot_ok: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
kdump_target: <type_and_location>
-
将
vmcore
写到 root 文件系统以外的位置。当type
是 raw 或文件系统时,location
指的是分区(按名称、标签或 UUID)。 kernel_settings_reboot_ok: <true|false>
-
默认值为
false
。如果设置为true
,则系统角色将确定是否需要重新启动受管主机,以使请求的更改生效,并重启它。如果设置为false
,则角色将返回值为true
的变量kernel_settings_reboot_required
,表示需要重启。在这种情况下,用户必须手动重启受管节点。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.kdump/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证内核崩溃转储参数:
ansible managed-node-01.example.com -m command -a 'grep crashkernel /proc/cmdline'
$ ansible managed-node-01.example.com -m command -a 'grep crashkernel /proc/cmdline'
Copy to Clipboard Copied!
第 14 章 使用 RHEL 系统角色永久配置内核参数
您可以使用 kernel_settings
RHEL 系统角色同时在多个客户端上配置内核参数。同时配置具有以下好处:
- 提供带有有效输入设置的友好接口。
- 保留所有预期的内核参数。
从控制计算机运行 kernel_settings
角色后,内核参数将立即应用于受管系统,并在重新启动后保留。
请注意,通过 RHEL 渠道提供的 RHEL 系统角色在默认的 AppStream 存储库中作为 RPM 软件包提供给 RHEL 客户。RHEL 系统角色还可作为通过 Ansible Automation Hub 为客户提供 Ansible 订阅的集合。
14.1. 使用 kernel_settings
RHEL 系统角色应用所选的内核参数
您可以使用 kernel_settings
RHEL 系统角色在多个受管操作系统上远程配置具有持久性效果的各种内核参数。例如,您可以配置:
- 透明巨页,以通过减少管理较小页的开销来提高性能。
- 通过带有回环接口的网络传输的最大数据包大小。
- 对要同时打开的文件的限制。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring kernel settings hosts: managed-node-01.example.com tasks: - name: Configure hugepages, packet size for loopback device, and limits on simultaneously open files. ansible.builtin.include_role: name: redhat.rhel_system_roles.kernel_settings vars: kernel_settings_sysctl: - name: fs.file-max value: 400000 - name: kernel.threads-max value: 65536 kernel_settings_sysfs: - name: /sys/class/net/lo/mtu value: 65000 kernel_settings_transparent_hugepages: madvise kernel_settings_reboot_ok: true
--- - name: Configuring kernel settings hosts: managed-node-01.example.com tasks: - name: Configure hugepages, packet size for loopback device, and limits on simultaneously open files. ansible.builtin.include_role: name: redhat.rhel_system_roles.kernel_settings vars: kernel_settings_sysctl: - name: fs.file-max value: 400000 - name: kernel.threads-max value: 65536 kernel_settings_sysfs: - name: /sys/class/net/lo/mtu value: 65000 kernel_settings_transparent_hugepages: madvise kernel_settings_reboot_ok: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
kernel_settings_sysfs: <list_of_sysctl_settings>
-
sysctl
设置的 YAML 列表,以及您要分配给这些设置的值。 kernel_settings_transparent_hugepages: <value>
-
控制内存子系统透明巨页(THP)设置。您可以禁用 THP 支持(
never
),在系统范围(always
)或MAD_HUGEPAGE
区域内(madvise
)启用它。 kernel_settings_reboot_ok: <true|false>
-
默认值为
false
。如果设置为true
,则系统角色将确定是否需要重新启动受管主机,以使请求的更改生效,并重启它。如果设置为false
,则角色将返回值为true
的变量kernel_settings_reboot_required
,表示需要重启。在这种情况下,用户必须手动重启受管节点。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.kdump/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证受影响的内核参数:
ansible managed-node-01.example.com -m command -a 'sysctl fs.file-max kernel.threads-max net.ipv6.conf.lo.mtu' ansible managed-node-01.example.com -m command -a 'cat /sys/kernel/mm/transparent_hugepage/enabled'
# ansible managed-node-01.example.com -m command -a 'sysctl fs.file-max kernel.threads-max net.ipv6.conf.lo.mtu' # ansible managed-node-01.example.com -m command -a 'cat /sys/kernel/mm/transparent_hugepage/enabled'
Copy to Clipboard Copied!
第 15 章 使用 RHEL 系统角色配置日志记录
您可以使用 logging
RHEL 系统角色,以自动的方式将本地和远程主机配置为记录服务器,以便从多个客户端系统收集日志。
日志记录解决方案提供多种读取日志和多个日志记录输出的方法。
例如,日志记录系统可接受以下输入:
- 本地文件
-
systemd/journal
- 网络上的另一个日志记录系统
另外,日志记录系统还可有以下输出:
-
存储在
/var/log/
目录中本地文件中的日志 - 发送到 Elasticsearch 引擎的日志
- 日志被转发到另一个日志系统
使用 logging
RHEL 系统角色,您可以组合输入和输出,以适应您的场景。例如,您可以配置一个日志解决方案,将来自 日志
的输入存储在本地文件中,而从文件读取的输入则被转发到另一个日志系统,并存储在本地日志文件中。
15.1. 使用 logging
RHEL 系统角色过滤本地日志消息
您可以使用 logging
RHEL 系统角色的基于属性的过滤器根据各种条件过滤本地日志消息。因此,您可以实现,例如:
- 日志清晰度:在高流量环境中,日志可能会快速增长。专注于特定消息(如错误)有助于更快地识别问题。
- 优化的系统性能:过多的日志通常与系统性能下降有关。仅针对重要事件选择的日志可以防止资源耗尽,这样可让您的系统更有效地运行。
- 增强了安全性:通过安全消息,如系统错误和失败的登录进行高效过滤,有助于只捕获相关的日志。这对于检测违规行为和满足合规标准非常重要。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy the logging solution hosts: managed-node-01.example.com tasks: - name: Filter logs based on a specific value they contain ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: files_input type: basics logging_outputs: - name: files_output0 type: files property: msg property_op: contains property_value: error path: /var/log/errors.log - name: files_output1 type: files property: msg property_op: "!contains" property_value: error path: /var/log/others.log logging_flows: - name: flow0 inputs: [files_input] outputs: [files_output0, files_output1]
--- - name: Deploy the logging solution hosts: managed-node-01.example.com tasks: - name: Filter logs based on a specific value they contain ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: files_input type: basics logging_outputs: - name: files_output0 type: files property: msg property_op: contains property_value: error path: /var/log/errors.log - name: files_output1 type: files property: msg property_op: "!contains" property_value: error path: /var/log/others.log logging_flows: - name: flow0 inputs: [files_input] outputs: [files_output0, files_output1]
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
logging_inputs
-
定义日志输入字典的列表。
type: basics
选项涵盖了来自systemd
日志或 Unix 套接字的输入。 logging_outputs
-
定义日志输出字典的列表。
type: files
选项支持在本地文件中存储日志,通常存储在/var/log/
目录中。property: msg
;property: contains
; 和property_value: error
选项指定包含error
字符串的所有日志都存储在/var/log/errors.log
文件中。property: msg
;property: !contains
; 和property_value: error
选项指定所有其他日志都放在/var/log/others.log
文件中。您可以将error
值替换为您要过滤的字符串。 logging_flows
-
定义记录流字典的列表,以指定
logging_inputs
和logging_outputs
之间的关系。inputs: [files_input]
选项指定一个开始处理日志的输入列表。outputs: [files_output0, files_output1]
选项指定一个日志发送到的输出列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在受管节点上,测试
/etc/rsyslog.conf
文件的语法:rsyslogd -N 1
# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.
Copy to Clipboard Copied! 在受管节点上,验证系统是否向日志发送了包含
error
字符串的信息:发送测试信息:
logger error
# logger error
Copy to Clipboard Copied! 查看
/var/log/errors.log
日志,例如:cat /var/log/errors.log Aug 5 13:48:31 hostname root[6778]: error
# cat /var/log/errors.log Aug 5 13:48:31 hostname root[6778]: error
Copy to Clipboard Copied! 其中
hostname
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
15.2. 使用 logging
RHEL 系统角色应用一个远程日志解决方案
您可以使用 logging
RHEL 系统角色配置远程日志解决方案,其中一个或多个客户端从 systemd-journal
服务获取日志,并将其转发到远程服务器。服务器从 remote_rsyslog
和 remote_files
配置接收远程输入,并将日志输出到远程主机名命名的目录中的本地文件中。
因此,您可以涵盖您需要的用例,例如:
- 集中式日志管理:从单一存储点收集、访问和管理多台机器的日志消息,简化了日常监控和故障排除任务。而且,此用例还减少了登录到各个机器来检查日志消息的需要。
- 增强了安全性:将日志消息存储在一个中心位置可增加它们处于安全且防止篡改的环境中的机会。这样的环境可以更轻松地检测和高效地响应安全事件,并满足审计要求。
- 提高了日志分析的效率:关联来自多个系统的日志消息对于快速故障排除跨多个机器或服务的复杂问题非常重要。这样,您可以快速分析,并交叉引用来自不同来源的事件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 在服务器或客户端系统的 SELinux 策略中定义端口,并为这些端口打开防火墙。默认 SELinux 策略包括端口 601、514、6514、10514 和 20514。要使用其他端口,请参阅 在客户端和服务器系统上修改 SELinux 策略。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy the logging solution hosts: managed-node-01.example.com tasks: - name: Configure the server to receive remote input ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: remote_udp_input type: remote udp_ports: [ 601 ] - name: remote_tcp_input type: remote tcp_ports: [ 601 ] logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: flow_0 inputs: [remote_udp_input, remote_tcp_input] outputs: [remote_files_output] - name: Deploy the logging solution hosts: managed-node-02.example.com tasks: - name: Configure the server to output the logs to local files in directories named by remote host names ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: forward_output0 type: forwards severity: info target: <host1.example.com> udp_port: 601 - name: forward_output1 type: forwards facility: mail target: <host1.example.com> tcp_port: 601 logging_flows: - name: flows0 inputs: [basic_input] outputs: [forward_output0, forward_output1]
--- - name: Deploy the logging solution hosts: managed-node-01.example.com tasks: - name: Configure the server to receive remote input ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: remote_udp_input type: remote udp_ports: [ 601 ] - name: remote_tcp_input type: remote tcp_ports: [ 601 ] logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: flow_0 inputs: [remote_udp_input, remote_tcp_input] outputs: [remote_files_output] - name: Deploy the logging solution hosts: managed-node-02.example.com tasks: - name: Configure the server to output the logs to local files in directories named by remote host names ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: forward_output0 type: forwards severity: info target: <host1.example.com> udp_port: 601 - name: forward_output1 type: forwards facility: mail target: <host1.example.com> tcp_port: 601 logging_flows: - name: flows0 inputs: [basic_input] outputs: [forward_output0, forward_output1]
Copy to Clipboard Copied! 示例 playbook 中第一部分中指定的设置包括:
logging_inputs
-
定义日志输入字典的列表。
type: remote
选项涵盖通过网络的来自其他日志记录系统的远程输入。udp_ports: [ 601 ]
选项定义要监控的 UDP 端口号的列表。tcp_ports: [ 601 ]
选项定义要监控的 TCP 端口号的列表。如果设置了udp_ports
和tcp_ports
,则使用udp_ports
,tcp_ports
被丢弃。 logging_outputs
-
定义日志输出字典的列表。
type: remote_files
选项使输出将日志存储到每个远程主机的本地文件中,并且程序名称产生日志。 logging_flows
-
定义记录流字典的列表,以指定
logging_inputs
和logging_outputs
之间的关系。inputs: [remote_udp_input, remote_tcp_input]
选项指定从其开始处理日志的输入的列表。outputs: [remote_files_output]
选项指定日志发送到的输出的列表。
示例 playbook 的第二部分中指定的设置包括:
logging_inputs
-
定义日志输入字典的列表。
type: basics
选项涵盖了来自systemd
日志或 Unix 套接字的输入。 logging_outputs
-
定义日志输出字典的列表。
type: forwards
选项支持通过网络向远程日志服务器发送日志。severity: info
选项指的是具有信息重要性的日志消息。facility: mail
选项指的是生成日志消息的系统程序的类型。target: <host1.example.com>
选项指定远程日志服务器的主机名。udp_port: 601
/tcp_port: 601
选项定义远程日志服务器侦听的 UDP/TCP 端口。 logging_flows
-
定义记录流字典的列表,以指定
logging_inputs
和logging_outputs
之间的关系。inputs: [basic_input]
选项指定从其开始处理日志的输入的列表。outputs: [forward_output0, forward_output1]
选项指定日志发送到的输出的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在客户端和服务器系统上测试
/etc/rsyslog.conf
文件的语法:rsyslogd -N 1
# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf rsyslogd: End of config validation run. Bye.
Copy to Clipboard Copied! 验证客户端系统向服务器发送信息:
在客户端系统中发送测试信息:
logger test
# logger test
Copy to Clipboard Copied! 在服务器系统上,查看
/var/log/<host2.example.com>/messages
日志,例如:cat /var/log/<host2.example.com>/messages Aug 5 13:48:31 <host2.example.com> root[6778]: test
# cat /var/log/<host2.example.com>/messages Aug 5 13:48:31 <host2.example.com> root[6778]: test
Copy to Clipboard Copied! 其中
<host2.example.com>
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
15.3. 使用带有 TLS 的 logging
RHEL 系统角色
传输层安全性(TLS)是一种加密协议,旨在允许通过计算机网络的安全通信。
您可以使用 logging
RHEL 系统角色配置日志消息的安全传输,其中一个或多个客户端从 systemd-journal
服务获取日志,并在使用 TLS 时将它们传送到远程服务器。
通常,在通过不可信或公共网络(如互联网)发送敏感数据时,远程日志记录解决方案中使用用于传输日志的 TLS 。另外,通过在 TLS 中使用证书,您可以确保客户端将日志转发到正确的可信服务器。这可以防止诸如"中间人"这样的攻击。
15.3.1. 配置带有 TLS 的客户端日志
您可以使用 logging
RHEL 系统角色在 RHEL 客户端上配置日志,并使用 TLS 加密将日志传送到远程日志系统。
此流程创建一个私钥和一个证书。接下来,它会在 Ansible 清单中的 clients 组中的所有主机上配置 TLS。TLS 对信息的传输进行加密,确保日志在网络安全传输。
您不必在 playbook 中调用 certificate
RHEL 系统角色来创建证书。当设置了 logging_certificates
变量时,logging
RHEL 系统角色会自动调用它。
要让 CA 能够为创建的证书签名,受管节点必须在 IdM 域中注册。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 受管节点已在 IdM 域中注册。
- 如果要在管理节点上配置的日志服务器运行 RHEL 9.2 或更高版本,且启用了 FIPS 模式,客户端必须支持扩展 Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 强制执行的 TLS 扩展"扩展的主 Secret "。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure remote logging solution using TLS for secure transfer of logs hosts: managed-node-01.example.com tasks: - name: Deploying files input and forwards output with certs ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_certificates: - name: logging_cert dns: ['www.example.com'] ca: ipa principal: "logging/{{ inventory_hostname }}@IDM.EXAMPLE.COM" logging_pki_files: - ca_cert: /local/path/to/ca_cert.pem cert: /local/path/to/logging_cert.pem private_key: /local/path/to/logging_cert.pem logging_inputs: - name: input_name type: files input_log_path: /var/log/containers/*.log logging_outputs: - name: output_name type: forwards target: your_target_host tcp_port: 514 tls: true pki_authmode: x509/name permitted_server: 'server.example.com' logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
--- - name: Configure remote logging solution using TLS for secure transfer of logs hosts: managed-node-01.example.com tasks: - name: Deploying files input and forwards output with certs ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_certificates: - name: logging_cert dns: ['www.example.com'] ca: ipa principal: "logging/{{ inventory_hostname }}@IDM.EXAMPLE.COM" logging_pki_files: - ca_cert: /local/path/to/ca_cert.pem cert: /local/path/to/logging_cert.pem private_key: /local/path/to/logging_cert.pem logging_inputs: - name: input_name type: files input_log_path: /var/log/containers/*.log logging_outputs: - name: output_name type: forwards target: your_target_host tcp_port: 514 tls: true pki_authmode: x509/name permitted_server: 'server.example.com' logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
logging_certificates
-
此参数的值传递给
certificate
RHEL 系统角色中的certificate_requests
,并用来创建一个私钥和证书。 logging_pki_files
使用这个参数,您可以配置日志记录用来查找用于 TLS 的 CA、证书和密钥文件的路径和其他设置,使用以下一个或多个子参数指定:
ca_cert
、ca_cert_src
、cert
、cert_src
、private_key
、private_key_src
和tls
。注意如果您使用
logging_certificates
在受管节点上创建文件,请不要使用ca_cert_src
,cert_src
, 和private_key_src
,它们用来复制不是由logging_certificates
创建的文件。ca_cert
-
表示受管节点上 CA 证书文件的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示受管节点上证书文件的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示受管节点上私钥文件的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
代表控制节点上 CA 证书文件的路径,该路径将复制到目标主机上
ca_cert
指定的位置。如果使用logging_certificates
,请不要使用它。 cert_src
-
表示控制节点上证书文件的路径,其将被复制到目标主机上
cert
指定的位置。如果使用logging_certificates
,请不要使用它。 private_key_src
-
表示控制节点上私钥文件的路径,其将被复制到目标主机上
private_key
指定的位置。如果使用logging_certificates
,请不要使用它。 tls
-
将此参数设置为
true
可确保通过网络安全地传输日志。如果您不想要安全封装器,您可以设置tls: false
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件 -
/usr/share/doc/rhel-system-roles/logging/
目录 -
/usr/share/ansible/roles/rhel-system-roles.certificate/README.md
文件 -
/usr/share/doc/rhel-system-roles/certificate/
目录 - 使用 RHEL 系统角色请求证书。
-
rsyslog.conf (5)
和syslog (3)
手册页
15.3.2. 配置带有 TLS 的服务器日志
您可以使用 logging
RHEL 系统角色在 RHEL 服务器上配置日志,并将它们设置为从使用 TLS 加密的远程日志系统接收日志。
此流程创建一个私钥和一个证书。接下来,它会在 Ansible 清单中 server 组中的所有主机上配置 TLS。
您不必在 playbook 中调用 certificate
RHEL 系统角色来创建证书。logging
RHEL 系统角色会自动调用它。
要让 CA 能够为创建的证书签名,受管节点必须在 IdM 域中注册。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 受管节点已在 IdM 域中注册。
- 如果要在管理节点上配置的日志服务器运行 RHEL 9.2 或更高版本,且启用了 FIPS 模式,客户端必须支持扩展 Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 强制执行的 TLS 扩展"扩展的主 Secret "。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure remote logging solution using TLS for secure transfer of logs hosts: managed-node-01.example.com tasks: - name: Deploying remote input and remote_files output with certs ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_certificates: - name: logging_cert dns: ['www.example.com'] ca: ipa principal: "logging/{{ inventory_hostname }}@IDM.EXAMPLE.COM" logging_pki_files: - ca_cert: /local/path/to/ca_cert.pem cert: /local/path/to/logging_cert.pem private_key: /local/path/to/logging_cert.pem logging_inputs: - name: input_name type: remote tcp_ports: [514] tls: true permitted_clients: ['clients.example.com'] logging_outputs: - name: output_name type: remote_files remote_log_path: /var/log/remote/%FROMHOST%/%PROGRAMNAME:::secpath-replace%.log async_writing: true client_count: 20 io_buffer_size: 8192 logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
--- - name: Configure remote logging solution using TLS for secure transfer of logs hosts: managed-node-01.example.com tasks: - name: Deploying remote input and remote_files output with certs ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_certificates: - name: logging_cert dns: ['www.example.com'] ca: ipa principal: "logging/{{ inventory_hostname }}@IDM.EXAMPLE.COM" logging_pki_files: - ca_cert: /local/path/to/ca_cert.pem cert: /local/path/to/logging_cert.pem private_key: /local/path/to/logging_cert.pem logging_inputs: - name: input_name type: remote tcp_ports: [514] tls: true permitted_clients: ['clients.example.com'] logging_outputs: - name: output_name type: remote_files remote_log_path: /var/log/remote/%FROMHOST%/%PROGRAMNAME:::secpath-replace%.log async_writing: true client_count: 20 io_buffer_size: 8192 logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
logging_certificates
-
此参数的值传递给
certificate
RHEL 系统角色中的certificate_requests
,并用来创建一个私钥和证书。 logging_pki_files
使用这个参数,您可以配置日志记录用来查找用于 TLS 的 CA、证书和密钥文件的路径和其他设置,使用以下一个或多个子参数指定:
ca_cert
、ca_cert_src
、cert
、cert_src
、private_key
、private_key_src
和tls
。注意如果您使用
logging_certificates
在受管节点上创建文件,请不要使用ca_cert_src
,cert_src
, 和private_key_src
,它们用来复制不是由logging_certificates
创建的文件。ca_cert
-
表示受管节点上 CA 证书文件的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示受管节点上证书文件的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示受管节点上私钥文件的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
代表控制节点上 CA 证书文件的路径,该路径将复制到目标主机上
ca_cert
指定的位置。如果使用logging_certificates
,请不要使用它。 cert_src
-
表示控制节点上证书文件的路径,其将被复制到目标主机上
cert
指定的位置。如果使用logging_certificates
,请不要使用它。 private_key_src
-
表示控制节点上私钥文件的路径,其将被复制到目标主机上
private_key
指定的位置。如果使用logging_certificates
,请不要使用它。 tls
-
将此参数设置为
true
可确保通过网络安全地传输日志。如果您不想要安全封装器,您可以设置tls: false
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
15.4. 将 RELP 与 logging
RHEL 系统角色一起使用
可靠的事件日志协议(RELP)是一种通过 TCP 网络记录数据和消息的网络协议。它确保了事件消息的可靠传递,您可以在不容许任何消息丢失的环境中使用它。
RELP 发送者以命令的形式传输日志条目,接收器会在处理后确认它们。为确保一致性,RELP 将事务数保存到传输的命令中,以便进行任何类型的消息恢复。
您可以考虑在 RELP 客户端和 RELP Server 间的远程日志系统。RELP 客户端将日志传送给远程日志系统,RELP 服务器接收由远程日志系统发送的所有日志。要实现这种用例,您可以使用 logging
RHEL 系统角色配置日志系统,来可靠地发送和接收日志条目。
15.4.1. 使用 RELP 配置客户端日志
您可以使用 logging
RHEL 系统角色配置将本地保存的日志消息传输到带有 RELP 的远程日志系统。
此流程对 Ansible 清单中 客户端
组中的所有主机配置 RELP。RELP 配置使用传输层安全(TLS)来加密消息传输,保证日志在网络上安全传输。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure client-side of the remote logging solution using RELP hosts: managed-node-01.example.com tasks: - name: Deploy basic input and RELP output ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: relp_client type: relp target: logging.server.com port: 20514 tls: true ca_cert: /etc/pki/tls/certs/ca.pem cert: /etc/pki/tls/certs/client-cert.pem private_key: /etc/pki/tls/private/client-key.pem pki_authmode: name permitted_servers: - '*.server.example.com' logging_flows: - name: example_flow inputs: [basic_input] outputs: [relp_client]
--- - name: Configure client-side of the remote logging solution using RELP hosts: managed-node-01.example.com tasks: - name: Deploy basic input and RELP output ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: relp_client type: relp target: logging.server.com port: 20514 tls: true ca_cert: /etc/pki/tls/certs/ca.pem cert: /etc/pki/tls/certs/client-cert.pem private_key: /etc/pki/tls/private/client-key.pem pki_authmode: name permitted_servers: - '*.server.example.com' logging_flows: - name: example_flow inputs: [basic_input] outputs: [relp_client]
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
target
- 这是一个必需的参数,用于指定运行远程日志系统的主机名。
port
- 远程日志记录系统正在监听的端口号。
tls
确保日志在网络上安全地传输。如果您不想要安全打包程序,可以将
tls
变量设置为false
。在与 RELP 工作时,默认的tls
参数被设置为 true,且需要密钥/证书和 triplets {ca_cert
、cert
、private_key
} 和/或 {ca_cert_src
,cert_src
,private_key_src
}。-
如果设置了 {
ca_cert_src
,cert_src
,private_key_src
} 三元组,则默认位置/etc/pki/tls/certs
和/etc/pki/tls/private
被用作受管节点上的目的地,以便从控制节点传输文件。在这种情况下,文件名与 triplet 中的原始名称相同 -
如果设置了 {
ca_cert
,cert
,private_key
} 三元组,则文件在日志配置前应位于默认路径上。 - 如果两个三元组都设置了,则文件将从控制节点的本地路径传输到受管节点的特定路径。
-
如果设置了 {
ca_cert
-
表示 CA 证书的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示证书的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示私钥的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
表示复制到受管节点的本地 CA 证书文件路径。如果指定了
ca_cert
,则其被复制到该位置。 cert_src
-
表示复制到受管节点的本地证书文件路径。如果指定了
cert
,则会将其复制到该位置。 private_key_src
-
表示复制到受管节点的本地密钥文件路径。如果指定了
private_key
,则会将其复制到该位置。 pki_authmode
-
接受身份验证模式为
name
或fingerprint
。 permitted_servers
- 日志客户端允许通过 TLS 连接和发送日志的服务器列表。
输入
- 日志输入字典列表。
输出
- 日志输出字典列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
15.4.2. 配置带有 RELP 的服务器日志
您可以使用 logging
RHEL 系统角色配置服务器,以便从带有 RELP 的远程日志记录系统接收日志信息。
此流程对 Ansible 清单中 服务器
组中的所有主机配置 RELP。RELP 配置使用 TLS 加密消息传输,以保证在网络上安全地传输日志。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure server-side of the remote logging solution using RELP hosts: managed-node-01.example.com tasks: - name: Deploying remote input and remote_files output ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: relp_server type: relp port: 20514 tls: true ca_cert: /etc/pki/tls/certs/ca.pem cert: /etc/pki/tls/certs/server-cert.pem private_key: /etc/pki/tls/private/server-key.pem pki_authmode: name permitted_clients: - '*client.example.com' logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: example_flow inputs: [relp_server] outputs: [remote_files_output]
--- - name: Configure server-side of the remote logging solution using RELP hosts: managed-node-01.example.com tasks: - name: Deploying remote input and remote_files output ansible.builtin.include_role: name: redhat.rhel_system_roles.logging vars: logging_inputs: - name: relp_server type: relp port: 20514 tls: true ca_cert: /etc/pki/tls/certs/ca.pem cert: /etc/pki/tls/certs/server-cert.pem private_key: /etc/pki/tls/private/server-key.pem pki_authmode: name permitted_clients: - '*client.example.com' logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: example_flow inputs: [relp_server] outputs: [remote_files_output]
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
port
- 远程日志记录系统正在监听的端口号。
tls
确保日志在网络上安全地传输。如果您不想要安全打包程序,可以将
tls
变量设置为false
。在与 RELP 工作时,默认的tls
参数被设置为 true,且需要密钥/证书和 triplets {ca_cert
、cert
、private_key
} 和/或 {ca_cert_src
,cert_src
,private_key_src
}。-
如果设置了 {
ca_cert_src
,cert_src
,private_key_src
} 三元组,则默认位置/etc/pki/tls/certs
和/etc/pki/tls/private
被用作受管节点上的目的地,以便从控制节点传输文件。在这种情况下,文件名与 triplet 中的原始名称相同 -
如果设置了 {
ca_cert
,cert
,private_key
} 三元组,则文件在日志配置前应位于默认路径上。 - 如果两个三元组都设置了,则文件将从控制节点的本地路径传输到受管节点的特定路径。
-
如果设置了 {
ca_cert
-
表示 CA 证书的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示证书的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示私钥的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
表示复制到受管节点的本地 CA 证书文件路径。如果指定了
ca_cert
,则其被复制到该位置。 cert_src
-
表示复制到受管节点的本地证书文件路径。如果指定了
cert
,则会将其复制到该位置。 private_key_src
-
表示复制到受管节点的本地密钥文件路径。如果指定了
private_key
,则会将其复制到该位置。 pki_authmode
-
接受身份验证模式为
name
或fingerprint
。 permitted_clients
- 日志记录服务器允许通过 TLS 连接和发送日志的客户端列表。
输入
- 日志输入字典列表。
输出
- 日志输出字典列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.logging/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 16 章 使用 RHEL 系统角色,使用 PCP 配置性能监控
Performance Co-Pilot (PCP)是一个系统性能分析工具包。您可以使用它来记录和分析 Red Hat Enterprise Linux 系统上许多组件的性能数据。
您可以使用 metrics
RHEL 系统角色自动安装和配置 PCP,且角色可以配置 Grafana 来视觉化 PCP 指标。
16.1. 使用 metrics
RHEL 系统角色配置 Performance Co-Pilot
您可以使用 Performance Co-Pilot (PCP)监控许多指标,如 CPU 使用率和内存使用率。例如,这有助于识别资源和性能瓶颈。通过使用 metrics
RHEL 系统角色,您可以在多个主机上远程配置 PCP 来记录指标。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Monitoring performance metrics hosts: managed-node-01.example.com tasks: - name: Configure Performance Co-Pilot ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_retention_days: 14 metrics_manage_firewall: true metrics_manage_selinux: true
--- - name: Monitoring performance metrics hosts: managed-node-01.example.com tasks: - name: Configure Performance Co-Pilot ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_retention_days: 14 metrics_manage_firewall: true metrics_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
metrics_retention_days: <number>
-
设置多少天后
pmlogger_daily
systemd 计时器删除旧的 PCP 归档。 metrics_manage_firewall: <true|false>
-
定义角色是否应该在
firewalld
服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为true
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询指标,例如:
ansible managed-node-01.example.com -m command -a 'pminfo -f kernel.all.load'
# ansible managed-node-01.example.com -m command -a 'pminfo -f kernel.all.load'
Copy to Clipboard Copied!
后续步骤
16.2. 使用 metrics
RHEL 系统角色,配置带有身份验证的 Performance Co-Pilot
您可以在 Performance Co-Pilot (PCP)中启用身份验证,以便 pmcd
服务和性能指标域代理(PDMA)可以决定是否允许运行监控工具的用户执行操作。已验证身份的用户有可以访问带有敏感信息的指标的权限。另外,某些代理需要身份验证。例如,bpftrace
代理使用身份验证来识别是否允许用户将 bpftrace
脚本加载到内核中来生成指标。
通过使用 metrics
RHEL 系统角色,您可以在多个主机上远程配置带有身份验证的 PCP 。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:metrics_usr: <username> metrics_pwd: <password>
metrics_usr: <username> metrics_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Monitoring performance metrics hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Configure Performance Co-Pilot ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_retention_days: 14 metrics_manage_firewall: true metrics_manage_selinux: true metrics_username: "{{ metrics_usr }}" metrics_password: "{{ metrics_pwd }}"
--- - name: Monitoring performance metrics hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Configure Performance Co-Pilot ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_retention_days: 14 metrics_manage_firewall: true metrics_manage_selinux: true metrics_username: "{{ metrics_usr }}" metrics_password: "{{ metrics_pwd }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
metrics_retention_days: <number>
-
设置多少天后
pmlogger_daily
systemd 计时器删除旧的 PCP 归档。 metrics_manage_firewall: <true|false>
-
定义角色是否应该在
firewalld
服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为true
。 metrics_username: <username>
-
角色在受管节点本地创建此用户,将凭据添加到
/etc/pcp/passwd.db
Simple Authentication and Security Layer(SASL)数据库中,并在 PCP 中配置身份验证。另外,如果您在 playbook 中设置了metrics_from_bpftrace: true
,则 PCP 使用此帐户注册bpftrace
脚本。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
在安装了
pcp
软件包的主机上,查询需要身份验证的指标:使用您在 playbook 中使用的凭证查询指标:
pminfo -fmdt -h pcp://managed-node-01.example.com?username=<user> proc.fd.count
# pminfo -fmdt -h pcp://managed-node-01.example.com?username=<user> proc.fd.count Password: <password> proc.fd.count inst [844 or "000844 /var/lib/pcp/pmdas/proc/pmdaproc"] value 5
Copy to Clipboard Copied! 如果命令成功,它会返回
proc.fd.count
指标的值。再次运行该命令,但省略用户名,以验证命令是否对未经身份验证的用户失败:
pminfo -fmdt -h pcp://managed-node-01.example.com proc.fd.count
# pminfo -fmdt -h pcp://managed-node-01.example.com proc.fd.count proc.fd.count Error: No permission to perform requested operation
Copy to Clipboard Copied!
后续步骤
16.3. 使用 metrics
RHEL 系统角色设置 Grafana,以监控具有 Performance Co-Pilot 的多个主机
如果您已在多个主机上配置了 Performance Co-Pilot (PCP),您可以使用 Grafana 的一个实例来视觉化这些主机的指标。您可以显示实时数据,如果 PCP 数据存储在 Redis 数据库中,也可以显示过去的数据。
通过使用 metrics
RHEL 系统角色,您可以自动化设置 Grafana、PCP 插件、可选 Redis 数据库以及配置数据源的过程。
如果您使用 metrics
角色在主机上安装 Grafana,则角色也会在这个主机上安装 PCP。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 为远程访问您要监控的主机配置了 PCP 。
- 您要安装 Grafana 的主机可以访问您要监控的 PCP 节点上的端口 44321。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:grafana_admin_pwd: <password>
grafana_admin_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Monitoring performance metrics hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Set up Grafana to monitor multiple hosts ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_graph_service: true metrics_query_service: true metrics_monitored_hosts: - <pcp_host_1.example.com> - <pcp_host_2.example.com> metrics_manage_firewall: true metrics_manage_selinux: true - name: Set Grafana admin password ansible.builtin.shell: cmd: grafana-cli admin reset-admin-password "{{ grafana_admin_pwd }}"
--- - name: Monitoring performance metrics hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Set up Grafana to monitor multiple hosts ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_graph_service: true metrics_query_service: true metrics_monitored_hosts: - <pcp_host_1.example.com> - <pcp_host_2.example.com> metrics_manage_firewall: true metrics_manage_selinux: true - name: Set Grafana admin password ansible.builtin.shell: cmd: grafana-cli admin reset-admin-password "{{ grafana_admin_pwd }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
metrics_graph_service: true
-
安装 Grafana 和 PCP 插件。另外,该角色在 Grafana 中添加了
PCP Vector
、PCP Redis
和PCP bpftrace
数据源。 metrics_query_service: <true|false>
- 定义角色是否应该为集中式指标记录安装和配置 Redis 。如果启用了,从 PCP 客户端收集的数据存储在 Redis 中,因此您还可以显示历史数据,而不是只显示实时数据。
metrics_monitored_hosts: <list_of_hosts>
- 定义要监控的主机的列表。在 Grafana 中,您可以显示这些主机的数据,以及运行 Grafana 的主机。
metrics_manage_firewall: <true|false>
-
定义角色是否应该在
firewalld
服务中打开所需的端口。如果将此变量设置为true
,则您可以远程访问 Grafana。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
-
在您的浏览器中打开
http://<grafana_server_IP_or_hostname>:3000
,并使用您在流程中设置的密码,以admin
用户身份登录。 显示监控数据:
要显示实时数据:
- 点 → → →
-
默认情况下,图形显示运行 Grafana 的主机的指标。要切换到其他主机,请在
hostspec
字段中输入主机名,然后按 Enter 键。
-
要显示存储在 Redis 数据库中的历史数据:创建一个带有 PCP Redis 数据源的面板。这要求您在 playbook 中设置
metrics_query_service: true
。
16.4. 使用 metrics
RHEL 系统角色在 Performance Co-Pilot 中配置 web hook
Performance Co-Pilot (PCP)套件包含性能指标推理引擎(PMIE)服务。此服务实时评估性能规则。例如,您可以使用默认规则来检测过量的交换活动。
您可以将主机配置为一个从多个 PCP 节点收集监控数据的中央 PCP 管理站点。如果规则匹配,此中央主机会向 Web hook 发送一个通知,以通知其他服务。例如,web hook 可以触发事件驱动的 Ansible 在导致事件的主机上的 Ansible Automation Platform 模板或 playbook 上运行。
通过使用 metrics
RHEL 系统角色,您可以自动化配置通知 web hook 的中央 PCP 管理主机。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 为远程访问您要监控的主机配置了 PCP 。
- 您要配置 PMIE 的主机可以访问您要监控的 PCP 节点上的端口 44321。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Monitoring performance metrics hosts: managed-node-01.example.com tasks: - name: Configure PMIE web hooks ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_manage_firewall: true metrics_retention_days: 7 metrics_monitored_hosts: - pcp-node-01.example.com - pcp-node-02.example.com metrics_webhook_endpoint: "https://<webserver>:<port>/<endpoint>"
--- - name: Monitoring performance metrics hosts: managed-node-01.example.com tasks: - name: Configure PMIE web hooks ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_manage_firewall: true metrics_retention_days: 7 metrics_monitored_hosts: - pcp-node-01.example.com - pcp-node-02.example.com metrics_webhook_endpoint: "https://<webserver>:<port>/<endpoint>"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
metrics_retention_days: <number>
-
设置多少天后
pmlogger_daily
systemd 计时器删除旧的 PCP 归档。 metrics_manage_firewall: <true|false>
-
定义角色是否应该在
firewalld
服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为true
。 metrics_monitored_hosts: <list_of_hosts>
- 指定要观察的主机。
metrics_webhook_endpoint: <URL>
- 设置性能指标推理引擎(PMIE)向其发送有关检测到的性能问题的通知的 web hook 端点。默认情况下,这些问题只记录到本地系统。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
检查关于
managed-node-node-01.example.com
的配置概述:ansible managed-node-01.example.com -m command -a 'pcp summary'
# ansible managed-node-01.example.com -m command -a 'pcp summary' Performance Co-Pilot configuration on managed-node-01.example.com: platform: Linux managed-node-node-01.example.com 5.14.0-427.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Feb 23 01:51:18 EST 2024 x86_64 hardware: 8 cpus, 1 disk, 1 node, 1773MB RAM timezone: CEST-2 services: pmcd pmproxy pmcd: Version 6.2.0-1, 12 agents, 6 clients pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2 dm openmetrics pmlogger: primary logger: /var/log/pcp/pmlogger/managed-node-node-01.example.com/20240510.16.25 pcp-node-01.example.com: /var/log/pmlogger/pcp-node-01.example.com/20240510.16.25 pcp-node-02.example.com: /var/log/pmlogger/pcp-node-02.example.com/20240510.16.25 pmie: primary engine: /var/log/pcp/pmie/managed-node-node-01.example.com/pmie.log pcp-node-01.example.com: : /var/log/pcp/pmie/pcp-node-01.example.com/pmie.log pcp-node-02.example.com: : /var/log/pcp/pmie/pcp-node-02.example.com/pmie.log
Copy to Clipboard Copied! 最后三行确认是否 PMIE 被配置为监控三个系统。
第 17 章 使用 RHEL 系统角色配置 NBDE
您可以使用 nbde_client
和 nbde_server
RHEL 系统角色,使用 Clevis 和 Tang 自动部署基于策略的解密(PBD)解决方案。rhel-system-roles
包中包含了这些系统角色、相关的例子以及参考文档。
17.1. 使用 nbde_server
RHEL 系统角色设置多个 Tang 服务器
通过使用 nbde_server
系统角色,您可以部署和管理 Tang 服务器,来作为自动化磁盘加密解决方案的一部分。此角色支持以下功能:
- 轮转 Tang 密钥
- 部署和备份 Tang 密钥
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy a Tang server hosts: tang.server.example.com tasks: - name: Install and configure periodic key rotation ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_server vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true
--- - name: Deploy a Tang server hosts: tang.server.example.com tasks: - name: Install and configure periodic key rotation ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_server vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true
Copy to Clipboard Copied! 此示例 playbook 确保部署 Tang 服务器和密钥轮转。
示例 playbook 中指定的设置包括以下内容:
nbde_server_manage_firewall: true
-
使用
firewall
系统角色管理nbde_server
角色使用的端口。 nbde_server_manage_selinux: true
使用
selinux
系统角色管理nbde_server
角色使用的端口。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_server/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。命令必须返回您为加密和解密传递的相同的消息:
ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt'
# ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' test
Copy to Clipboard Copied!
17.2. 使用 nbde_client
RHEL 系统角色,使用 DHCP 设置 Clevis 客户端
nbde_client
系统角色使您能够以自动化的方式部署多个Clevis客户端。
此角色支持将 LUKS 加密的卷绑定到一个或多个网络绑定(NBDE)服务器 - Tang 服务器。您可以使用密码短语保留现有的卷加密,或者将其删除。删除密码短语后,您只能使用 NBDE 解锁卷。当卷最初是使用在置备系统后会删除的临时密钥或密码进行加密时,这非常有用,
如果您同时提供密语和密钥文件,角色将使用您首先提供的那一个。如果找不到任何有效密语或密码,它将尝试从现有的绑定中检索密码短语。
基于策略的解密(PBD)定义一个绑定,来作为设备到插槽的映射。这意味着对同一个设备你可以有多个绑定。默认插槽是插槽 1。
nbde_client
系统角色只支持 Tang 绑定。因此,您无法将其用于 TPM2 绑定。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 已使用 LUKS 加密的卷。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_client vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile nbde_client_early_boot: true state: present servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com
--- - name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_client vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile nbde_client_early_boot: true state: present servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com
Copy to Clipboard Copied! 这个示例 playbook 配置 Clevis 客户端,以便在两个 Tang 服务器中至少有一个可用时自动解锁两个 LUKS 加密的卷。
示例 playbook 中指定的设置包括以下内容:
state: present
-
state
的值表示运行 playbook 后的配置。使用present
值来创建新绑定或更新现有绑定。与clevis luks bind
命令不同,您可以使用state: present
来覆盖其设备插槽中的现有绑定。absent
的值会删除指定的绑定。 nbde_client_early_boot: true
nbde_client
角色确保 Tang pin 的网络默认在早期引导时可用。如果您需要禁用此功能,请在 playbook 中添加nbde_client_early_boot: false
变量。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在 NBDE 客户端上,检查应该由您的 Tang 服务器自动解锁的加密卷是否在其 LUKS pin 中包含相应的信息:
ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root'
# ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root' 1: tang '{"url":"<http://server1.example.com/>"}' 2: tang '{"url":"<http://server2.example.com/>"}'
Copy to Clipboard Copied! 如果不使用
nbde_client_early_boot: false
变量,请验证绑定是否可用于早期引导,例如:ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks'
# ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks' lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
Copy to Clipboard Copied!
17.3. 使用 nbde_client
RHEL 系统角色设置静态 IP Clevis 客户端
nbde_client
RHEL 系统角色只支持使用动态主机配置协议(DHCP)的情况。在带有静态 IP 配置的 NBDE 客户端上,您必须将网络配置作为内核引导参数传递。
通常,管理员希望重复使用 playbook,且不是为 Ansible 在早期引导过程中为其分配静态 IP 地址的每个主机维护单独的 playbook。在这种情况下,您可以在 playbook 中使用变量,并在外部文件中提供设置。因此,您只需要一个 playbook 和一个带有设置的文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 已使用 LUKS 加密的卷。
流程
使用您主机的网络设置创建一个文件,如
static-ip-settings-clients.yml
,并添加您要动态分配给主机的值:clients: managed-node-01.example.com: ip_v4: 192.0.2.1 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0 managed-node-02.example.com: ip_v4: 192.0.2.2 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0
clients: managed-node-01.example.com: ip_v4: 192.0.2.1 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0 managed-node-02.example.com: ip_v4: 192.0.2.2 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0
Copy to Clipboard Copied! 创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com,managed-node-02.example.com vars_files: - ~/static-ip-settings-clients.yml tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - name: Configure a Clevis client with static IP address during early boot ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: ALL options: - name: ip value: "{{ clients[inventory_hostname]['ip_v4'] }}::{{ clients[inventory_hostname]['gateway_v4'] }}:{{ clients[inventory_hostname]['netmask_v4'] }}::{{ clients[inventory_hostname]['interface'] }}:none"
- name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com,managed-node-02.example.com vars_files: - ~/static-ip-settings-clients.yml tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - name: Configure a Clevis client with static IP address during early boot ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: ALL options: - name: ip value: "{{ clients[inventory_hostname]['ip_v4'] }}::{{ clients[inventory_hostname]['gateway_v4'] }}:{{ clients[inventory_hostname]['netmask_v4'] }}::{{ clients[inventory_hostname]['interface'] }}:none"
Copy to Clipboard Copied! 此 playbook 为
~/static-ip-settings-clients.yml
文件中列出的每个主机动态读取某些值。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 18 章 使用 RHEL 系统角色配置网络设置
通过使用 network
RHEL 系统角色,您可以自动化与网络相关的配置和管理任务。
18.1. 使用 network
RHEL 系统角色和接口名称,配置具有静态 IP 地址的以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置具有静态 IP 地址、网关和 DNS 设置的以太网连接,并将它们分配给指定的接口名称。
通常,管理员希望重复使用 playbook,且不会为 Ansible 应该为其分配静态 IP 地址的每个主机维护单独的 playbook。在本例中,您可以在 playbook 中使用变量,并在清单中维护设置。因此,您只需要一个 playbook 来动态地将单个设置分配给多个主机。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 物理或者虚拟以太网设备在服务器配置中存在。
- 受管节点使用 NetworkManager 配置网络。
流程
编辑
~/inventory
文件,并将特定于主机的设置附加到主机条目中:managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
Copy to Clipboard Copied! 创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com,managed-node-02.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: "{{ interface }}" interface_name: "{{ interface }}" type: ethernet autoconnect: yes ip: address: - "{{ ip_v4 }}" - "{{ ip_v6 }}" gateway4: "{{ gateway_v4 }}" gateway6: "{{ gateway_v6 }}" dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com,managed-node-02.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: "{{ interface }}" interface_name: "{{ interface }}" type: ethernet autoconnect: yes ip: address: - "{{ ip_v4 }}" - "{{ ip_v6 }}" gateway4: "{{ gateway_v4 }}" gateway6: "{{ gateway_v6 }}" dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 此 playbook 从清单文件中为每个主机动态读取某些值,并将 playbook 中的静态值用于所有主机的相同的设置。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
18.2. 使用 network
RHEL 系统角色和设备路径,配置具有静态 IP 地址的以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置具有静态 IP 地址、网关和 DNS 设置的以太网连接,并根据路径而不是其名称将它们分配给设备。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 服务器配置中有一个物理或者虚拟以太网设备。
- 受管节点使用 NetworkManager 配置网络。
-
您知道设备的路径。您可以使用
udevadm info /sys/class/net/<device_name> | grep ID_PATH=
命令显示设备路径。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
match
-
定义必须满足的条件,以应用设置。您只能将此变量与
path
选项一起使用。 path
-
定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID
0000:00:0[1-3].0
匹配, 而不与0000:00:02.0
匹配的设备。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
18.3. 使用 network
RHEL 系统角色和接口名称,配置具有动态 IP 地址的以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置一个以太网连接,其从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。使用此角色,您可以将连接配置文件分配给指定的接口名称。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 服务器配置中存在物理或者虚拟以太网设备。
- 网络中有 DHCP 服务器和 SLAAC。
- 受管节点使用 NetworkManager 服务配置网络。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 interface_name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 interface_name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
18.4. 使用 network
RHEL 系统角色和设备路径,配置具有动态 IP 地址的以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置一个以太网连接,其从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。角色可以根据设备的路径而不是接口名称,将连接配置文件分配给设备。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 服务器配置中有一个物理或者虚拟以太网设备。
- 网络中有 DHCP 服务器和 SLAAC。
- 受管主机使用 NetworkManager 配置网络。
-
您知道设备的路径。您可以使用
udevadm info /sys/class/net/<device_name> | grep ID_PATH=
命令显示设备路径。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
match: path
-
定义必须满足的条件,以应用设置。您只能将此变量与
path
选项一起使用。 path: <path_and_expressions>
-
定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID
0000:00:0[1-3].0
匹配, 而不与0000:00:02.0
匹配的设备。 dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
18.5. 使用 network
RHEL 系统角色配置一个具有 802.1X 网络身份验证的静态以太网连接
网络访问控制(NAC)保护网络免受未授权客户端的访问。您可以指定 NetworkManager 连接配置文件中身份验证所需的详情,以使客户端能够访问网络。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network
RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 网络支持 802.1X 网络身份验证。
- 受管节点使用 NetworkManager。
TLS 身份验证所需的以下文件在控制节点上存在:
-
客户端密钥存储在
/srv/data/client.key
文件中。 -
客户端证书存储在
/srv/data/client.crt
文件中。 -
证书颁发机构(CA)证书存储在
/srv/data/ca.crt
文件中。
-
客户端密钥存储在
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure an Ethernet connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0600 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Ethernet connection profile with static IP address settings and 802.1X ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: example.com state: up
--- - name: Configure an Ethernet connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0600 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Ethernet connection profile with static IP address settings and 802.1X ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: example.com state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ieee802_1x
- 此变量包含与 802.1X 相关的设置。
eap: tls
-
将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的
TLS
身份验证方法。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
- 访问需要网络身份验证的网络上的资源。
18.6. 使用 network
RHEL 系统角色配置一个具有 802.1X 网络身份验证的 wifi 连接
网络访问控制(NAC)保护网络免受未授权客户端的访问。您可以指定 NetworkManager 连接配置文件中身份验证所需的详情,以使客户端能够访问网络。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network
RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 网络支持 802.1X 网络身份验证。
-
您已在受管节点上安装了
wpa_supplicant
软件包。 - DHCP 位于受管节点的网络中。
control 节点上存在 TLS 身份验证所需的以下文件:
-
客户端密钥存储在
/srv/data/client.key
文件中。 -
客户端证书存储在
/srv/data/client.crt
文件中。 -
CA 证书存储在
/srv/data/ca.crt
文件中。
-
客户端密钥存储在
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/client.pem" ca_cert: "/etc/pki/tls/cacert.pem" domain_suffix_match: "example.com"
--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/client.pem" ca_cert: "/etc/pki/tls/cacert.pem" domain_suffix_match: "example.com"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
ieee802_1x
- 此变量包含与 802.1X 相关的设置。
eap: tls
-
将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的
TLS
身份验证方法。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
18.7. 使用 network
RHEL 系统角色配置网络绑定
您可以将网络接口组合在一个绑定中,以提供具有高吞吐量或冗余的逻辑接口。要配置绑定,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置网络绑定,如果绑定的父设备的连接配置文件不存在,角色也可以创建它。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bond connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bond profile - name: bond0 type: bond interface_name: bond0 ip: dhcp4: yes auto6: yes bond: mode: active-backup state: up # Port profile for the 1st Ethernet device - name: bond0-port1 interface_name: enp7s0 type: ethernet controller: bond0 state: up # Port profile for the 2nd Ethernet device - name: bond0-port2 interface_name: enp8s0 type: ethernet controller: bond0 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bond connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bond profile - name: bond0 type: bond interface_name: bond0 ip: dhcp4: yes auto6: yes bond: mode: active-backup state: up # Port profile for the 1st Ethernet device - name: bond0-port1 interface_name: enp7s0 type: ethernet controller: bond0 state: up # Port profile for the 2nd Ethernet device - name: bond0-port2 interface_name: enp8s0 type: ethernet controller: bond0 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建三个连接配置文件:一个用于绑定,两个用于以太网设备。
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。 mode: <bond_mode>
设置绑定模式。可能的值有:
-
balance-rr
(默认) -
active-backup
-
balance-xor
-
broadcast
-
802.3ad
-
balance-tlb
-
balance-alb
。
根据您设置的模式,您需要在 playbook 中设置额外的变量。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
从其中一个网络设备中临时拔掉网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如
nmcli
),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。
18.8. 使用 network
RHEL 系统角色配置 VLAN 标记
如果您的网络使用 Virtual Local Area Networks (VLAN)将网络流量分离到逻辑网络中,请创建一个 NetworkManager 连接配置文件来配置 VLAN 标记。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置 VLAN 标记,如果 VLAN 的父设备的连接配置文件不存在,角色也可以创建它。
如果 VLAN 设备需要 IP 地址、默认网关和 DNS 设置,请在 VLAN 设备上,而不是在父设备上配置它们。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: VLAN connection profile with Ethernet port ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Ethernet profile - name: enp1s0 type: ethernet interface_name: enp1s0 autoconnect: yes state: up ip: dhcp4: no auto6: no # VLAN profile - name: enp1s0.10 type: vlan vlan: id: 10 ip: dhcp4: yes auto6: yes parent: enp1s0 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: VLAN connection profile with Ethernet port ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Ethernet profile - name: enp1s0 type: ethernet interface_name: enp1s0 autoconnect: yes state: up ip: dhcp4: no auto6: no # VLAN profile - name: enp1s0.10 type: vlan vlan: id: 10 ip: dhcp4: yes auto6: yes parent: enp1s0 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建两个连接配置文件:一个用于父以太网设备,另一个用于 VLAN 设备。
dhcp4: <value>
-
如果设置为
yes
,则启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。禁用父设备上的 IP 地址配置。 auto6: <value>
-
如果设置为
yes
,则启用 IPv6 自动配置。在这种情况下,NetworkManager 默认使用路由器公告,如果路由器宣布managed
标志,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。禁用父设备上的 IP 地址配置。 parent: <parent_device>
- 设置 VLAN 连接配置文件的父设备。在示例中,父进程是以太网接口。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证 VLAN 设置:
ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10'
# ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10' managed-node-01.example.com | CHANGED | rc=0 >> 4: vlan10@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0 vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 ...
Copy to Clipboard Copied!
18.9. 使用 network
RHEL 系统角色配置网桥
您可以通过创建网桥,在 Open Systems Interconnection (OSI)模型的第 2 层上连接多个网络。要配置网桥,请在 NetworkManager 中创建一个连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置网桥,如果网桥的父设备的连接配置文件不存在,角色也可以创建它。
如果要为网桥分配 IP 地址、网关和 DNS 设置,请在网桥上而不是在其端口上配置它们。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bridge connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bridge profile - name: bridge0 type: bridge interface_name: bridge0 ip: dhcp4: yes auto6: yes state: up # Port profile for the 1st Ethernet device - name: bridge0-port1 interface_name: enp7s0 type: ethernet controller: bridge0 port_type: bridge state: up # Port profile for the 2nd Ethernet device - name: bridge0-port2 interface_name: enp8s0 type: ethernet controller: bridge0 port_type: bridge state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bridge connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bridge profile - name: bridge0 type: bridge interface_name: bridge0 ip: dhcp4: yes auto6: yes state: up # Port profile for the 1st Ethernet device - name: bridge0-port1 interface_name: enp7s0 type: ethernet controller: bridge0 port_type: bridge state: up # Port profile for the 2nd Ethernet device - name: bridge0-port2 interface_name: enp8s0 type: ethernet controller: bridge0 port_type: bridge state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建三个连接配置文件:一个用于网桥,两个用于以太网设备。
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示作为特定网桥端口的以太网设备的链接状态:
ansible managed-node-01.example.com -m command -a 'ip link show master bridge0'
# ansible managed-node-01.example.com -m command -a 'ip link show master bridge0' managed-node-01.example.com | CHANGED | rc=0 >> 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
Copy to Clipboard Copied! 显示作为任意网桥设备的端口的以太网设备状态:
ansible managed-node-01.example.com -m command -a 'bridge link show'
# ansible managed-node-01.example.com -m command -a 'bridge link show' managed-node-01.example.com | CHANGED | rc=0 >> 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
Copy to Clipboard Copied!
18.10. 使用 network
RHEL 系统角色在现有连接上设置默认网关
如果无法通过直接连接的网络或通过主机上配置的任何路由到达数据包的目的地,则主机会将网络数据包转发到其默认网关。要配置主机的默认网关,请在连接到与默认网关相同网络的接口的 NetworkManager 连接配置文件中设置它。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以在之前创建的连接上设置或更新默认网关设置。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色可确保连接配置文件与 playbook 中的设置完全匹配。如果存在同名的连接配置文件,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置成其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 198.51.100.20/24 - 2001:db8:1::1/64 gateway4: 198.51.100.254 gateway6: 2001:db8:1::fffe dns: - 198.51.100.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 198.51.100.20/24 - 2001:db8:1::1/64 gateway4: 198.51.100.254 gateway6: 2001:db8:1::fffe dns: - 198.51.100.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { ... "gateway": "198.51.100.254", "interface": "enp1s0", ... }, "ansible_default_ipv6": { ... "gateway": "2001:db8:1::fffe", "interface": "enp1s0", ... } ...
Copy to Clipboard Copied!
18.11. 使用 network
RHEL 系统角色配置一个静态路由
静态路由确保您可以将流量发送到无法通过默认网关到达的目标。您可以在连接到与下一跳相同的网络的接口的 NetworkManager 连接配置文件中配置静态路由。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色可确保连接配置文件与 playbook 中的设置完全匹配。如果存在同名的连接配置文件,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置成其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp7s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com route: - network: 198.51.100.0 prefix: 24 gateway: 192.0.2.10 - network: '2001:db8:2::' prefix: 64 gateway: 2001:db8:1::10 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp7s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com route: - network: 198.51.100.0 prefix: 24 gateway: 192.0.2.10 - network: '2001:db8:2::' prefix: 64 gateway: 2001:db8:1::10 state: up
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示 IPv4 路由:
ansible managed-node-01.example.com -m command -a 'ip -4 route'
# ansible managed-node-01.example.com -m command -a 'ip -4 route' managed-node-01.example.com | CHANGED | rc=0 >> ... 198.51.100.0/24 via 192.0.2.10 dev enp7s0
Copy to Clipboard Copied! 显示 IPv6 路由:
ansible managed-node-01.example.com -m command -a 'ip -6 route'
# ansible managed-node-01.example.com -m command -a 'ip -6 route' managed-node-01.example.com | CHANGED | rc=0 >> ... 2001:db8:2::/64 via 2001:db8:1::10 dev enp7s0 metric 1024 pref medium
Copy to Clipboard Copied!
18.12. 使用 network
RHEL 系统角色将特定子网的流量路由到不同的默认网关
您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到提供者 B。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置连接配置文件,包括路由表和规则。
此流程假设以下网络拓扑:
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
受管节点使用 NetworkManager 和
firewalld
服务。 您要配置的受管节点有 4 个网络接口:
-
enp7s0
接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为198.51.100.2
,网络使用/30
网络掩码。 -
enp1s0
接口已连接到提供商 B 的网络。提供商网络中的网关 IP 为192.0.2.2
,网络使用/30
网络掩码。 -
enp8s0
接口已与连有内部工作站的10.0.0.0/24
子网相连。 -
enp9s0
接口已与连有公司服务器的203.0.113.0/24
子网相连。
-
-
内部工作站子网中的主机使用
10.0.0.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp8s0
网络接口。 -
服务器子网中的主机使用
203.0.113.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp9s0
网络接口。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring policy-based routing hosts: managed-node-01.example.com tasks: - name: Routing traffic from a specific subnet to a different default gateway ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Provider-A interface_name: enp7s0 type: ethernet autoconnect: True ip: address: - 198.51.100.1/30 gateway4: 198.51.100.2 dns: - 198.51.100.200 state: up zone: external - name: Provider-B interface_name: enp1s0 type: ethernet autoconnect: True ip: address: - 192.0.2.1/30 route: - network: 0.0.0.0 prefix: 0 gateway: 192.0.2.2 table: 5000 state: up zone: external - name: Internal-Workstations interface_name: enp8s0 type: ethernet autoconnect: True ip: address: - 10.0.0.1/24 route: - network: 10.0.0.0 prefix: 24 table: 5000 routing_rule: - priority: 5 from: 10.0.0.0/24 table: 5000 state: up zone: trusted - name: Servers interface_name: enp9s0 type: ethernet autoconnect: True ip: address: - 203.0.113.1/24 state: up zone: trusted
--- - name: Configuring policy-based routing hosts: managed-node-01.example.com tasks: - name: Routing traffic from a specific subnet to a different default gateway ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Provider-A interface_name: enp7s0 type: ethernet autoconnect: True ip: address: - 198.51.100.1/30 gateway4: 198.51.100.2 dns: - 198.51.100.200 state: up zone: external - name: Provider-B interface_name: enp1s0 type: ethernet autoconnect: True ip: address: - 192.0.2.1/30 route: - network: 0.0.0.0 prefix: 0 gateway: 192.0.2.2 table: 5000 state: up zone: external - name: Internal-Workstations interface_name: enp8s0 type: ethernet autoconnect: True ip: address: - 10.0.0.1/24 route: - network: 10.0.0.0 prefix: 24 table: 5000 routing_rule: - priority: 5 from: 10.0.0.0/24 table: 5000 state: up zone: trusted - name: Servers interface_name: enp9s0 type: ethernet autoconnect: True ip: address: - 203.0.113.1/24 state: up zone: trusted
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
table: <value>
-
将与
table
变量相同的列表条目中的路由分配给指定的路由表。 routing_rule: <list>
- 定义指定路由规则的优先级,以及从连接配置文件到规则分配给哪个路由表的优先级。
zone: <zone_name>
-
将网络接口从一个连接配置文件分配给指定的
firewalld
区域。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在内部工作站子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 10.0.0.1 (10.0.0.1) 0.337 ms 0.260 ms 0.223 ms 2 192.0.2.2 (192.0.2.2) 0.884 ms 1.066 ms 1.248 ms ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
192.0.2.1
,即提供商 B 的网络来发送数据包。
在服务器子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 203.0.113.1 (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
198.51.100.2
,即供应商 A 的网络来发送数据包。
在使用 RHEL 系统角色配置的 RHEL 路由器上:
显示规则列表:
ip rule list
# ip rule list 0: from all lookup local 5: from 10.0.0.0/24 lookup 5000 32766: from all lookup main 32767: from all lookup default
Copy to Clipboard Copied! 默认情况下,RHEL 包含表
local
、main
和default
的规则。显示表
5000
中的路由:ip route list table 5000
# ip route list table 5000 0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100 10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
Copy to Clipboard Copied! 显示接口和防火墙区:
firewall-cmd --get-active-zones
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0
Copy to Clipboard Copied! 验证
external
区是否启用了伪装:firewall-cmd --info-zone=external
# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
Copy to Clipboard Copied!
18.13. 使用 network
RHEL 系统角色配置 ethtool
卸载功能
网络接口控制器可以使用 TCP 卸载引擎(TOE)将某些操作卸载到网络接口控制器。这提高了网络吞吐量。您可以在网络接口的连接配置文件中配置卸载功能。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and offload features ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: features: gro: no gso: yes tx_sctp_segmentation: no state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and offload features ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: features: gro: no gso: yes tx_sctp_segmentation: no state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
gro: no
- 禁用通用接收卸载(GRO)。
gso: yes
- 启用通用分段卸载(GSO)。
tx_sctp_segmentation: no
- 禁用 TX 流控制传输协议(SCTP)分段。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证卸载设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_enp1s0": { "active": true, "device": "enp1s0", "features": { ... "rx_gro_hw": "off, ... "tx_gso_list": "on, ... "tx_sctp_segmentation": "off", ... } ...
Copy to Clipboard Copied!
18.14. 使用 network
RHEL 系统角色配置 ethtool
合并设置
通过使用中断合并,系统收集网络数据包,并为多个数据包生成一个中断。这会增加使用一个硬件中断发送到内核的数据量,从而减少中断负载,并最大化吞吐量。您可以在网络接口的连接配置文件中配置合并设置。通过使用 Ansible 和 network
RHEL 角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and coalesce settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: coalesce: rx_frames: 128 tx_frames: 128 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and coalesce settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: coalesce: rx_frames: 128 tx_frames: 128 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
rx_frames: <value>
- 设置 RX 帧的数量。
gso: <value>
- 设置 TX 帧的数量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示网络设备的当前卸载功能:
ansible managed-node-01.example.com -m command -a 'ethtool -c enp1s0'
# ansible managed-node-01.example.com -m command -a 'ethtool -c enp1s0' managed-node-01.example.com | CHANGED | rc=0 >> ... rx-frames: 128 ... tx-frames: 128 ...
Copy to Clipboard Copied!
18.15. 使用 network
RHEL 系统角色增加环缓冲的大小,以减少高数据包丢弃率
如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。
环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(TX)和接收(RX)环缓冲区。接收环缓冲区在设备驱动程序和网络接口控制器(NIC)之间共享。数据可以通过硬件中断或软件中断(也称为 SoftIRQ)从 NIC 移到内核。
内核使用 RX 环缓冲区存储传入的数据包,直到设备驱动程序可以处理它们。设备驱动程序排空 RX 环,通常是使用 SoftIRQ,其将传入的数据包放在名为 sk_buff
或 skb
的内核数据结构中,以通过内核开始其过程,直到拥有相关套接字的应用程序。
内核使用 TX 环缓冲区来存放应发送到网络的传出数据包。这些环缓冲区位于堆栈的底部,是可能发生数据包丢弃的关键点,这反过来会对网络性能造成负面影响。
您可以在 NetworkManager 连接配置文件中配置环缓冲设置。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 您知道设备支持的最大环缓冲区大小。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: ring: rx: 4096 tx: 4096 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: ring: rx: 4096 tx: 4096 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
rx: <value>
- 设置接收的环缓冲区条目的最大数。
tx: <value>
- 设置传输的环缓冲区条目的最大数。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示最大环缓冲大小:
ansible managed-node-01.example.com -m command -a 'ethtool -g enp1s0'
# ansible managed-node-01.example.com -m command -a 'ethtool -g enp1s0' managed-node-01.example.com | CHANGED | rc=0 >> ... Current hardware settings: RX: 4096 RX Mini: 0 RX Jumbo: 0 TX: 4096
Copy to Clipboard Copied!
18.16. 使用 network
RHEL 系统角色配置 IPoIB 连接
您可以使用 IP over InfiniBand (IPoIB),通过 InfiniBand 接口发送 IP 数据包。要配置 IPoIB,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
系统角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置 IPoIB,如果 InfiniBand 的父设备的连接配置文件不存在,角色也可以创建它。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
一个名为
mlx4_ib0
的 InfiniBand 设备被安装在受管节点上。 - 受管节点使用 NetworkManager 配置网络。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: IPoIB connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # InfiniBand connection mlx4_ib0 - name: mlx4_ib0 interface_name: mlx4_ib0 type: infiniband # IPoIB device mlx4_ib0.8002 on top of mlx4_ib0 - name: mlx4_ib0.8002 type: infiniband autoconnect: yes infiniband: p_key: 0x8002 transport_mode: datagram parent: mlx4_ib0 ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: IPoIB connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # InfiniBand connection mlx4_ib0 - name: mlx4_ib0 interface_name: mlx4_ib0 type: infiniband # IPoIB device mlx4_ib0.8002 on top of mlx4_ib0 - name: mlx4_ib0.8002 type: infiniband autoconnect: yes infiniband: p_key: 0x8002 transport_mode: datagram parent: mlx4_ib0 ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建两个连接配置文件:一个用于 InfiniBand 连接,一个用于 IPoIB 设备。
parent: <parent_device>
- 设置 IPoIB 连接配置文件的父设备。
p_key: <value>
-
设置 InfiniBand 分区密钥。如果您设置了此变量,请不要在 IPoIB 设备上设置
interface_name
。 transport_mode: <mode>
-
设置 IPoIB 连接操作模式。您可以将此变量设置为
datagram
(默认)或connected
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示
mlx4_ib0.8002
设备的 IP 设置:ansible managed-node-01.example.com -m command -a 'ip address show mlx4_ib0.8002'
# ansible managed-node-01.example.com -m command -a 'ip address show mlx4_ib0.8002' managed-node-01.example.com | CHANGED | rc=0 >> ... inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute ib0.8002 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/64 scope link tentative noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示
mlx4_ib0.8002
设备的分区密钥(P_Key):ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx4_ib0.8002/pkey' managed-node-01.example.com | CHANGED | rc=0 >> 0x8002
# ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx4_ib0.8002/pkey' managed-node-01.example.com | CHANGED | rc=0 >> 0x8002
Copy to Clipboard Copied! 显示
mlx4_ib0.8002
设备的模式:ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx4_ib0.8002/mode' managed-node-01.example.com | CHANGED | rc=0 >> datagram
# ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx4_ib0.8002/mode' managed-node-01.example.com | CHANGED | rc=0 >> datagram
Copy to Clipboard Copied!
18.17. network
RHEL 系统角色的网络状态
network
RHEL 系统角色支持 playbook 中的状态配置,来配置设备。为此,请使用 network_state
变量,后面跟上状态配置。
在 playbook 中使用 network_state
变量的好处:
- 通过与状态配置结合使用声明方法,您可以配置接口,NetworkManager 会在后台为这些接口创建一个配置集。
-
使用
network_state
变量,您可以指定您需要更改的选项,所有其他选项将保持不变。但是,使用network_connections
变量,您必须指定所有设置来更改网络连接配置集。
您只能在 network_state
中设置 Nmstate YAML 指令。这些指令与您可以在 network_connections
中设置的变量有所不同。
例如,要使用动态 IP 地址设置创建以太网连接,请在 playbook 中使用以下 vars
块:
带有状态配置的 playbook | 常规 playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: up ipv4: enabled: true auto-dns: true auto-gateway: true auto-routes: true dhcp: true ipv6: enabled: true auto-dns: true auto-gateway: true auto-routes: true autoconf: true dhcp: true
|
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
|
例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars
块:
带有状态配置的 playbook | 常规 playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: down
|
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: down
|
第 19 章 使用 RHEL 系统角色管理容器
使用 podman
RHEL 系统角色,您可以管理 Podman 配置、容器以及运行 Podman 容器的 systemd
服务。
19.1. 使用 podman
RHEL 系统角色创建带有绑定挂载的无根容器
您可以使用 podman
RHEL 系统角色,通过运行 Ansible playbook 来创建带有绑定挂载的无根容器,并管理应用程序配置。
示例 Ansible playbook 启动两个 Kubernetes pod:一个用于数据库,另一个用于 web 应用。数据库 pod 配置在 playbook 中指定,而 Web 应用 Pod 在一个外部 YAML 文件中定义。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
用户和组
webapp
存在,且必须列在主机上的/etc/subuid
和/etc/subgid
文件中。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configure Podman hosts: managed-node-01.example.com tasks: - name: Create a web application and a database ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_create_host_directories: true podman_firewall: - port: 8080-8081/tcp state: enabled - port: 12340/tcp state: enabled podman_selinux_ports: - ports: 8080-8081 setype: http_port_t podman_kube_specs: - state: started run_as_user: dbuser run_as_group: dbgroup kube_file_content: apiVersion: v1 kind: Pod metadata: name: db spec: containers: - name: db image: quay.io/linux-system-roles/mysql:5.6 ports: - containerPort: 1234 hostPort: 12340 volumeMounts: - mountPath: /var/lib/db:Z name: db volumes: - name: db hostPath: path: /var/lib/db - state: started run_as_user: webapp run_as_group: webapp kube_file_src: /path/to/webapp.yml
- name: Configure Podman hosts: managed-node-01.example.com tasks: - name: Create a web application and a database ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_create_host_directories: true podman_firewall: - port: 8080-8081/tcp state: enabled - port: 12340/tcp state: enabled podman_selinux_ports: - ports: 8080-8081 setype: http_port_t podman_kube_specs: - state: started run_as_user: dbuser run_as_group: dbgroup kube_file_content: apiVersion: v1 kind: Pod metadata: name: db spec: containers: - name: db image: quay.io/linux-system-roles/mysql:5.6 ports: - containerPort: 1234 hostPort: 12340 volumeMounts: - mountPath: /var/lib/db:Z name: db volumes: - name: db hostPath: path: /var/lib/db - state: started run_as_user: webapp run_as_group: webapp kube_file_src: /path/to/webapp.yml
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
run_as_user
和run_as_group
- 指定容器是无根的。
kube_file_content
包含一个定义名为
db
的第一个容器的 Kubernetes YAML 文件。您可以使用podman kube generate
命令生成 Kubernetes YAML 文件。-
db
容器是基于quay.io/db/db:stable
容器镜像。 -
db
绑定挂载将主机上的/var/lib/db
目录映射到容器中的/var/lib/db
目录。Z
标志使用私有的 unshared 标签标记内容,因此只有db
容器才能访问内容。
-
kube_file_src: <path>
-
定义第二个容器。控制器节点上
/path/to/webapp.yml
文件的内容将复制到受管节点上的kube_file
字段中。 volumes: <list>
-
一个定义要在一个或多个容器中提供数据源的 YAML 列表。例如,主机上的本地磁盘(
hostPath
)或其他磁盘设备。 volumeMounts: <list>
- 一个定义目标的 YAML 列表,其中单个容器将挂载一个给定卷。
podman_create_host_directories: true
-
在主机上创建目录。这指示角色检查
hostPath
卷的 kube 规格,并在主机上创建这些目录。如果您需要对所有权和权限有更多的控制,请使用podman_host_directories
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.podman/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
19.2. 使用 podman
RHEL 系统角色创建一个带有 Podman 卷的有根容器
您可以使用 podman
RHEL 系统角色,通过运行 Ansible playbook 来创建一个带有 Podman 卷的有根容器,并管理应用程序配置。
示例 Ansible playbook 部署一个名为 ubi8-httpd
的 从 registry.access.redhat.com/ubi8/httpd-24
镜像运行 HTTP 服务器容器的 Kubernetes pod。容器的 Web 内容是从一个名为 ubi8-html-volume
的持久卷中挂载的。默认情况下,podman
角色创建有根容器。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configure Podman hosts: managed-node-01.example.com tasks: - name: Start Apache server on port 8080 ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_firewall: - port: 8080/tcp state: enabled podman_kube_specs: - state: started kube_file_content: apiVersion: v1 kind: Pod metadata: name: ubi8-httpd spec: containers: - name: ubi8-httpd image: registry.access.redhat.com/ubi8/httpd-24 ports: - containerPort: 8080 hostPort: 8080 volumeMounts: - mountPath: /var/www/html:Z name: ubi8-html volumes: - name: ubi8-html persistentVolumeClaim: claimName: ubi8-html-volume
- name: Configure Podman hosts: managed-node-01.example.com tasks: - name: Start Apache server on port 8080 ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_firewall: - port: 8080/tcp state: enabled podman_kube_specs: - state: started kube_file_content: apiVersion: v1 kind: Pod metadata: name: ubi8-httpd spec: containers: - name: ubi8-httpd image: registry.access.redhat.com/ubi8/httpd-24 ports: - containerPort: 8080 hostPort: 8080 volumeMounts: - mountPath: /var/www/html:Z name: ubi8-html volumes: - name: ubi8-html persistentVolumeClaim: claimName: ubi8-html-volume
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
kube_file_content
包含一个定义名为
db
的第一个容器的 Kubernetes YAML 文件。您可以使用podman kube generate
命令生成 Kubernetes YAML 文件。-
ubi8-httpd
容器是基于registry.access.redhat.com/ubi8/httpd-24
容器镜像。 -
ubi8-html-volume
将主机上的/var/www/html
目录映射到容器。Z
标志使用私有 unshared 标签标记内容,因此只有ubi8-httpd
容器可以访问内容。 -
pod 使用挂载路径
/var/www/html
挂载名为ubi8-html-volume
的现有持久性卷。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.podman/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
19.3. 使用 podman
RHEL 系统角色创建一个带有 secret 的 Quadlet 应用程序
您可以使用 podman
RHEL 系统角色,通过运行 Ansible playbook 来创建一个带有 secret 的 Quadlet 应用程序。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
容器中的 web 服务器应使用的证书和相应的私钥存储在
~/certificate.pem
和~/key.pem
文件中。
流程
显示证书和私钥文件的内容:
cat ~/certificate.pem -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- cat ~/key.pem -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----
$ cat ~/certificate.pem -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- $ cat ~/key.pem -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----
Copy to Clipboard Copied! 您在后续步骤中需要此信息。
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:root_password: <root_password> certificate: |- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- key: |- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----
root_password: <root_password> certificate: |- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- key: |- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----
Copy to Clipboard Copied! 确保
certificate
和key
变量中的所有行都以两个空格开头。- 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Deploy a wordpress CMS with MySQL database hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create and run the container ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_create_host_directories: true podman_activate_systemd_unit: false podman_quadlet_specs: - name: quadlet-demo type: network file_content: | [Network] Subnet=192.168.30.0/24 Gateway=192.168.30.1 Label=app=wordpress - file_src: quadlet-demo-mysql.volume - template_src: quadlet-demo-mysql.container.j2 - file_src: envoy-proxy-configmap.yml - file_src: quadlet-demo.yml - file_src: quadlet-demo.kube activate_systemd_unit: true podman_firewall: - port: 8000/tcp state: enabled - port: 9000/tcp state: enabled podman_secrets: - name: mysql-root-password-container state: present skip_existing: true data: "{{ root_password }}" - name: mysql-root-password-kube state: present skip_existing: true data: | apiVersion: v1 data: password: "{{ root_password | b64encode }}" kind: Secret metadata: name: mysql-root-password-kube - name: envoy-certificates state: present skip_existing: true data: | apiVersion: v1 data: certificate.key: {{ key | b64encode }} certificate.pem: {{ certificate | b64encode }} kind: Secret metadata: name: envoy-certificates
- name: Deploy a wordpress CMS with MySQL database hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create and run the container ansible.builtin.include_role: name: redhat.rhel_system_roles.podman vars: podman_create_host_directories: true podman_activate_systemd_unit: false podman_quadlet_specs: - name: quadlet-demo type: network file_content: | [Network] Subnet=192.168.30.0/24 Gateway=192.168.30.1 Label=app=wordpress - file_src: quadlet-demo-mysql.volume - template_src: quadlet-demo-mysql.container.j2 - file_src: envoy-proxy-configmap.yml - file_src: quadlet-demo.yml - file_src: quadlet-demo.kube activate_systemd_unit: true podman_firewall: - port: 8000/tcp state: enabled - port: 9000/tcp state: enabled podman_secrets: - name: mysql-root-password-container state: present skip_existing: true data: "{{ root_password }}" - name: mysql-root-password-kube state: present skip_existing: true data: | apiVersion: v1 data: password: "{{ root_password | b64encode }}" kind: Secret metadata: name: mysql-root-password-kube - name: envoy-certificates state: present skip_existing: true data: | apiVersion: v1 data: certificate.key: {{ key | b64encode }} certificate.pem: {{ certificate | b64encode }} kind: Secret metadata: name: envoy-certificates
Copy to Clipboard Copied! 流程创建一个与 MySQL 数据库配对的 WordPress 内容管理系统。
podman_quadlet_specs 角色
变量为 Quadlet 定义一组配置,它指向以某种方式一起工作的一组容器或服务。它包括以下规范:-
Wordpress 网络由
quadlet-demo
网络单元定义。 -
MySQL 容器的卷配置由
file_src: quadlet-demo-mysql.volume
字段定义。 -
template_src: quadlet-demo-mysql.container.j2
字段用于为 MySQL 容器生成一个配置。 -
两个 YAML 文件如下:
file_src: envoy-proxy-configmap.yml
和file_src: quadlet-demo.yml
.请注意,.yml 不是一个有效的 Quadlet 单元类型,因此这些文件将只被复制,且不会作为 Quadlet 规范来处理。 -
Wordpress 和 envoy 代理容器和配置由
file_src: quadlet-demo.kube
字段定义。kube 单元将之前[Kube]
部分中的 YAML 文件称为Yaml=quadlet-demo.yml
和ConfigMap=envoy-proxy-configmap.yml
。
-
Wordpress 网络由
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
第 20 章 使用 RHEL 系统角色配置 Postfix MTA
您可以使用 postfix
RHEL 系统角色,以自动的方式一致地管理 Postfix 邮件传输代理(MTA)的配置。当您需要时,部署这样的配置很有用,例如:
- 稳定的邮件服务器:使系统管理员能够配置快速且可扩展的服务器,以发送和接收电子邮件。
- 保护通信:支持 TLS 加密、身份验证、域黑名单等功能,以确保安全的电子邮件传输。
- 改进了电子邮件管理和路由:实施过滤器和规则,以便您控制电子邮件流量。
postfix_conf
字典保存支持的 Postfix 配置参数的键值对。Postfix 无法识别为支持的密钥将被忽略。postfix
RHEL 系统角色直接将您提供的键值对传递给 postfix_conf
字典,而不验证其语法或限制它们。因此,角色对于熟悉 Postfix 的以及知道如何配置它的人特别有用。
20.1. 将 Postfix 配置为空客户端,以便仅发送传出电子邮件
空客户端是一种特殊配置,其中设置 Postfix 服务器只为发送传出电子邮件,但不接收任何传入电子邮件。在您需要发送通知、警报或日志,但不需要接收或管理电子邮件的情况,这种设置被广泛使用。通过使用 Ansible 和 postfix
RHEL 系统角色,您可以自动化这个过程,并远程将 Postfix 服务器配置为空客户端,以便仅发送传出电子邮件。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage Postfix hosts: managed-node-01.example.com tasks: - name: Install postfix ansible.builtin.package: name: postfix state: present - name: Configure null client for only sending outgoing emails ansible.builtin.include_role: name: redhat.rhel_system_roles.postfix vars: postfix_conf: myhostname: server.example.com myorigin: "$mydomain" relayhost: smtp.example.com inet_interfaces: loopback-only mydestination: "" relay_domains: "{{ lookup('ansible.builtin.pipe', 'postconf -h default_database_type') }}:/etc/postfix/relay_domains" postfix_files: - name: relay_domains postmap: true content: | example.com OK example.net OK
--- - name: Manage Postfix hosts: managed-node-01.example.com tasks: - name: Install postfix ansible.builtin.package: name: postfix state: present - name: Configure null client for only sending outgoing emails ansible.builtin.include_role: name: redhat.rhel_system_roles.postfix vars: postfix_conf: myhostname: server.example.com myorigin: "$mydomain" relayhost: smtp.example.com inet_interfaces: loopback-only mydestination: "" relay_domains: "{{ lookup('ansible.builtin.pipe', 'postconf -h default_database_type') }}:/etc/postfix/relay_domains" postfix_files: - name: relay_domains postmap: true content: | example.com OK example.net OK
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
myhostname: <server.example.com>
- 此邮件系统的互联网主机名。默认为完全限定域名(FQDN)。
myorigin: $mydomain
-
本地发布的邮件似乎来自的域名,并且本地发布的邮件被递送到的域名。默认为
$myhostname
。 relayhost: <smtp.example.com>
- 非本地邮件的下一跳目的地,覆盖收件人地址中的非本地域。默认为空字段。
inet_interfaces: loopback-only
- 对于传入电子邮件连接,定义 Postfix 服务器侦听哪个网络接口。它控制 Postfix 服务器是否以及如何接收来自网络的电子邮件。
mydestination
- 定义哪些域和主机名被视为本地。
relay_domains: "hash:/etc/postfix/relay_domains"
-
在充当中继服务器(SMTP 转发)时,指定 Postfix 可将电子邮件转发到的域。在这种情况下,域将由
postfix_files
变量生成。在 RHEL 10 中,您必须使用relay_domains: "lmdb:/etc/postfix/relay_domains
"。 postfix_files
-
定义将放在
/etc/postfix/
目录中的文件的列表。如果需要,这些文件可以被转换为 Postfix 查找表。在这种情况下,postfix_files
为 SMTP 转发生成域名。
有关 playbook 中使用的角色变量和 Postfix 配置参数的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.postfix/README.md
文件和postconf(5)
手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 21 章 使用 RHEL 系统角色安装和配置 PostgreSQL 数据库服务器
您可以使用 postgresql
RHEL 系统角色自动化 PostgreSQL 数据库服务器的安装和管理。默认情况下,此角色还通过自动在 PostgreSQL 服务配置文件中配置与性能相关的设置来优化 PostgreSQL。
21.1. 使用 postgresql
RHEL 系统角色配置带有现有 TLS 证书的 PostgreSQL
如果应用程序需要 PostgreSQL 数据库服务器,您可以使用 TLS 加密配置此服务,以在应用程序和数据库之间启用安全通信。通过使用 postgresql
RHEL 系统角色,您可以自动化这个过程,并远程安装和配置带有 TLS 加密的 PostgreSQL。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。
postgresql
角色无法在 firewalld
服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在 playbook 中添加一个使用 firewall
RHEL 系统角色的任务。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 受管节点的私钥和证书都存储在控制节点上的以下文件中:
-
私钥:
~/<FQDN_of_the_managed_node>.key
-
证书:
~/<FQDN_of_the_managed_node>.crt
-
私钥:
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create directory for TLS certificate and key ansible.builtin.file: path: /etc/postgresql/ state: directory mode: 755 - name: Copy CA certificate ansible.builtin.copy: src: "~/{{ inventory_hostname }}.crt" dest: "/etc/postgresql/server.crt" - name: Copy private key ansible.builtin.copy: src: "~/{{ inventory_hostname }}.key" dest: "/etc/postgresql/server.key" mode: 0600 - name: PostgreSQL with an existing private key and certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_cert_name: "/etc/postgresql/server" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create directory for TLS certificate and key ansible.builtin.file: path: /etc/postgresql/ state: directory mode: 755 - name: Copy CA certificate ansible.builtin.copy: src: "~/{{ inventory_hostname }}.crt" dest: "/etc/postgresql/server.crt" - name: Copy private key ansible.builtin.copy: src: "~/{{ inventory_hostname }}.key" dest: "/etc/postgresql/server.key" mode: 0600 - name: PostgreSQL with an existing private key and certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_cert_name: "/etc/postgresql/server" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
postgresql_version: <version>
设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于在受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。
您无法通过更改
postgresql_version
变量并再次运行 playbook 来升级或降级 PostgreSQL。postgresql_password: <password>
设置
postgres
数据库超级用户的密码。您无法通过更改
postgresql_password
变量并再次运行 playbook 来更改密码。postgresql_cert_name: <private_key_and_certificate_file>
定义受管节点上没有
.crt
和key
后缀的证书和私钥的路径和基础名称。在 PostgreSQL 配置过程中,角色会在/var/lib/pgsql/data/
目录中创建引用这些文件的符号链接。证书和私钥必须存在于受管节点本地。您可以将任务与
ansible.builtin.copy
模块一起使用,来将文件从控制节点传输到受管节点,如 playbook 中所示。postgresql_server_conf: <list_of_settings>
定义角色应设置的
postgresql.conf
设置。角色将这些设置添加到/etc/postgresql/system-roles.conf
文件中,并在/var/lib/pgsql/data/postgresql.conf
的末尾包含此文件。因此,postgresql_server_conf
变量中的设置会覆盖/var/lib/pgsql/data/postgresql.conf
中的设置。使用
postgresql_server_conf
中的不同设置重新运行 playbook 会使用新设置覆盖/etc/postgresql/system-roles.conf
文件。postgresql_pg_hba_conf: <list_of_authentication_entries>
在
/var/lib/pgsql/data/pg_hba.conf
文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。示例允许以下到 PostgreSQL 的连接:
- 使用本地 UNIX 域套接字的未加密的连接。
- TLS 加密的到 IPv4 和 IPv6 localhost 地址的连接。
-
来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在
postgresql_server_conf
变量中正确地配置了listen_addresses
设置时,才能从远程地址访问。
使用
postgresql_pg_hba_conf
中不同的设置重新运行 playbook 会使用新设置覆盖/var/lib/pgsql/data/pg_hba.conf
文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
使用
postgres
超级用户连接到 PostgreSQL 服务器,并执行\conninfo
元命令:psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Copy to Clipboard Copied! 如果输出显示 TLS 协议版本和密码详情,则连接正常工作,且 TLS 加密已启用。
21.2. 使用 postgresql
RHEL 系统角色,配置带有从 IdM 中发布的 TLS 证书的 PostgreSQL
如果应用程序需要 PostgreSQL 数据库服务器,您可以配置带有 TLS 加密的 PostgreSQL 服务,来在应用和数据库之间启用安全通信。如果 PostgreSQL 主机是 Red Hat Enterprise Linux Identity Management (IdM)域的成员,则 certmonger
服务可以管理证书请求和将来的续订。
通过使用 postgresql
RHEL 系统角色,您可以自动化此过程。您可以远程安装和配置带有 TLS 加密的 PostgreSQL,postgresql
角色使用 certificate
RHEL 系统角色配置 certmonger
,并从 IdM 请求证书。
postgresql
角色无法在 firewalld
服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在使用 firewall
RHEL 系统角色的 playbook 中添加任务。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您在 IdM 域中注册了受管节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: PostgreSQL with certificates issued by IdM ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_certificates: - name: postgresql_cert dns: "{{ inventory_hostname }}" ca: ipa principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: PostgreSQL with certificates issued by IdM ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_certificates: - name: postgresql_cert dns: "{{ inventory_hostname }}" ca: ipa principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
postgresql_version: <version>
设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。
您无法通过更改
postgresql_version
变量并再次运行 playbook 来升级或降级 PostgreSQL。postgresql_password: <password>
设置
postgres
数据库超级用户的密码。您无法通过更改
postgresql_password
变量并再次运行 playbook 来更改密码。postgresql_certificates: <certificate_role_settings>
-
包含
certificate
角色设置的 YAML 字典的列表。 postgresql_server_conf: <list_of_settings>
定义您要角色设置的
postgresql.conf
设置。角色将这些设置添加到/etc/postgresql/system-roles.conf
文件中,并在/var/lib/pgsql/data/postgresql.conf
的末尾包含此文件。因此,postgresql_server_conf
变量中的设置会覆盖/var/lib/pgsql/data/postgresql.conf
中的设置。使用
postgresql_server_conf
中的不同设置重新运行 playbook 会使用新设置覆盖/etc/postgresql/system-roles.conf
文件。postgresql_pg_hba_conf: <list_of_authentication_entries>
在
/var/lib/pgsql/data/pg_hba.conf
文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。示例允许以下到 PostgreSQL 的连接:
- 使用本地 UNIX 域套接字的未加密的连接。
- TLS 加密的到 IPv4 和 IPv6 localhost 地址的连接。
-
来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在
postgresql_server_conf
变量中正确地配置了listen_addresses
设置时,才能从远程地址访问。
使用
postgresql_pg_hba_conf
中不同的设置重新运行 playbook 会使用新设置覆盖/var/lib/pgsql/data/pg_hba.conf
文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
使用
postgres
超级用户连接到 PostgreSQL 服务器,并执行\conninfo
元命令:psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Copy to Clipboard Copied! 如果输出显示 TLS 协议版本和密码详情,则连接正常工作,且 TLS 加密已启用。
第 22 章 使用 RHEL 系统角色注册系统
rhc
RHEL 系统角色使管理员能够使用红帽订阅管理(RHSM)和 Satellite 服务器自动注册多个系统。该角色还支持使用 Ansible ,进行与 Insights 相关配置和管理任务。默认情况下,当使用 rhc
注册系统时,系统会连接到 Red Hat Insights。另外,使用 rhc
,您可以:
- 配置到 Red Hat Insights 的连接
- 启用和禁用存储库
- 配置用于连接的代理
- 配置 Insights 补救和自动更新
- 设置系统发行版本
- 配置 Insights 标签
22.1. 使用 rhc
RHEL 系统角色注册系统
您可以使用 rhc
RHEL 系统角色通过红帽订阅管理(RHSM)大规模注册多个系统。默认情况下,rhc
在注册时将系统连接到 Red Hat Insights。注册系统可启用可用于管理系统和报告数据的特性和功能。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:activationKey: <activation_key> organizationID: <organizationID> username: <username> password: <password>
activationKey: <activation_key> organizationID: <organizationID> username: <username> password: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:要使用激活码和机构 ID (推荐)注册,请使用以下 playbook:
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Registering system using activation key and organization ID ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: activation_keys: keys: - "{{ activationKey }}" rhc_organization: "{{ organizationID }}"
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Registering system using activation key and organization ID ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: activation_keys: keys: - "{{ activationKey }}" rhc_organization: "{{ organizationID }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
rhc_auth: activation_keys
-
key
activation_keys
指定您要使用激活码进行注册。
要使用用户名和密码注册,请使用以下 playbook:
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Registering system with username and password ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}"
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Registering system with username and password ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}"
Copy to Clipboard Copied!
示例 playbook 中指定的设置包括以下内容:
rhc_auth: login
-
密钥登录
指定您要使用用户名和密码进行注册。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
22.2. 使用 rhc
RHEL 系统角色,使用 Satellite 注册系统
当组织使用 Satellite 管理系统时,需要通过 Satellite 注册系统。您可以使用 rhc
RHEL 系统角色,使用 Satellite 远程注册您的系统。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:activationKey: <activation_key> organizationID: <organizationID>
activationKey: <activation_key> organizationID: <organizationID>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Register to the custom registration server and CDN ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: activation_keys: keys: - "{{ activationKey }}" rhc_organization: "{{ organizationID }}" rhc_server: hostname: example.com port: 443 prefix: /rhsm rhc_baseurl: http://example.com/pulp/content
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Register to the custom registration server and CDN ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: activation_keys: keys: - "{{ activationKey }}" rhc_organization: "{{ organizationID }}" rhc_server: hostname: example.com port: 443 prefix: /rhsm rhc_baseurl: http://example.com/pulp/content
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
主机名: example.com
- Satellite 服务器的完全限定域名(FQDN),用于系统注册和软件包管理。
端口: 443
- 定义用于与 Satellite 服务器通信的网络端口。
prefix: /rhsm
- 指定用于访问 Satellite 服务器上资源的 URL 路径前缀。
rhc_baseurl: http://example.com/pulp/content
-
定义内容 URL 的前缀。在 Satellite 环境中,
baseurl
必须设置为注册系统的同一服务器。请参阅hostname
值,以确保使用正确的服务器。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
22.3. 使用 rhc
RHEL 系统角色在注册后禁用到 Insights 的连接
当使用 rhc
RHEL 系统角色注册系统时,角色默认启用到 Red Hat Insights 的连接。Red Hat Insights 是混合云控制台中的一个受管服务,它使用预测分析、修复功能和深度域专业知识来简化复杂的操作任务。如果不需要,您可以使用 rhc
RHEL 系统角色禁用它。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已注册系统。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Disable Insights connection ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_insights: state: absent
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Disable Insights connection ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_insights: state: absent
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
rhc_insights absent|present
- 使用 Red Hat Insights 启用或禁用系统注册以主动分析和建议。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
22.4. 使用 rhc
RHEL 系统角色管理存储库
在 RHEL 系统上启用软件仓库对于从验证的源访问、安装和更新软件包至关重要。您可以使用 rhc
RHEL 系统角色远程启用或禁用受管节点上的存储库,以确保系统安全性、稳定性和兼容性。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您有要在受管节点上启用或禁用的存储库的详情。
- 您已注册系统。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Enable repository ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_repositories: - name: "RepositoryName" state: enabled
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Enable repository ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_repositories: - name: "RepositoryName" state: enabled
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
名称 : RepositoryName
- 应该启用的存储库的名称。
state: enabled|disabled
-
可选,启用或禁用存储库。
默认启用
。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
22.5. 使用 rhc
RHEL 系统角色将系统锁定到特定版本
为确保系统稳定性和兼容性,有时需要将 RHEL 系统限制为只使用特定次版本的存储库,而不是自动升级到最新的可用版本。将系统锁定到特定的次版本有助于保持生产环境中的一致性,这样可防止出现兼容性问题的意外更新。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您知道要锁定系统的 RHEL 版本。请注意,您只能将系统锁定到受管节点当前运行的 RHEL 次版本或之后的次版本。
- 您已注册系统。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Lock the system to a particular release ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_release: "8.6"
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Lock the system to a particular release ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_release: "8.6"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
rhc_release: version
- 要为系统设置的 RHEL 版本,因此可用内容将限制为该版本。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
22.6. 在使用 rhc
RHEL 系统角色注册主机时使用代理服务器
如果您的安全限制只允许通过代理服务器访问互联网,您可以在使用 rhc
注册系统时指定 rhc
角色的代理设置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:username: <username> password: <password> proxy_username: <proxyusernme> proxy_password: <proxypassword>
username: <username> password: <password> proxy_username: <proxyusernme> proxy_password: <proxypassword>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Register to the Red Hat Customer Portal by using proxy ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_proxy: hostname: proxy.example.com port: 3128 username: "{{ proxy_username }}" password: "{{ proxy_password }}"
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Register to the Red Hat Customer Portal by using proxy ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_proxy: hostname: proxy.example.com port: 3128 username: "{{ proxy_username }}" password: "{{ proxy_password }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
主机名: proxy.example.com
- 代理服务器的完全限定域名(FQDN)。
端口: 3128
- 定义用于与代理服务器通信的网络端口。
用户名 : proxy_username
- 指定用于身份验证的用户名。这只有在代理服务器需要身份验证时才需要。
Password: proxy_password
- 指定用于身份验证的密码。这只有在代理服务器需要身份验证时才需要。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
22.7. 使用 rhc
RHEL 系统角色管理 Insights 规则的自动更新
您可以使用 rhc
RHEL 系统角色启用或禁用 Red Hat Insights 的自动集合规则更新。默认情况下,当您的系统连接到 Red Hat Insights 时,这个选项就启用了。您可以使用 rhc
禁用它。
如果禁用了此功能,您就存在使用过时的规则定义文件,且没有获得最新验证更新的风险。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已注册系统。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:username: <username> password: <password>
username: <username> password: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Enable Red Hat Insights autoupdates ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_insights: autoupdate: true state: present
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Enable Red Hat Insights autoupdates ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_insights: autoupdate: true state: present
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
autoupdate: true|false
- 为 Red Hat Insights 启用或禁用自动集合规则更新。
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
22.8. 使用 rhc
RHEL 系统角色配置 Insights 修复
您可以使用 rhc
RHEL 系统角色将系统配置为自动更新动态配置。当您将您的系统连接到 Red Hat Insights 时,它会被默认启用。如果需要,您可以禁用它。您可以使用 rhc
来确保您的系统已准备好在直接连接到红帽时进行补救。有关 Red Hat Insights 修复的更多信息,请参阅 Red Hat Insights 修复指南。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已启用了 Insights 补救。
- 您已注册系统。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Disable remediation ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_insights: remediation: absent state: present
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Disable remediation ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_insights: remediation: absent state: present
Copy to Clipboard Copied! 验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
22.9. 使用 rhc
RHEL 系统角色配置 Insights 标签
您可以使用 rhc
RHEL 系统角色为系统过滤和分组配置 Red Hat Insights 标签。您还可以根据要求自定义标签。使用 Red Hat Insights 标签过滤和分组系统,可帮助管理员根据环境、位置或功能等属性有效地管理、监控和应用策略到特定的系统集合。这提高了可见性,简化了自动化,并增强了跨大型基础架构的安全性合规性。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:username: <username> password: <password>
username: <username> password: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Creating tags ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_insights: tags: group: group-name-value location: location-name-value description: - RHEL8 - SAP sample_key: value state: present
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Creating tags ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_auth: login: username: "{{ username }}" password: "{{ password }}" rhc_insights: tags: group: group-name-value location: location-name-value description: - RHEL8 - SAP sample_key: value state: present
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
- 组 :
group
-name-value - 指定用于组织和管理注册主机的系统组。
location
:location-name-value- 定义与注册系统关联的位置。
description
- 为注册的系统提供简短摘要或标识符。
State
:present|absent表示已注册系统的当前状态。
注意标签
中的内容是一个 YAML 结构,代表管理员配置的系统所需的标签。此处给出的示例仅用于说明目的。管理员可以自定义 YAML 结构,根据需要包含任何其他键和值。
- 组 :
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
22.10. 使用 rhc
RHEL 系统角色取消系统注册
如果您不再想从特定系统上的注册服务器接收内容,例如系统停用、虚拟机删除或切换到本地内容镜像时,您可以使用 rhc
RHEL 系统角色从红帽订阅服务取消注册系统。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 系统已经注册。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Unregister the system ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_state: absent
--- - name: Managing systems with the rhc RHEL system role hosts: managed-node-01.example.com tasks: - name: Unregister the system ansible.builtin.include_role: name: redhat.rhel_system_roles.rhc vars: rhc_state: absent
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
rhc_state: absent
- 指定应该从注册服务器、RHSM 或 Satellite 中取消注册该系统。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第 23 章 使用 rhel_mgmt
集合通过 IPMI 和 Redfish 进行远程管理
使用智能平台管理接口(IPMI)和 Redfish API,管理员也可以远程管理主机,即使操作系统没有运行。rhel_mgmt
Ansible 集合提供了使用 IPMI 和 Redfish 执行某些远程操作的模块,如设置引导设备。
23.1. 使用 rhel_mgmt.ipmi_boot
模块设置引导设备
您可以使用 redhat.rhel_mgmt
集合的 ipmi_boot
模块来设置主机的引导设备。此模块使用智能平台管理接口(IPMI)执行此操作。
当您使用此 Ansible 模块时,会涉及三个主机:控制节点、受管节点,以及应用实际 IPMI 操作的基板管理控制器(BMC)的主机。控制节点在受管节点上执行 playbook。受管主机连接到远程 BMC 以执行 IPMI 操作。例如,如果您在 playbook 中设置 hosts: managed-node-01.example.com
和 name: server.example.com
,则 managed-node-01.example.com
将通过使用 server.example.com
上的 IPMI 更改设置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
ansible-collection-redhat-rhel_mgmt
软件包安装在控制节点上。 - 您有凭证来访问 BMC,这些凭证有更改设置的权限。
- 受管节点可以通过网络访问远程 BMC。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:ipmi_usr: <username> ipmi_pwd: <password>
ipmi_usr: <username> ipmi_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Set the boot device by using IPMI hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Install python3-pyghmi prerequisite ansible.builtin.dnf: name: python3-pyghmi state: latest - name: Set the boot device to hd redhat.rhel_mgmt.ipmi_boot: name: <bmc_hostname_or_ip_address> port: <bmc_port_number> user: "{{ ipmi_usr }}" password: "{{ ipmi_pwd }}" bootdev: hd persistent: true
--- - name: Set the boot device by using IPMI hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Install python3-pyghmi prerequisite ansible.builtin.dnf: name: python3-pyghmi state: latest - name: Set the boot device to hd redhat.rhel_mgmt.ipmi_boot: name: <bmc_hostname_or_ip_address> port: <bmc_port_number> user: "{{ ipmi_usr }}" password: "{{ ipmi_pwd }}" bootdev: hd persistent: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
name: <bmc_hostname_or_ip_address>
- 定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
port: <bmc_port_number>
-
设置远程管理控制协议(RMCP)端口号。默认值为
623
。 bootdev: <value>
设置引导设备。您可以选择以下值之一:
-
hd
: 从硬盘引导。 -
网络
:从网络引导. -
光
学:从光驱(如 DVD-ROM)引导。 -
floppy
:从软盘引导. -
安全
:在安全模式下从硬盘驱动器引导. -
设置
:引导到 BIOS 或 UEFI。 -
默认
:删除任何 IPMI 直接引导设备请求。
-
persistent: <true|false>
-
配置远程主机是否对所有引导都使用定义的设置,还是只针对下一个配置。默认情况下,此变量设置为
false
。请注意,并非所有 BMC 都支持永久设置引导设备。
如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.ipmi_boot
命令来显示模块的文档。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
23.2. 使用 rhel_mgmt.ipmi_power
模块设置系统状态
您可以使用 redhat.rhel_mgmt
集合的 ipmi_power
模块来设置硬件状态。例如,您可以确保主机处于开机状态或硬上重置,而无需参与操作系统。ipmi_power
模块使用智能平台管理接口(IPMI)来执行操作。
当您使用此 Ansible 模块时,会涉及三个主机:控制节点、受管节点,以及应用实际 IPMI 操作的基板管理控制器(BMC)的主机。控制节点在受管节点上执行 playbook。受管主机连接到远程 BMC 以执行 IPMI 操作。例如,如果您在 playbook 中设置 hosts: managed-node-01.example.com
和 name: server.example.com
,则 managed-node-01.example.com
将通过使用 server.example.com
上的 IPMI 更改设置。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
ansible-collection-redhat-rhel_mgmt
软件包安装在控制节点上。 - 您有凭证来访问 BMC,这些凭证有更改设置的权限。
- 受管节点可以通过网络访问远程 BMC。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:ipmi_usr: <username> ipmi_pwd: <password>
ipmi_usr: <username> ipmi_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the system state by using IPMI hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Install python3-pyghmi prerequisite ansible.builtin.dnf: name: python3-pyghmi state: latest - name: Ensure a machine is powered on redhat.rhel_mgmt.ipmi_power: name: <bmc_hostname_or_ip_address> port: <bmc_port_number> user: "{{ ipmi_usr }}" password: "{{ ipmi_pwd }}" state: on
--- - name: Configure the system state by using IPMI hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Install python3-pyghmi prerequisite ansible.builtin.dnf: name: python3-pyghmi state: latest - name: Ensure a machine is powered on redhat.rhel_mgmt.ipmi_power: name: <bmc_hostname_or_ip_address> port: <bmc_port_number> user: "{{ ipmi_usr }}" password: "{{ ipmi_pwd }}" state: on
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
name: <bmc_hostname_or_ip_address>
- 定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
port: <bmc_port_number>
-
设置远程管理控制协议(RMCP)端口号。默认值为
623
。 state: < ;value>
设置设备应处于的状态。您可以选择以下值之一:
-
在 上
:打开系统上的电源。 -
关闭
:在不通知操作系统的情况下关闭系统。 -
关闭
:从操作系统请求关闭。 -
reset
:执行硬重置。 -
Boot : 关闭系统电源,如果关闭系统,则重置系统。
-
如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.ipmi_power
命令来显示模块的文档。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
23.3. 使用 rhel_mgmt.redfish_command
模块管理带外控制器
您可以使用 redhat.rhel_mgmt
集合的 redfish_command
模块向 Redfish API 发送命令来远程管理带外(OOB)控制器。使用这个模块,您可以执行大量管理操作,例如:
- 执行电源管理操作
- 管理虚拟介质
- 管理 OOB 控制器的用户
- 更新固件
当您使用此 Ansible 模块时,会涉及三个主机:控制节点、受管节点和执行实际操作的 OOB 控制器的主机。控制节点在受管节点上执行 playbook,受管主机使用 Redfish API 连接到远程 OOB 控制器。例如,如果您在 playbook 中设置 hosts: managed-node-01.example.com
和 baseuri: server.example.com
,则 managed-node-01.example.com
对 server.example.com
执行操作。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
ansible-collection-redhat-rhel_mgmt
软件包安装在控制节点上。 - 您有访问 OOB 控制器的凭证,这些凭证有更改设置的权限。
- 受管节点可以通过网络访问远程 OOB 控制器。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>
redfish_usr: <username> redfish_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Send commands to OOB controller by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Power on the system redhat.rhel_mgmt.redfish_command: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: PowerOn
--- - name: Send commands to OOB controller by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Power on the system redhat.rhel_mgmt.redfish_command: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: PowerOn
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
baseuri: <uri>
- 定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
category: < ;value>
设置要执行的命令类别。可用的类别如下:
-
帐户
:管理 OOB 控制器的用户帐户。 -
机箱
:管理与机箱相关的设置。 -
Manager
:提供对 Redfish 服务的访问。 -
会话
:管理 Redfish 登录会话。 -
系统
(默认):管理机器相关的设置。 -
更新
:管理固件更新相关操作。
-
command: <command>
- 设置要执行的命令。根据命令,可能需要设置额外的变量。
如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.redfish_command
命令来显示模块的文档。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
23.4. 使用 rhel_mgmt.redfish_info
模块从带外控制器查询信息
您可以使用 redhat.rhel_mgmt
集合的 redfish_info
模块,通过 Redfish API 从带外(OOB)控制器远程查询信息。要显示返回的值,请使用获取的信息注册变量,并显示此变量的内容。
当您使用此 Ansible 模块时,会涉及三个主机:控制节点、受管节点和执行实际操作的 OOB 控制器的主机。控制节点在受管节点上执行 playbook,受管主机使用 Redfish API 连接到远程 OOB 控制器。例如,如果您在 playbook 中设置 hosts: managed-node-01.example.com
和 baseuri: server.example.com
,则 managed-node-01.example.com
对 server.example.com
执行操作。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
ansible-collection-redhat-rhel_mgmt
软件包安装在控制节点上。 - 您有访问 OOB 控制器的凭证,这些凭证有查询设置的权限。
- 受管节点可以通过网络访问远程 OOB 控制器。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>
redfish_usr: <username> redfish_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Query information by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Get CPU inventory redhat.rhel_mgmt.redfish_info: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: GetCpuInventory register: result - name: Display the fetched information ansible.builtin.debug: msg: "{{ result.redfish_facts.cpu.entries | to_nice_json }}"
--- - name: Query information by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Get CPU inventory redhat.rhel_mgmt.redfish_info: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: GetCpuInventory register: result - name: Display the fetched information ansible.builtin.debug: msg: "{{ result.redfish_facts.cpu.entries | to_nice_json }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
baseuri: <uri>
- 定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
category: < ;value>
设置要查询的信息类别。可用的类别如下:
-
帐户
:OOB 控制器的用户帐户 -
机箱
:与机箱相关的设置 -
Manager
: Redfish 服务 -
会话
:Redfish 登录会话 -
系统
(默认):与机器相关的设置 -
更新
:与固件相关的设置 -
All
: 来自所有类别的信息.
如果使用列表,您还可以设置多个类别,如
["Systems", "Accounts
"]。-
command: <command>
- 设置要执行的查询命令。
如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.redfish_info
命令显示模块的文档。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
23.5. 使用 rhel_mgmt.redfish_config
模块来管理 BIOS、UEFI 和带外控制器
您可以使用 redhat.rhel_mgmt
集合的 redfish_config
模块,通过 Redfish API 配置 BIOS、UEFI 和带外(OOB)控制器设置。这可让您使用 Ansible 远程修改设置。
当您使用此 Ansible 模块时,会涉及三个主机:控制节点、受管节点和在其上执行实际操作的带有 OOB 控制器的主机。控制节点在受管节点上执行 playbook,受管主机使用 Redfish API 连接到远程 OOB 控制器来执行操作。例如,如果您在 playbook 中设置了 hosts: managed-node-01.example.com
和 baseuri: server.example.com
,则 managed-node-01.example.com
对 server.example.com
执行操作。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
ansible-collection-redhat-rhel_mgmt
软件包已安装在控制节点上。 - 您有访问 OOB 控制器的凭证,这些凭证有更改设置的权限。
- 受管节点可以通过网络访问远程 OOB 控制器。
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>
redfish_usr: <username> redfish_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure BIOS/UEFI settings by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Change the boot mode to UEFI redhat.rhel_mgmt.redfish_config: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: SetBiosAttributes bios_attributes: BootMode: "Uefi"
--- - name: Configure BIOS/UEFI settings by using the Redfish API hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Change the boot mode to UEFI redhat.rhel_mgmt.redfish_config: baseuri: <uri> username: "{{ redfish_usr }}" password: "{{ redfish_pwd }}" category: Systems command: SetBiosAttributes bios_attributes: BootMode: "Uefi"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
baseuri: <uri>
- 定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
category: <value>
设置要执行的命令的类别。可用的类别如下:
-
Accounts
:管理 OOB 控制器的用户帐户。 -
Chassis
:管理与机箱相关的设置。 -
Manager
:提供对 Redfish 服务的访问。 -
Session
:管理 Redfish 登录会话。 -
Systems
(默认):管理与机器相关的设置。 -
Update
:管理与固件更新相关的操作。
-
command: <command>
- 设置要执行的命令。根据命令,可能需要设置额外的变量。
如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.redfish_config
命令显示模块的文档。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
第 24 章 使用 RHEL 系统角色配置 SELinux
您可以使用 selinux
RHEL 系统角色远程配置和管理 SELinux 权限,例如:
- 清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
- 设置 SELinux 策略布尔值、文件上下文、端口和登录。
- 在指定文件或目录中恢复文件上下文。
- 管理 SELinux 模块。
24.1. 使用 selinux
RHEL 系统角色恢复目录上的 SELinux 上下文
当文件有不正确的 SELinux 上下文时,可能会出现多种情况。例如,如果文件被复制或移到目录中,则它们的 SELinux 上下文可能与新位置的预期上下文不匹配。使用不正确的 SELinux 上下文时,应用程序可能无法访问文件。要在大量主机上的目录上远程重置 SELinux 上下文,您可以使用 selinux
RHEL 系统角色。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Restore SELinux context ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_restore_dirs: - /var/www/ - /etc/
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Restore SELinux context ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_restore_dirs: - /var/www/ - /etc/
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
selinux_restore_dirs: <list>
- 定义角色应重置 SELinux 上下文的目录的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.selinux/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示您已重置了上下文的文件或目录的 SELinux 上下文。例如,要显示
/var/www/
目录上的上下文,请输入:ansible rhel9.example.com -m command -a 'ls -ldZ /var/www/'
# ansible rhel9.example.com -m command -a 'ls -ldZ /var/www/' drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 28 13:20 /var/www/
Copy to Clipboard Copied!
24.2. 使用 selinux
RHEL 系统角色管理 SELinux 网络端口标签
如果要在非标准端口上运行服务,您必须在此端口上设置相应的 SELinux 类型标签。这可防止在服务希望侦听非标准端口时,SELinux 拒绝对服务的访问权限。通过使用 selinux
RHEL 系统角色,您可以自动化此任务,并在端口上远程分配一个类型标签。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Set http_port_t label on network port ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_ports: - ports: <port_number> proto: tcp setype: http_port_t state: present
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Set http_port_t label on network port ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_ports: - ports: <port_number> proto: tcp setype: http_port_t state: present
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
ports: <port_number>
- 定义您要为其分配 SELinux 标签的端口号。使用逗号分隔多个值。
setype: <type_label>
- 定义 SELinux 类型标签。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.selinux/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示分配了
http_port_t
标签的端口号:ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t'
# ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t' http_port_t tcp 80, 81, 443, <port_number>, 488, 8008, 8009, 8443, 9000
Copy to Clipboard Copied!
24.3. 使用 selinux
RHEL 系统角色部署 SELinux 模块
如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux
RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。
如果使用 PP 模块,请确保受管节点上的
policydb
版本与用来构建 PP 模块的版本相同或更新。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Deploying a SELinux module ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_modules: - path: <module_file> priority: <value> state: enabled
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Deploying a SELinux module ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_modules: - path: <module_file> priority: <value> state: enabled
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
path: <module_file>
- 设置控制节点上模块文件的路径。
priority: <value>
-
设置 SELinux 模块优先级。
400
是默认值。 state: <value>
定义模块的状态:
-
enabled
:安装或启用模块。 -
disabled
:禁用模块。 -
absent
:删除模块。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.selinux/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表:
ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'
# ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'
Copy to Clipboard Copied! 如果列出了模块,则其已安装且启用了。
第 25 章 使用 RHEL 系统角色配置 OpenSSH 服务器和客户端
您可以使用 sshd
RHEL 系统角色配置 OpenSSH 服务器,使用 ssh
RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。对于需要安全远程交互的任何系统,此类配置是必需的,例如:
- 远程系统管理:使用 SSH 客户端从一台计算机安全地连接到您的机器。
- 安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP)可让您在本地机器和远程系统之间安全地传输文件。
- 自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
- 隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
- 基于密钥的身份验证:对基于密码登录的更加安全的替代。
- 基于证书的验证:集中信任管理和更好的可扩展性。
- 增强了安全性:禁用 root 登录、限制用户访问、强制强加密和其他此类强化,确保更强的系统安全性。
25.1. sshd
RHEL 系统角色如何将 playbook 中的设置映射到配置文件
在 sshd
RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。
如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config
文件。
在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yes
和 no
。您可以使用列表来定义多行配置项。例如:
sshd_ListenAddress: - 0.0.0.0 - '::'
sshd_ListenAddress:
- 0.0.0.0
- '::'
呈现为:
ListenAddress 0.0.0.0 ListenAddress ::
ListenAddress 0.0.0.0
ListenAddress ::
25.2. 使用 sshd
RHEL 系统角色配置 OpenSSH 服务器
您可以使用 sshd
RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:
- 管理来自远程客户端的传入 SSH 连接
- 凭证验证
- 保护数据传输和命令执行
您可以将 sshd
RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd
RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9)。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: SSH server configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to prevent root and password login except from particular subnet ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config: PermitRootLogin: no PasswordAuthentication: no Match: - Condition: "Address 192.0.2.0/24" PermitRootLogin: yes PasswordAuthentication: yes
--- - name: SSH server configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to prevent root and password login except from particular subnet ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config: PermitRootLogin: no PasswordAuthentication: no Match: - Condition: "Address 192.0.2.0/24" PermitRootLogin: yes PasswordAuthentication: yes
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
PasswordAuthentication: yes|no
-
控制 OpenSSH 服务器(
sshd
)是否接受来自使用用户名和密码组合的客户端的身份验证。 Match:
-
匹配块只允许使用来自子网
192.0.2.0/24
的使用密码的root
用户登录。
有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.sshd/README.md
文件和sshd_config (5)
手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
登录到 SSH 服务器:
ssh <username>@<ssh_server>
$ ssh <username>@<ssh_server>
Copy to Clipboard Copied! 验证 SSH 服务器上
sshd_config
文件的内容:cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf # Ansible managed # PasswordAuthentication no PermitRootLogin no Match Address 192.0.2.0/24 PasswordAuthentication yes PermitRootLogin yes
$ cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf # # Ansible managed # PasswordAuthentication no PermitRootLogin no Match Address 192.0.2.0/24 PasswordAuthentication yes PermitRootLogin yes
Copy to Clipboard Copied! 检查您是否可以以 root 用户身份从
192.0.2.0/24
子网连接到服务器:确定您的 IP 地址:
hostname -I
$ hostname -I 192.0.2.1
Copy to Clipboard Copied! 如果 IP 地址在
192.0.2.1
-192.0.2.254
范围内,您可以连接到服务器。以
root
用户身份连接到服务器:ssh root@<ssh_server>
$ ssh root@<ssh_server>
Copy to Clipboard Copied!
25.3. 对非独占配置使用 sshd
RHEL 系统角色
默认情况下,应用 sshd
RHEL 系统角色会覆盖整个配置。如果您之前调整了配置,例如使用不同的 RHEL 系统角色或 playbook,则这可能会出现问题。要只对所选配置选项应用 sshd
RHEL 系统角色,同时保留其他选项,您可以使用非独占配置。
您可以应用非独占配置:
- 在 RHEL 8 及更早版本中使用配置片段。
-
在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为
/etc/ssh/sshd_config.d/00-ansible_system_role.conf
。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:对于运行 RHEL 8 或更早版本的受管节点:
--- - name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure SSHD to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_namespace: <my-application> sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR
--- - name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure SSHD to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_namespace: <my-application> sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR
Copy to Clipboard Copied! 对于运行 RHEL 9 或更高版本的受管节点:
- name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR
- name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
sshd_config_namespace: <my-application>
- 角色将您在 playbook 中指定的配置放在给定命名空间下的现有配置文件中的配置片段中。当从不同上下文运行角色时,您需要选择一个不同的命名空间。
sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf
-
在
sshd_config_file
变量中,定义sshd
系统角色将配置选项写入其中的.conf
文件。使用两位前缀,例如42-
来指定应用配置文件的顺序。 AcceptEnv:
控制 OpenSSH 服务器(
sshd
)将接受来自客户端的哪些环境变量:-
LANG
:定义语言和区域设置。 -
LS_COLORS
:定义终端中ls
命令的显示颜色方案。 -
EDITOR
: 指定需要打开编辑器的命令行程序的默认文本编辑器。
-
有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.sshd/README.md
文件和sshd_config (5)
手册页。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证 SSH 服务器上的配置:
对于运行 RHEL 8 或更早版本的受管节点:
cat /etc/ssh/sshd_config ... BEGIN sshd system role managed block: namespace <my-application> Match all AcceptEnv LANG LS_COLORS EDITOR END sshd system role managed block: namespace <my-application>
# cat /etc/ssh/sshd_config ... # BEGIN sshd system role managed block: namespace <my-application> Match all AcceptEnv LANG LS_COLORS EDITOR # END sshd system role managed block: namespace <my-application>
Copy to Clipboard Copied! 对于运行 RHEL 9 或更高版本的受管节点:
cat /etc/ssh/sshd_config.d/42-my-application.conf Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
# cat /etc/ssh/sshd_config.d/42-my-application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
Copy to Clipboard Copied!
25.4. 使用 sshd
RHEL 系统角色覆盖 SSH 服务器上的系统范围的加密策略
当默认加密设置没有满足某些安全或兼容性需求时,您可能需要使用 sshd
RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围的加密策略。特别是在以下值得注意的情况:
- 与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
- 强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
- 性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
- 针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
从 sshd
RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Deploy SSH configuration for OpenSSH server hosts: managed-node-01.example.com tasks: - name: Overriding the system-wide cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_sysconfig: true sshd_sysconfig_override_crypto_policy: true sshd_KexAlgorithms: ecdh-sha2-nistp521 sshd_Ciphers: aes256-ctr sshd_MACs: hmac-sha2-512-etm@openssh.com sshd_HostKeyAlgorithms: rsa-sha2-512,rsa-sha2-256
- name: Deploy SSH configuration for OpenSSH server hosts: managed-node-01.example.com tasks: - name: Overriding the system-wide cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_sysconfig: true sshd_sysconfig_override_crypto_policy: true sshd_KexAlgorithms: ecdh-sha2-nistp521 sshd_Ciphers: aes256-ctr sshd_MACs: hmac-sha2-512-etm@openssh.com sshd_HostKeyAlgorithms: rsa-sha2-512,rsa-sha2-256
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
sshd_KexAlgorithms
-
您可以选择密钥交换算法,例如
ecdh-sha2-nistp256
,ecdh-sha2-nistp384
,ecdh-sha2-nistp521
,diffie-hellman-group14-sha1
或diffie-hellman-group-exchange-sha256
。 sshd_Ciphers
-
您可以选择密码,例如
aes128-ctr
、es192-ctr
或aes256-ctr
。 sshd_MACs
-
您可以选择 MAC,例如
hmac-sha2-256
、hmac-sha2-512
或hmac-sha1
。 sshd_HostKeyAlgorithms
-
您可以选择一个公钥算法,如
ecdsa-sha2-nistp256
,ecdsa-sha2-nistp384
,ecdsa-sha2-nistp521
或ssh-rsa
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.sshd/README.md
文件。在 RHEL 9 受管节点上,系统角色会将配置写入到
/etc/ssh/sshd_config.d/00-ansible_system_role.conf
文件中,其中加密选项会被自动应用。您可以使用sshd_config_file
变量更改文件。但是,为了确保配置有效,请使用一个按字典顺序位于/etc/ssh/sshd_config.d/50-redhat.conf
文件之前的文件名,其中包括配置的加密策略。在 RHEL 8 受管节点上,您必须通过将
sshd_sysconfig_override_crypto_policy
和sshd_sysconfig
变量设置为true
来启用覆盖。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:
ssh -vvv <ssh_server>
$ ssh -vvv <ssh_server> ... debug2: peer server KEXINIT proposal debug2: KEX algorithms: ecdh-sha2-nistp521 debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256 debug2: ciphers ctos: aes256-ctr debug2: ciphers stoc: aes256-ctr debug2: MACs ctos: hmac-sha2-512-etm@openssh.com debug2: MACs stoc: hmac-sha2-512-etm@openssh.com ...
Copy to Clipboard Copied!
25.5. ssh
RHEL 系统角色如何将 playbook 中的设置映射到配置文件
在 ssh
RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。
如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config
文件。
在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yes
或 no
。您可以使用列表来定义多行配置项。例如:
LocalForward: - 22 localhost:2222 - 403 localhost:4003
LocalForward:
- 22 localhost:2222
- 403 localhost:4003
呈现为:
LocalForward 22 localhost:2222 LocalForward 403 localhost:4003
LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
配置选项区分大小写。
25.6. 使用 ssh
RHEL 系统角色配置 OpenSSH 客户端
您可以使用 ssh
RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:
- 安全连接启动
- 凭证置备
- 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
- 能够安全地向和从 OpenSSH 服务器发送文件
您可以将 ssh
RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh
RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: SSH client configuration hosts: managed-node-01.example.com tasks: - name: Configure ssh clients ansible.builtin.include_role: name: redhat.rhel_system_roles.ssh vars: ssh_user: root ssh: Compression: true GSSAPIAuthentication: no ControlMaster: auto ControlPath: ~/.ssh/.cm%C Host: - Condition: example Hostname: server.example.com User: user1 ssh_ForwardX11: no
--- - name: SSH client configuration hosts: managed-node-01.example.com tasks: - name: Configure ssh clients ansible.builtin.include_role: name: redhat.rhel_system_roles.ssh vars: ssh_user: root ssh: Compression: true GSSAPIAuthentication: no ControlMaster: auto ControlPath: ~/.ssh/.cm%C Host: - Condition: example Hostname: server.example.com User: user1 ssh_ForwardX11: no
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
ssh_user: root
-
使用特定配置在受管节点上配置
root
用户的 SSH 客户端首选项。 Compression: true
- 压缩被启用。
ControlMaster: auto
-
ControlMaster 多路复用设置为
auto
。 Host
-
创建别名
example
,来以名为user1
的用户身份连接到server.example.com
主机。 ssh_ForwardX11: no
- X11 转发被禁用。
有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ssh/README.md
文件和ssh_config (5)
手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
通过显示 SSH 配置文件来验证受管节点是否有正确的配置:
cat ~/root/.ssh/config Ansible managed Compression yes ControlMaster auto ControlPath ~/.ssh/.cm%C ForwardX11 no GSSAPIAuthentication no Host example Hostname example.com User user1
# cat ~/root/.ssh/config # Ansible managed Compression yes ControlMaster auto ControlPath ~/.ssh/.cm%C ForwardX11 no GSSAPIAuthentication no Host example Hostname example.com User user1
Copy to Clipboard Copied!
第 26 章 使用 RHEL 系统角色管理本地存储
要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 storage
角色,这是 RHEL 9 中提供的 RHEL 系统角色之一。
使用 存储
角色可让您自动管理多台机器上的磁盘和逻辑卷上的文件系统,以及从 RHEL 7.7 开始的所有 RHEL 版本。
26.1. 使用 storage
RHEL 系统角色在块设备上创建 XFS 文件系统
示例 Ansible playbook 使用 storage 角色,使用默认参数在块设备上创建一个 XFS 文件系统。如果 /dev/sdb
设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。
存储
角色只能在未分区、整个磁盘或逻辑卷(LV)上创建文件系统。它不能在分区中创建文件系统。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create an XFS file system on a block device ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create an XFS file system on a block device ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
name: barefs
-
卷名称(示例中为
barefs
)目前是任意的。storage
角色根据disks
属性下列出的磁盘设备来识别卷。 fs_type: <file_system>
-
如果要使用默认的文件系统 XFS,您可以省略
fs_type
参数。 disks: <list_of_disks_and_volumes>
磁盘和 LV 名称的 YAML 列表。要在 LV 上创建文件系统,请在
disks
属性下提供 LVM 设置,包括括起来的卷组。详情请参阅 使用 storage RHEL 系统角色创建或者调整逻辑卷大小 。不要提供到 LV 设备的路径。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
26.2. 使用 storage
RHEL 系统角色永久挂载文件系统
示例 Ansible playbook 使用 storage 角色来永久挂载现有的文件系统。它通过向 /etc/fstab
文件中添加合适的条目来确保文件系统立即可用并永久挂载。这允许文件系统在重启后保持挂载。如果 /dev/sdb
设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Persistently mount a file system ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs mount_point: /mnt/data mount_user: somebody mount_group: somegroup mount_mode: 0755
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Persistently mount a file system ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs mount_point: /mnt/data mount_user: somebody mount_group: somegroup mount_mode: 0755
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
26.3. 使用 storage
RHEL 系统角色创建或者调整逻辑卷大小
使用 storage
角色执行以下任务:
- 在由多个磁盘组成的卷组中创建 LVM 逻辑卷
- 调整 LVM 上现有文件系统的大小
- 以池总大小的百分比表示 LVM 卷大小
如果卷组不存在,角色会创建它。如果逻辑卷在卷组中存在,如果大小与 playbook 中指定的内容不匹配,则会调整大小。
如果您要缩小逻辑卷,为了避免数据丢失,您必须确保该逻辑卷上的文件系统没有使用正在缩小的逻辑卷中的空间。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create logical volume ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - sda - sdb - sdc volumes: - name: mylv size: 2G fs_type: ext4 mount_point: /mnt/data
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create logical volume ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - sda - sdb - sdc volumes: - name: mylv size: 2G fs_type: ext4 mount_point: /mnt/data
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
size: <size>
- 您必须使用单位(如 GiB)或百分比(例如 60%)来指定大小。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证指定的卷是否已创建或调整到请求的大小:
ansible managed-node-01.example.com -m command -a 'lvs myvg'
# ansible managed-node-01.example.com -m command -a 'lvs myvg'
Copy to Clipboard Copied!
26.4. 使用 storage
RHEL 系统角色启用在线块丢弃
您可以使用在线块丢弃选项挂载 XFS 文件系统,来自动丢弃未使用的块。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Enable online block discard ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs mount_point: /mnt/data mount_options: discard
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Enable online block discard ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs mount_point: /mnt/data mount_options: discard
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证在线块丢弃选项是否已启用:
ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'
# ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'
Copy to Clipboard Copied!
26.5. 使用 storage
RHEL 系统角色创建并挂载文件系统
示例 Ansible playbook 使用 storage 角色创建和挂载文件系统。它通过向 /etc/fstab
文件中添加合适的条目来确保文件系统立即可用并永久挂载。这允许文件系统在重启后保持挂载。如果 /dev/sdb
设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: -name: Create and mount a file system ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: ext4 fs_label: label-name mount_point: /mnt/data
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: -name: Create and mount a file system ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: ext4 fs_label: label-name mount_point: /mnt/data
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
disks: <list_of_devices>
- 角色在创建卷时使用的设备名称的 YAML 列表。
fs_type: <file_system>
-
指定角色应在卷上设置的文件系统。您可以选择
xfs
、ext3
、ext4
、swap
或unformatted
。 label-name: <file_system_label>
- 可选:设置文件系统的标签。
mount_point: <directory>
-
可选:如果卷应自动挂载,请将
mount_point
变量设置为应挂载卷的目录。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
26.6. 使用 storage
RHEL 系统角色配置 RAID 卷
使用 storage
系统角色,您可以使用 Red Hat Ansible Automation Platform 和 Ansible-Core 在 RHEL 上配置一个 RAID 卷。使用参数创建一个 Ansible playbook,以配置 RAID 卷以满足您的要求。
设备名称在某些情况下可能会改变,例如:当您在系统中添加新磁盘时。因此,为了避免数据丢失,请在 playbook 中使用持久性命名属性。有关持久性命名属性的更多信息,请参阅 持久性命名属性。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create a RAID on sdd, sde, sdf, and sdg ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_volumes: - name: data type: raid disks: [sdd, sde, sdf, sdg] raid_level: raid0 raid_chunk_size: 32 KiB mount_point: /mnt/data state: present
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create a RAID on sdd, sde, sdf, and sdg ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_volumes: - name: data type: raid disks: [sdd, sde, sdf, sdg] raid_level: raid0 raid_chunk_size: 32 KiB mount_point: /mnt/data state: present
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证阵列是否被正确创建:
ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'
# ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'
Copy to Clipboard Copied!
26.7. 使用 storage
RHEL 系统角色配置带有 RAID 的 LVM 池
使用 storage
系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置一个带有 RAID 的 LVM 池。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Configure LVM pool with RAID ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_pools: - name: my_pool type: lvm disks: [sdh, sdi] raid_level: raid1 volumes: - name: my_volume size: "1 GiB" mount_point: "/mnt/app/shared" fs_type: xfs state: present
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Configure LVM pool with RAID ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_pools: - name: my_pool type: lvm disks: [sdh, sdi] raid_level: raid1 volumes: - name: my_volume size: "1 GiB" mount_point: "/mnt/app/shared" fs_type: xfs state: present
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证您的池是否在 RAID 上:
ansible managed-node-01.example.com -m command -a 'lsblk'
# ansible managed-node-01.example.com -m command -a 'lsblk'
Copy to Clipboard Copied!
26.8. 使用 storage
RHEL 系统角色为 RAID LVM 卷配置条带大小
使用 storage
系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上为 RAID LVM 卷配置条带大小。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Configure stripe size for RAID LVM volumes ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_pools: - name: my_pool type: lvm disks: [sdh, sdi] volumes: - name: my_volume size: "1 GiB" mount_point: "/mnt/app/shared" fs_type: xfs raid_level: raid0 raid_stripe_size: "256 KiB" state: present
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Configure stripe size for RAID LVM volumes ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_safe_mode: false storage_pools: - name: my_pool type: lvm disks: [sdh, sdi] volumes: - name: my_volume size: "1 GiB" mount_point: "/mnt/app/shared" fs_type: xfs raid_level: raid0 raid_stripe_size: "256 KiB" state: present
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证条带大小是否被设置为所需的大小:
ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'
# ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'
Copy to Clipboard Copied!
26.9. 使用 storage
RHEL 系统角色配置 LVM-VDO 卷
您可以使用 storage
RHEL 系统角色,在启用了压缩和去重的 LVM (LVM-VDO)上创建一个 VDO 卷。
由于 storage
系统角色使用 LVM-VDO,因此每个池只能创建一个卷。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create LVM-VDO volume under volume group 'myvg' ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - /dev/sdb volumes: - name: mylv1 compression: true deduplication: true vdo_pool_size: 10 GiB size: 30 GiB mount_point: /mnt/app/shared
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create LVM-VDO volume under volume group 'myvg' ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - /dev/sdb volumes: - name: mylv1 compression: true deduplication: true vdo_pool_size: 10 GiB size: 30 GiB mount_point: /mnt/app/shared
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
vdo_pool_size: <size>
- 卷在设备上使用的实际大小。您可以以人类可读的格式指定大小,如 10 GiB。如果没有指定单位,则默认为字节。
size: <size>
- VDO 卷的虚拟大小。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查看压缩和去重的当前状态:
ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state'
$ ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state' LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDOCompression VDOCompressionState VDODeduplication VDOIndexState mylv1 myvg vwi-a-v--- 3.00t vpool0 enabled online enabled online
Copy to Clipboard Copied!
26.10. 使用 storage
RHEL 系统角色创建 LUKS2 加密的卷
您可以通过运行 Ansible playbook,使用 storage
角色来创建和配置使用 LUKS 加密的卷。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:luks_password: <password>
luks_password: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create and configure a volume encrypted with LUKS ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs fs_label: <label> mount_point: /mnt/data encryption: true encryption_password: "{{ luks_password }}"
--- - name: Manage local storage hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create and configure a volume encrypted with LUKS ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs fs_label: <label> mount_point: /mnt/data encryption: true encryption_password: "{{ luks_password }}"
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
查找 LUKS 加密的卷的
luksUUID
值:ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb'
# ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb' 4e4e7970-1822-470e-b55a-e91efe5d0f5c
Copy to Clipboard Copied! 查看卷的加密状态:
ansible managed-node-01.example.com -m command -a 'cryptsetup status luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c'
# ansible managed-node-01.example.com -m command -a 'cryptsetup status luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c' /dev/mapper/luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c is active and is in use. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/sdb ...
Copy to Clipboard Copied! 验证创建的 LUKS 加密的卷:
ansible managed-node-01.example.com -m command -a 'cryptsetup luksDump /dev/sdb'
# ansible managed-node-01.example.com -m command -a 'cryptsetup luksDump /dev/sdb' LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: 4e4e7970-1822-470e-b55a-e91efe5d0f5c Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] ...
Copy to Clipboard Copied!
26.12. 使用 storage
RHEL 系统角色调整物理卷大小
使用 storage
系统角色,您可以在从主机外调整底层存储或磁盘大小后调整 LVM 物理卷大小。例如:您增加了虚拟磁盘的大小,并希望在现有 LVM 中使用额外的空间。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 底层块存储的大小已被更改。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Resize LVM PV size ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: ["sdf"] type: lvm grow_to_fill: true
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Resize LVM PV size ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: ["sdf"] type: lvm grow_to_fill: true
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示新物理卷大小:
ansible managed-node-01.example.com -m command -a 'pvs'
$ ansible managed-node-01.example.com -m command -a 'pvs' PV VG Fmt Attr PSize PFree /dev/sdf1 myvg lvm2 a-- 1,99g 1,99g
Copy to Clipboard Copied!
26.13. 使用 storage RHEL 系统角色创建加密的 Stratis 池
要保护数据,您可以使用 storage
RHEL 系统角色创建一个加密的 Stratis 池。除了密码短语外,您还可以使用 Clevis 和 Tang 或 TPM 保护作为加密方法。
您只能对整个池配置 Stratis 加密。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您可以连接到 Tang 服务器。如需更多信息,请参阅 部署 SELinux 为 enforcing 模式的 Tang 服务器。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:luks_password: <password>
luks_password: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create a new encrypted Stratis pool with Clevis and Tang ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: mypool disks: - sdd - sde type: stratis encryption: true encryption_password: "{{ luks_password }}" encryption_clevis_pin: tang encryption_tang_url: tang-server.example.com:7500
--- - name: Manage local storage hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create a new encrypted Stratis pool with Clevis and Tang ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: mypool disks: - sdd - sde type: stratis encryption: true encryption_password: "{{ luks_password }}" encryption_clevis_pin: tang encryption_tang_url: tang-server.example.com:7500
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
encryption_password
- 用于解锁 LUKS 卷的密码或密码短语。
encryption_clevis_pin
-
可用来加密创建的池的 Clevis 方法。您可以使用
tang
和tpm2
。 encryption_tang_url
- Tang 服务器的 URL。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
验证是否创建了池,并配置了 Clevis 和 Tang :
ansible managed-node-01.example.com -m command -a 'sudo stratis report'
$ ansible managed-node-01.example.com -m command -a 'sudo stratis report' ... "clevis_config": { "thp": "j-G4ddvdbVfxpnUbgxlpbe3KutSKmcHttILAtAkMTNA", "url": "tang-server.example.com:7500" }, "clevis_pin": "tang", "in_use": true, "key_description": "blivet-mypool",
Copy to Clipboard Copied!
第 27 章 使用 sudo 系统角色
作为管理员,您可以使用 sudo
RHEL 系统角色在多个系统上一致地配置 /etc/sudoers
文件。
27.1. 使用 RHEL 系统角色应用自定义 sudoers
配置
您可以使用 sudo
RHEL 系统角色在受管节点上应用自定义 sudoers
配置。这样,您可以定义哪些用户可以在哪些主机上运行哪些命令,从而获得更好的配置效率和更精细的控制。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: "Configure sudo" hosts: managed-node-01.example.com tasks: - name: "Apply custom /etc/sudoers configuration" ansible.builtin.include_role: name: redhat.rhel_system_roles.sudo vars: sudo_sudoers_files: - path: "/etc/sudoers" user_specifications: - users: - <user_name> hosts: - <host_name> commands: - <path_to_command_binary>
--- - name: "Configure sudo" hosts: managed-node-01.example.com tasks: - name: "Apply custom /etc/sudoers configuration" ansible.builtin.include_role: name: redhat.rhel_system_roles.sudo vars: sudo_sudoers_files: - path: "/etc/sudoers" user_specifications: - users: - <user_name> hosts: - <host_name> commands: - <path_to_command_binary>
Copy to Clipboard Copied! playbook 中指定的设置包括:
users
- 规则适用的用户的列表。
hosts
-
规则适用的主机的列表。对于所有主机,您可以使用
ALL
。 commands
规则适用的命令的列表。对于所有命令,您可以使用
ALL
。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.sudo/README.md
文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在受管节点上,验证 playbook 是否应用了新规则。
cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>
# cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>
Copy to Clipboard Copied!
第 28 章 使用 RHEL 系统角色管理 systemd
单元
通过使用 systemd
RHEL 系统角色,您可以自动化某些与 systemd 相关的任务,并远程执行它们。您可以对以下操作使用角色:
- 管理服务
- 部署单元
- 部署置入文件
28.1. 使用 systemd RHEL 系统角色管理服务
您可以使用 systemd
RHEL 系统角色自动并远程管理 systemd 单元,如启动或启用服务。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:根据您要执行的操作,只使用变量。--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Perform action on systemd units ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_started_units: - <systemd_unit_1>.service systemd_stopped_units: - <systemd_unit_2>.service systemd_restarted_units: - <systemd_unit_3>.service systemd_reloaded_units: - <systemd_unit_4>.service systemd_enabled_units: - <systemd_unit_5>.service systemd_disabled_units: - <systemd_unit_6>.service systemd_masked_units: - <systemd_unit_7>.service systemd_unmasked_units: - <systemd_unit_8>.service
--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Perform action on systemd units ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_started_units: - <systemd_unit_1>.service systemd_stopped_units: - <systemd_unit_2>.service systemd_restarted_units: - <systemd_unit_3>.service systemd_reloaded_units: - <systemd_unit_4>.service systemd_enabled_units: - <systemd_unit_5>.service systemd_disabled_units: - <systemd_unit_6>.service systemd_masked_units: - <systemd_unit_7>.service systemd_unmasked_units: - <systemd_unit_8>.service
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
28.2. 使用 systemd RHEL 系统角色部署 systemd 置入文件
systemd 在从其他位置读取单元的设置之上应用置入文件。因此,您可以使用置入文件修改单元设置,而无需更改原始单元文件。通过使用 systemd
RHEL 系统角色,您可以自动化部署置入文件的过程。
角色使用硬编码的文件名 99-override.conf
,将置入文件存储在 /etc/systemd/system/<name>._<unit_type>/
中。请注意,它会在目标目录中使用此名称覆盖现有文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
使用 systemd 置入文件内容创建一个 Jinja2 模板。例如,使用以下内容创建
~/sshd.service.conf.j2
文件:{{ ansible_managed | comment }} [Unit] After= After=network.target sshd-keygen.target network-online.target
{{ ansible_managed | comment }} [Unit] After= After=network.target sshd-keygen.target network-online.target
Copy to Clipboard Copied! 此置入文件在
After
设置中指定与原始/usr/lib/systemd/system/sshd.service
文件以及network-online.target
文件相同的单元。使用这个额外目标,sshd
在网络接口激活并分配了 IP 地址后启动。这确保sshd
可以绑定到所有 IP 地址。对文件名使用
<name>.<unit_type>.conf.j2
约定。例如,要为sshd.service
单元添加一个置入文件,您必须将文件命名为sshd.service.conf.j2
。将文件与 playbook 放在同一个目录中。创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy an sshd.service systemd drop-in file ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_dropins: - sshd.service.conf.j2
--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy an sshd.service systemd drop-in file ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_dropins: - sshd.service.conf.j2
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
systemd_dropins: <list_of_files>
- 指定要以 YAML 列表格式部署的置入文件的名称。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证角色是否将置入文件放在了正确的位置:
ansible managed-node-01.example.com -m command -a 'ls /etc/systemd/system/sshd.service.d/'
# ansible managed-node-01.example.com -m command -a 'ls /etc/systemd/system/sshd.service.d/' 99-override.conf
Copy to Clipboard Copied!
28.3. 使用 systemd RHEL 系统角色部署 systemd 系统单元
您可以为自定义应用程序创建单元文件,systemd 从 /etc/systemd/system/
目录中读取这些文件。通过使用 systemd
RHEL 系统角色,您可以自动部署自定义单元文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
使用自定义 systemd 单元文件内容创建一个 Jinja2 模板。例如,使用服务的内容创建
~/example.service.j2
文件:{{ ansible_managed | comment }} [Unit] Description=Example systemd service unit file [Service] ExecStart=/bin/true
{{ ansible_managed | comment }} [Unit] Description=Example systemd service unit file [Service] ExecStart=/bin/true
Copy to Clipboard Copied! 对文件名使用
<name>.<unit_type>.j2
约定。例如,要创建example.service
单元,您必须将文件命名为example.service.j2
。将文件与 playbook 放在同一个目录中。创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy, enable, and start a custom systemd service ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_unit_file_templates: - example.service.j2 systemd_enabled_units: - example.service systemd_started_units: - example.service
--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy, enable, and start a custom systemd service ansible.builtin.include_role: name: redhat.rhel_system_roles.systemd vars: systemd_unit_file_templates: - example.service.j2 systemd_enabled_units: - example.service systemd_started_units: - example.service
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证该服务是否已启用并启动:
ansible managed-node-01.example.com -m command -a 'systemctl status example.service'
# ansible managed-node-01.example.com -m command -a 'systemctl status example.service' ... ● example.service - A service for demonstrating purposes Loaded: loaded (/etc/systemd/system/example.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2024-07-04 15:59:18 CEST; 10min ago ...
Copy to Clipboard Copied!
28.4. 使用 systemd RHEL 系统角色部署 systemd 用户单元
您可以为自定义应用程序创建每个用户单元文件,systemd 从 /home/ <username> /.config/systemd/user/ 目录中读取
这些文件。通过使用 systemd
RHEL 系统角色,您可以为单个用户自动部署自定义单元文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您在 playbook 中为 systemd 单元指定的用户已存在。
流程
使用自定义 systemd 单元文件内容创建一个 Jinja2 模板。例如,使用服务的内容创建
~/example.service.j2
文件:{{ ansible_managed | comment }} [Unit] Description=Example systemd service unit file [Service] ExecStart=/bin/true RemainAfterExit=yes [Install] WantedBy=multi-user.target
{{ ansible_managed | comment }} [Unit] Description=Example systemd service unit file [Service] ExecStart=/bin/true RemainAfterExit=yes [Install] WantedBy=multi-user.target
Copy to Clipboard Copied! 对文件名使用
<name>.<unit_type>.j2
约定。例如,要创建example.service
单元,您必须将文件命名为example.service.j2
。将文件与 playbook 放在同一个目录中。创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy, enable, and start a custom systemd service for a user ansible.builtin.include_role: name: rhel-system-roles.systemd vars: systemd_unit_file_templates: - item: example.service.j2 user: <username> systemd_enabled_units: - item: example.service user: <username> systemd_started_units: - item: example.service user: <username>
--- - name: Managing systemd services hosts: managed-node-01.example.com tasks: - name: Deploy, enable, and start a custom systemd service for a user ansible.builtin.include_role: name: rhel-system-roles.systemd vars: systemd_unit_file_templates: - item: example.service.j2 user: <username> systemd_enabled_units: - item: example.service user: <username> systemd_started_units: - item: example.service user: <username>
Copy to Clipboard Copied! 重要systemd
RHEL 系统角色不会创建新用户,如果您在 playbook 中指定不存在的用户,它会返回错误。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证该服务是否已启用并启动:
ansible managed-node-01.example.com -m command -a 'systemctl --user -M <username>@ status example.service'
# ansible managed-node-01.example.com -m command -a 'systemctl --user -M <username>@ status example.service' ... ● example.service - Example systemd service unit file Loaded: loaded (/home/<username>/.config/systemd/user/example.service; enabled; preset: disabled) Active: active (exited) since Wed 2025-03-05 13:33:36 CET; 45s ago ...
Copy to Clipboard Copied!
第 29 章 使用 RHEL 系统角色配置时间同步
Network Time Protocol(NTP)和 Precision Time Protocol (PTP)是通过网络同步计算机时钟的标准。网络中准确的时间同步非常重要,因为某些服务依赖它。例如,Kerberos 只容许服务器和客户端之间很少的时间差异,以防止重播攻击。
您可以在 playbook 的 timesync_ntp_provider
变量中设置要配置的时间服务。如果没有设置此变量,角色会根据以下因素决定时间服务:
-
在 RHEL 8 及更新版本上:
chronyd
-
在 RHEL 6 和 7 上:
chronyd
(默认)或者如果已安装了ntpd
。
29.1. 使用 timesync RHEL 系统角色配置通过 NTP 的时间同步
Network Time Protocol(NTP)通过网络,将主机的时间与 NTP 服务器同步。在 IT 网络中,服务依赖于正确的系统时间,例如,出于安全和日志记录目的。通过使用 timesync
RHEL 系统角色,您可以在网络中自动配置 Red Hat Enterprise Linux NTP 客户端,并保持时间同步。
timesync
RHEL 系统角色在受管主机上替换了指定的或检测到的提供商服务的配置。因此,如果没有在 playbook 中指定,所有设置都会丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing time synchronization hosts: managed-node-01.example.com tasks: - name: Configuring NTP with an internal server (preferred) and a public server pool as fallback ansible.builtin.include_role: name: redhat.rhel_system_roles.timesync vars: timesync_ntp_servers: - hostname: time.example.com trusted: yes prefer: yes iburst: yes - hostname: 0.rhel.pool.ntp.org pool: yes iburst: yes
--- - name: Managing time synchronization hosts: managed-node-01.example.com tasks: - name: Configuring NTP with an internal server (preferred) and a public server pool as fallback ansible.builtin.include_role: name: redhat.rhel_system_roles.timesync vars: timesync_ntp_servers: - hostname: time.example.com trusted: yes prefer: yes iburst: yes - hostname: 0.rhel.pool.ntp.org pool: yes iburst: yes
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
pool: <yes|no>
- 将源标记为 NTP 池,而不是单个主机。在这种情况下,服务预期名称解析为可能会随时间变化的多个 IP 地址。
iburst: yes
- 启用快速初始同步。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.timesync/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示时间源的详情:
如果受管节点运行
chronyd
服务,请输入:ansible managed-node-01.example.com -m command -a 'chronyc sources'
# ansible managed-node-01.example.com -m command -a 'chronyc sources' MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* time.example.com 1 10 377 210 +159us[ +55us] +/- 12ms ^? ntp.example.org 2 9 377 409 +1120us[+1021us] +/- 42ms ^? time.us.example.net 2 9 377 992 -329us[ -386us] +/- 15ms ...
Copy to Clipboard Copied! 如果受管节点运行
ntpd
服务,请输入:ansible managed-node-01.example.com -m command -a 'ntpq -p'
# ansible managed-node-01.example.com -m command -a 'ntpq -p' remote refid st t when poll reach delay offset jitter ============================================================================== *time.example.com .PTB. 1 u 2 64 77 23.585 967.902 0.684 - ntp.example.or 192.0.2.17 2 u - 64 77 27.090 966.755 0.468 +time.us.example 198.51.100.19 2 u 65 64 37 18.497 968.463 1.588 ...
Copy to Clipboard Copied!
29.2. 使用 timesync RHEL 系统角色,通过 NTP 配置与 NTS 的时间同步
Network Time Protocol(NTP)通过网络,将主机的时间与 NTP 服务器同步。通过使用 Network Time Security (NTS)机制,客户端建立到服务器的 TLS 加密连接,并验证 NTP 数据包。在 IT 网络中,服务依赖于正确的系统时间,例如,出于安全和日志记录目的。通过使用 timesync
RHEL 系统角色,您可以在网络中自动配置 Red Hat Enterprise Linux NTP 客户端,并保持通过 NTS 的时间同步。
请注意,您不能将 NTS 服务器与非 NTS 服务器混合使用。在混合配置中,NTS 服务器是可信的,客户端不会回退到未经身份验证的 NTP 源,因为它们可能被中间人(MITM)攻击所利用。详情请查看您系统上 chrony.conf (5)
手册页中的 authselectmode
参数描述。
timesync
RHEL 系统角色在受管主机上替换了指定的或检测到的提供商服务的配置。因此,如果没有在 playbook 中指定,所有设置都会丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
受管节点使用
chronyd
。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Managing time synchronization hosts: managed-node-01.example.com tasks: - name: Configuring NTP with NTS-enabled servers ansible.builtin.include_role: name: redhat.rhel_system_roles.timesync vars: timesync_ntp_servers: - hostname: ptbtime1.ptb.de nts: yes iburst: yes
--- - name: Managing time synchronization hosts: managed-node-01.example.com tasks: - name: Configuring NTP with NTS-enabled servers ansible.builtin.include_role: name: redhat.rhel_system_roles.timesync vars: timesync_ntp_servers: - hostname: ptbtime1.ptb.de nts: yes iburst: yes
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
iburst: yes
- 启用快速初始同步。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.timesync/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
如果受管节点运行
chronyd
服务:显示时间源的详情:
ansible managed-node-01.example.com -m command -a 'chronyc sources'
# ansible managed-node-01.example.com -m command -a 'chronyc sources' MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ptbtime1.ptb.de 1 6 17 55 -13us[ -54us] +/- 12ms ^- ptbtime2.ptb.de 1 6 17 56 -257us[ -297us] +/- 12ms
Copy to Clipboard Copied! 对于启用了 NTS 的源,显示特定于 NTP 源身份验证的信息:
ansible managed-node-01.example.com -m command -a 'chronyc -N authdata'
# ansible managed-node-01.example.com -m command -a 'chronyc -N authdata' Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen ========================================================================= ptbtime1.ptb.de NTS 1 15 256 229 0 0 8 100 ptbtime2.ptb.de NTS 1 15 256 230 0 0 8 100
Copy to Clipboard Copied! 验证
Cook
列中报告的 cookies 是否大于 0。
如果受管节点运行
ntpd
服务,请输入:ansible managed-node-01.example.com -m command -a 'ntpq -p'
# ansible managed-node-01.example.com -m command -a 'ntpq -p' remote refid st t when poll reach delay offset jitter ============================================================================== *ptbtime1.ptb.de .PTB. 1 8 2 64 77 23.585 967.902 0.684 -ptbtime2.ptb.de .PTB. 1 8 30 64 78 24.653 993.937 0.765
Copy to Clipboard Copied!
第 30 章 使用 RHEL 系统角色配置系统,以进行会话记录
使用 tlog
RHEL 系统角色,以自动的方式记录和监控受管节点上终端会话活动。您可以使用 SSSD
服务将记录配置为为每个用户或用户组进行。
在 tlog RHEL 系统角色中记录解决方案的会话由以下组件组成:
-
tlog
工具 - 系统安全性服务守护进程(SSSD)
- 可选: Web 控制台界面
30.1. 使用 tlog
RHEL 系统角色为单个用户配置会话记录
准备并应用一个 Ansible playbook 来配置 RHEL 系统,以便将记录数据的会话记录到 systemd
日志中。
因此,您可以在用户会话期间、登录到控制台中或通过 SSH 时,启用记录特定用户的终端输出和输入。
playbook 安装 tlog-rec-session
,一个终端会话 I/O 日志记录程序,其充当用户的登录 shell。角色创建一个 SSSD 配置丢弃文件,此文件定义登录 shell 应用于哪些用户和组。另外,如果系统上安装了 cockpit
软件包,playbook 也会安装 cockpit-session-recording
软件包,它是一个 Cockpit
模块,供您在 web 控制台界面中查看和播放记录。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy session recording hosts: managed-node-01.example.com tasks: - name: Enable session recording for specific users ansible.builtin.include_role: name: redhat.rhel_system_roles.tlog vars: tlog_scope_sssd: some tlog_users_sssd: - <recorded_user>
--- - name: Deploy session recording hosts: managed-node-01.example.com tasks: - name: Enable session recording for specific users ansible.builtin.include_role: name: redhat.rhel_system_roles.tlog vars: tlog_scope_sssd: some tlog_users_sssd: - <recorded_user>
Copy to Clipboard Copied! tlog_scope_sssd: <value>
-
一些
值指定只记录某些用户和组,而不是all
或none
。 tlog_users_sssd: <list_of_users>
- 您要记录会话的用户的 YAML 列表。请注意,如果不存在,角色不会添加用户。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
检查 SSSD 置入文件的内容:
cd /etc/sssd/conf.d/sssd-session-recording.conf
# cd /etc/sssd/conf.d/sssd-session-recording.conf
Copy to Clipboard Copied! 您可以看到该文件包含您在 playbook 中设置的参数。
- 以其会话将被记录的用户的身份登录,执行某些操作,然后退出登录。
以
root
用户身份:显示记录的会话的列表:
journalctl _COMM=tlog-rec-sessio
# journalctl _COMM=tlog-rec-sessio Nov 12 09:17:30 managed-node-01.example.com -tlog-rec-session[1546]: {"ver":"2.3","host":"managed-node-01.example.com","rec":"07418f2b0f334c1696c10cbe6f6f31a6-60a-e4a2","user":"demo-user",... ...
Copy to Clipboard Copied! 在下一步中需要
rec
(记录 ID)字段的值。请注意,由于 15 个字符的限制,
_COMM
字段的值被缩短了。回放会话:
tlog-play -r journal -M TLOG_REC=<recording_id>
# tlog-play -r journal -M TLOG_REC=<recording_id>
Copy to Clipboard Copied!
30.2. 使用 tlog
RHEL 系统角色将某些用户和组从会话记录中排除
您可以使用 tlog
RHEL 系统角色中的 tlog_exclude_users_sssd
和 tlog_exclude_groups_sssd
角色变量将用户或组从记录的会话中排除,并记录在 systemd
日志中。
playbook 安装 tlog-rec-session
,一个终端会话 I/O 日志记录程序,其充当用户的登录 shell。角色创建一个 SSSD 配置丢弃文件,此文件定义登录 shell 应用于哪些用户和组。另外,如果系统上安装了 cockpit
软件包,playbook 也会安装 cockpit-session-recording
软件包,它是一个 Cockpit
模块,供您在 web 控制台界面中查看和播放记录。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Deploy session recording excluding users and groups hosts: managed-node-01.example.com tasks: - name: Exclude users and groups ansible.builtin.include_role: name: redhat.rhel_system_roles.tlog vars: tlog_scope_sssd: all tlog_exclude_users_sssd: - jeff - james tlog_exclude_groups_sssd: - admins
--- - name: Deploy session recording excluding users and groups hosts: managed-node-01.example.com tasks: - name: Exclude users and groups ansible.builtin.include_role: name: redhat.rhel_system_roles.tlog vars: tlog_scope_sssd: all tlog_exclude_users_sssd: - jeff - james tlog_exclude_groups_sssd: - admins
Copy to Clipboard Copied! tlog_scope_sssd: <value>
-
值
all
指定您要记录所有用户和组。 tlog_exclude_users_sssd: <user_list>
- 您要从会话记录中排除的用户的 YAML 列表。
tlog_exclude_groups_sssd: <group_list>
- 您要从会话记录中排除的组的 YAML 列表。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
检查 SSSD 置入文件的内容:
cat /etc/sssd/conf.d/sssd-session-recording.conf
# cat /etc/sssd/conf.d/sssd-session-recording.conf
Copy to Clipboard Copied! 您可以看到该文件包含您在 playbook 中设置的参数。
- 以其会话将被记录的用户的身份登录,执行某些操作,然后退出登录。
以
root
用户身份:显示记录的会话的列表:
journalctl _COMM=tlog-rec-sessio
# journalctl _COMM=tlog-rec-sessio Nov 12 09:17:30 managed-node-01.example.com -tlog-rec-session[1546]: {"ver":"2.3","host":"managed-node-01.example.com","rec":"07418f2b0f334c1696c10cbe6f6f31a6-60a-e4a2","user":"demo-user",... ...
Copy to Clipboard Copied! 在下一步中需要
rec
(记录 ID)字段的值。请注意,由于 15 个字符的限制,
_COMM
字段的值被缩短了。回放会话:
tlog-play -r journal -M TLOG_REC=<recording_id>
# tlog-play -r journal -M TLOG_REC=<recording_id>
Copy to Clipboard Copied!
第 31 章 使用 RHEL 系统角色配置 VPN 连接
VPN 是一个加密连接,用于通过不受信任的网络安全地传输流量。通过使用 vpn
RHEL 系统角色,您可以自动执行创建 VPN 配置的过程。
vpn
RHEL 系统角色只支持 Libreswan (一个 IPsec 实现),作为 VPN 供应商。
31.1. 使用 vpn
RHEL 系统角色使用 PSK 身份验证创建主机到主机的 IPsec VPN
您可以使用 IPsec 通过 VPN 直接连接主机。主机可以使用预共享密钥(PSK)来相互进行身份验证。通过使用 vpn
RHEL 系统角色,您可以使用 PSK 身份验证自动创建 IPsec 主机到主机连接的过程。
默认情况下,该角色创建基于隧道的 VPN。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
hosts: <list>
使用您要配置 VPN 的主机定义 YAML 字典。如果条目不是 Ansible 受管节点,您必须在
hostname
参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! 该角色在每个受管节点上配置 VPN 连接。连接名为 <
host_A>-to-<host_B
>,例如managed-node-01.example.com-to-managed-node-02.example.com
。请注意,该角色不能在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。auth_method: psk
-
启用主机间的 PSK 身份验证。该角色使用控制节点上的
openssl
创建 PSK。 auto: <start-up_method>
-
指定连接的启动方法。有效值包括
添加
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义该角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义该角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
确认连接成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
Copy to Clipboard Copied! 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为启动
以外的值,您可能需要首先手动激活受管节点上的连接。
31.2. 使用 PSK 身份验证创建主机到主机的 IPsec VPN,并使用 vpn
RHEL 系统角色分隔数据和 control plane
您可以使用 IPsec 通过 VPN 直接连接主机。例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn
RHEL 系统角色,您可以使用单独的数据和 control plane 和 PSK 身份验证自动创建 IPsec 主机到主机连接的过程。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
hosts: <list>
使用您要配置 VPN 的主机定义 YAML 字典。连接名为 <
name>-<IP_address_A>-to- <IP_address_B
>,如control_plane_vpn-203.0.113.1-to-198.51.100.2
。该角色在每个受管节点上配置 VPN 连接。请注意,该角色不能在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。
auth_method: psk
-
启用主机间的 PSK 身份验证。该角色在控制节点上使用
openssl
创建预共享密钥。 auto: <start-up_method>
-
指定连接的启动方法。有效值包括
添加
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义该角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义该角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
确认连接成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"' ... 006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
Copy to Clipboard Copied! 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为启动
以外的值,您可能需要首先手动激活受管节点上的连接。
31.3. 使用 vpn
RHEL 系统角色在多个主机中使用基于证书的身份验证创建 IPsec mesh VPN
Libreswan 支持创建一个 opportunistic mesh,以便在每个主机上具有单个配置的大量主机之间建立 IPsec 连接。在网格中添加主机不需要更新现有主机上的配置。为提高安全性,请在 Libreswan 中使用基于证书的身份验证。
通过使用 vpn
RHEL 系统角色,您可以使用受管节点中的基于证书的身份验证自动配置 VPN 网格。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 您可以为每个受管节点准备一个 PKCSautomationhub 文件:
每个文件包含:
- 证书颁发机构(CA)证书
- 节点的私钥
- 节点的客户端证书
-
这些文件名为 <
managed_node_name_as_in_the_inventory>.p12
。 - 文件存储在与 playbook 相同的目录中。
流程
编辑
~/inventory
文件,并附加cert_name
变量:managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
Copy to Clipboard Copied! 将
cert_name
变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pkcs12_pwd: <password>
pkcs12_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Remove IPsec NSS database files ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ db_files.files }}" when: db_files.matched > 0 - name: Initialize IPsec NSS database ansible.builtin.command: cmd: ipsec initnss - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: true
- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Remove IPsec NSS database files ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ db_files.files }}" when: db_files.matched > 0 - name: Initialize IPsec NSS database ansible.builtin.command: cmd: ipsec initnss - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
opportunistic: true
-
在多个主机间启用 opportunistic mesh。
policies
变量定义哪些子网和主机流量必须或可以加密,哪些应该继续使用明文连接。 auth_method: cert
- 启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
policies: & lt;list_of_policies>
以 YAML 列表格式定义 Libreswan 策略。
默认策略是
private-or-clear
。要将它更改为私有
,上面的 playbook 包含默认cidr
条目的 according 策略。如果 Ansible 控制节点与受管节点位于同一个 IP 子网中,则防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加
清晰
策略。例如,如果应该为192.0.2.0/24
子网配置了网格,并且控制节点使用 IP 地址192.0.2.1
,则需要明文策略用于
192.0.2.1/32
,如 playbook 所示。有关策略的详情,请查看安装了 Libreswan 的系统上的
ipsec.conf (5)
手册页。vpn_manage_firewall: true
-
定义该角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义该角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
在网格的一个节点中,ping 另一个节点激活连接:
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! 确认连接处于活跃状态:
ipsec trafficstatus
[root@managed-node-01]# ipsec trafficstatus 006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
Copy to Clipboard Copied!
第 32 章 使用 RHEL 系统角色配置 Microsoft SQL Server
您可以使用 microsoft.sql.server
Ansible 系统角色自动化 Microsoft SQL Server 的安装和管理。此角色还通过应用 mssql
TuneD 配置文件优化 Red Hat Enterprise Linux (RHEL),来提高 SQL Server 的性能和吞吐量。
在安装过程中,角色将 SQL Server 的存储库及相关软件包添加到受管主机。这些存储库中的软件包由 Microsoft 提供、维护和托管。
32.1. 使用 microsoft.sql.server
Ansible 系统角色,使用现有 TLS 证书安装和配置 SQL Server
如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。通过使用 microsoft.sql.server
Ansible 系统角色,您可以自动化这个过程,并使用 TLS 加密远程安装和配置 SQL Server。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。
根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:
- RHEL 7.9: SQL Server 2017 和 2019
- RHEL 8: SQL Server 2017, 2019, 和 2022
- RHEL 9.4 及更新版本:SQL Server 2022
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
您已在控制节点上安装了
ansible-collection-microsoft-sql
软件包或microsoft.sql
集合。 - 受管节点安装了 2 GB 或更多 RAM。
- 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
-
您将
sql_crt.pem
文件中的证书存储在与 playbook 相同的目录中。 -
您将
sql_cert.key
文件中的私钥存储在与 playbook 相同的目录中。 - SQL 客户端信任签发证书的 CA。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:sa_pwd: <sa_password>
sa_pwd: <sa_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with an existing private key and certificate ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_tls_enable: true mssql_tls_self_sign: false mssql_tls_cert: sql_crt.pem mssql_tls_private_key: sql_cert.key mssql_tls_version: 1.2 mssql_tls_force: true
--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with an existing private key and certificate ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_tls_enable: true mssql_tls_self_sign: false mssql_tls_cert: sql_crt.pem mssql_tls_private_key: sql_cert.key mssql_tls_version: 1.2 mssql_tls_force: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
mssql_tls_enable: true
-
启用 TLS 加密。如果启用此设置,您还必须定义
mssql_tls_cert
和mssql_tls_private_key
。 mssql_tls_self_sign: false
-
指明您使用的证书是自签名的。根据此设置,角色决定是否运行带有
-C
参数的sqlcmd
命令,以信任证书。 mssql_tls_cert: <path>
-
设置存储在控制节点上 TLS 证书的路径。角色将此文件复制到受管节点上的
/etc/pki/tls/certs/
目录中。 mssql_tls_private_key: <path>
-
设置控制节点上 TLS 私钥的路径。角色将此文件复制到受管节点上的
/etc/pki/tls/private/
目录中。 mssql_tls_force: true
- 如果它们都存在,那么替换目标目录中的 TLS 证书和私钥。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/microsoft.sql-server/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
在 SQL Server 主机上,使用带有
-N
参数的sqlcmd
工具来建立到 SQL 服务器的加密连接,并运行查询,例如:/opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
$ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
Copy to Clipboard Copied! 如果命令成功,则到服务器的连接是 TLS 加密的。
32.2. 使用 microsoft.sql.server
Ansible 系统角色,使用 IdM 发布的 TLS 证书安装和配置 SQL Server
如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。如果 SQL Server 主机是 Red Hat Enterprise Linux Identity Management (IdM)域中的成员,certmonger
服务可以管理证书请求和将来的续订。
通过使用 microsoft.sql.server
Ansible 系统角色,您可以自动化此过程。您可以使用 TLS 加密远程安装和配置 SQL Server,microsoft.sql.server
角色使用 certificate
Ansible 系统角色来配置 certmonger
,并从 IdM 请求证书。
根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:
- RHEL 7.9: SQL Server 2017 和 2019
- RHEL 8: SQL Server 2017, 2019, 和 2022
- RHEL 9.4 及更新版本:SQL Server 2022
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
您已在控制节点上安装了
ansible-collection-microsoft-sql
软件包或microsoft.sql
集合。 - 受管节点安装了 2 GB 或更多 RAM。
- 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
- 您在 Red Hat Enterprise Linux Identity Management (IdM)域中注册了受管节点。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:sa_pwd: <sa_password>
sa_pwd: <sa_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with certificates issued by Red Hat IdM ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_tls_enable: true mssql_tls_certificates: - name: sql_cert dns: server.example.com ca: ipa
--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with certificates issued by Red Hat IdM ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_tls_enable: true mssql_tls_certificates: - name: sql_cert dns: server.example.com ca: ipa
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
mssql_tls_enable: true
-
启用 TLS 加密。如果启用此设置,您还必须定义
mssql_tls_certificates
。 mssql_tls_certificates
-
包含
certificate
角色设置的 YAML 字典的列表。 name: <file_name>
-
定义证书的基本名称和私钥。
certificate
角色将证书存储在/etc/pki/tls/certs/<file_name>.crt
中,将私钥存储在/etc/pki/tls/private/<file_name>.key
文件中。 dns: <hostname_or_list_of_hostnames>
-
设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(
*
)或以 YAML 列表格式指定多个名称。 ca: <ca_type>
-
定义
certificate
角色如何请求证书。如果主机在 IdM 域或self-sign
中注册了,请将变量设置为ipa
,以请求一个自签名证书。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/microsoft.sql-server/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
在 SQL Server 主机上,使用带有
-N
参数的sqlcmd
工具来建立到 SQL 服务器的加密连接,并运行查询,例如:/opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
$ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
Copy to Clipboard Copied! 如果命令成功,则到服务器的连接是 TLS 加密的。
32.3. 使用 microsoft.sql.server
Ansible 系统角色,使用自定义存储路径安装和配置 SQL Server,
当您使用 microsoft.sql.server
Ansible 系统角色来安装和配置新的 SQL Server 时,您可以自定义数据的路径和模式,以及日志目录。例如,如果要将数据库和日志文件存储在具有多个存储的不同的目录中,请配置自定义路径。
如果您更改了数据或日志路径,并重新运行 playbook,之前使用的目录及其所有内容都保持在原始路径。只有新的数据库和日志保存在新位置。
类型 | 目录 | 模式 | 所有者 | 组 |
---|---|---|---|---|
data |
|
|
| |
Logs |
|
|
| |
[a]
如果目录存在,则角色保留模式。如果目录不存在,角色在创建目录时在受管节点上应用默认 umask 。
|
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
您已在控制节点上安装了
ansible-collection-microsoft-sql
软件包或microsoft.sql
集合。 - 受管节点安装了 2 GB 或更多 RAM。
- 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:sa_pwd: <sa_password>
sa_pwd: <sa_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
编辑一个现有的 playbook 文件,如
~/playbook.yml
,并添加存储和日志相关的变量:--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with custom storage paths ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_datadir: /var/lib/mssql/ mssql_datadir_mode: '0700' mssql_logdir: /var/log/mssql/ mssql_logdir_mode: '0700'
--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with custom storage paths ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_datadir: /var/lib/mssql/ mssql_datadir_mode: '0700' mssql_logdir: /var/log/mssql/ mssql_logdir_mode: '0700'
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
mssql_datadir_mode
andmssql_logdir_mode
- 设置权限模式。在单引号中指定值,以确保角色将值解析为字符串,而不是解析为八进制数。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/microsoft.sql-server/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
显示数据目录的模式:
ansible managed-node-01.example.com -m command -a 'ls -ld /var/lib/mssql/'
$ ansible managed-node-01.example.com -m command -a 'ls -ld /var/lib/mssql/' drwx------. 12 mssql mssql 4096 Jul 3 13:53 /var/lib/mssql/
Copy to Clipboard Copied! 显示日志目录的模式:
ansible managed-node-01.example.com -m command -a 'ls -ld /var/log/mssql/'
$ ansible managed-node-01.example.com -m command -a 'ls -ld /var/log/mssql/' drwx------. 12 mssql mssql 4096 Jul 3 13:53 /var/log/mssql/
Copy to Clipboard Copied!
32.4. 使用 microsoft.sql.server
Ansible 系统角色安装和配置带有 AD 集成的 SQL Server
您可以将 Microsoft SQL Server 集成到活动目录(AD)中,以使 AD 用户能够认证到 SQL Server。通过使用 microsoft.sql.server
Ansible 系统角色,您可以自动化此过程,并相应地远程安装和配置 SQL Server。请注意,在运行 playbook 后,您仍必须在 AD 和 SQL Server 中执行手动步骤。
根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:
- RHEL 7.9: SQL Server 2017 和 2019
- RHEL 8: SQL Server 2017, 2019, 和 2022
- RHEL 9.4 及更新版本:SQL Server 2022
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
您已在控制节点上安装了
ansible-collection-microsoft-sql
软件包或microsoft.sql
集合。 - 受管节点安装了 2 GB 或更多 RAM。
- 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
- 网络中有一个 AD 域。
- AD 中存在一个反向 DNS (RDNS)区域,其包含每个 AD 域控制器(DC)的指针(PTR)资源记录。
- 受管主机的网络设置使用 AD DNS 服务器。
受管主机可以解析以下 DNS 条目:
- AD DC 的主机名和完全限定域名(FQDN)都解析到它们的 IP 地址。
- AD DC 的 IP 地址解析到它们的 FQDN。
流程
将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:sa_pwd: <sa_password> sql_pwd: <SQL_AD_password> ad_admin_pwd: <AD_admin_password>
sa_pwd: <sa_password> sql_pwd: <SQL_AD_password> ad_admin_pwd: <AD_admin_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with AD authentication ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_ad_configure: true mssql_ad_join: true mssql_ad_sql_user: sqluser mssql_ad_sql_password: "{{ sql_pwd }}" ad_integration_realm: ad.example.com ad_integration_user: Administrator ad_integration_password: "{{ ad_admin_pwd }}"
--- - name: Installing and configuring Microsoft SQL Server hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: SQL Server with AD authentication ansible.builtin.include_role: name: microsoft.sql.server vars: mssql_accept_microsoft_odbc_driver_for_sql_server_eula: true mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true mssql_accept_microsoft_sql_server_standard_eula: true mssql_version: 2022 mssql_password: "{{ sa_pwd }}" mssql_edition: Developer mssql_tcp_port: 1433 mssql_manage_firewall: true mssql_ad_configure: true mssql_ad_join: true mssql_ad_sql_user: sqluser mssql_ad_sql_password: "{{ sql_pwd }}" ad_integration_realm: ad.example.com ad_integration_user: Administrator ad_integration_password: "{{ ad_admin_pwd }}"
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括以下内容:
mssql_ad_configure: true
- 启用 AD 的身份验证。
mssql_ad_join: true
-
使用
ad_integration
RHEL 系统角色将受管节点加入到 AD。角色使用ad_integration_realm
、ad_integration_user
和ad_integration_password
变量中的设置来加入域。 mssql_ad_sql_user: <username>
- 设置角色出于管理目的,应该在 AD 和 SQL Server 中创建的 AD 帐户的名称。
ad_integration_user: <AD_user>
-
设置具有特权的 AD 用户的名称,来将机器加入到域中,并创建
mssql_ad_sql_user
中指定的 AD 用户。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/microsoft.sql-server/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! 授权应能够认证到 SQL Server 的 AD 用户。在 SQL Server 上,执行以下步骤:
为
Administrator
用户获取一个 Kerberos 票据:kinit Administrator@ad.example.com
$ kinit Administrator@ad.example.com
Copy to Clipboard Copied! 授权 AD 用户:
/opt/mssql-tools/bin/sqlcmd -S. -Q 'CREATE LOGIN [AD\<AD_user>] FROM WINDOWS;'
$ /opt/mssql-tools/bin/sqlcmd -S. -Q 'CREATE LOGIN [AD\<AD_user>] FROM WINDOWS;'
Copy to Clipboard Copied! 对应该能够访问 SQL Server 的每个 AD 用户重复此步骤。
验证
在运行 SQL Server 的受管节点上:
为 AD 用户获取一个 Kerberos 票据:
kinit <AD_user>@ad.example.com
$ kinit <AD_user>@ad.example.com
Copy to Clipboard Copied! 使用
sqlcmd
工具登录到 SQL Server ,并运行查询,例如:/opt/mssql-tools/bin/sqlcmd -S. -Q 'SELECT SYSTEM_USER'
$ /opt/mssql-tools/bin/sqlcmd -S. -Q 'SELECT SYSTEM_USER'
Copy to Clipboard Copied!