使用 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 8 上准备控制节点。
- 受管节点
- 受管节点是您通过 Ansible 管理的服务器和网络设备。受管节点有时也称为主机。Ansible 不必安装到受管节点上。如需更多信息,请参阅 准备受管节点。
- Ansible playbook
- 在 playbook 中,您可以定义要在受管节点上实现的配置,或受管节点上系统要执行的一组步骤。Playbook 是 Ansible 的配置、部署和编配语言。
- 清单(Inventory)
- 在清单文件中,您可以列出受管节点并指定每个受管节点的信息,如 IP 地址。在清单中,您还可以通过创建和嵌套组来组织受管节点,以便于扩展。清单文件有时也称为 hostfile。
Red Hat Enterprise Linux 8 控制节点上的可用角色和模块
rhel-system-roles 软件包提供的角色:
-
ad_integration:活动目录集成 -
bootloader:GRUB 引导装载程序管理 -
certificate:证书颁发和续订 -
cockpit:Web 控制台安装和配置 -
crypto_policies: 系统范围的加密策略 -
fapolicy: 文件访问策略守护进程配置 -
firewall: Firewalld 管理 -
ha_cluster: HA 集群管理 -
journald: Systemd journald 管理 -
kdump: 内核转储管理 -
kernel_settings: 内核设置管理 -
logging:配置日志记录 -
metrics:性能监控和指标 -
nbde_client: 网络绑定磁盘加密客户端 -
nbde_server: 网络绑定磁盘加密服务器 -
network:网络配置 -
podman: Podman 容器管理 -
postfix:Postfix 配置 -
postgresql: PostgreSQL 配置 -
rhc:订阅 RHEL 和配置 Insights 客户端 -
selinux: SELinux 管理 -
ssh:SSH 客户端配置 -
sshd:SSH 服务器配置 -
storage:存储管理 -
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 8 上准备一个控制节点 复制链接链接已复制到粘贴板!
在使用 RHEL 系统角色之前,您必须配置一个控制节点。然后,此系统根据 playbook 从清单中配置受管主机。
先决条件
RHEL 8.6 或更高版本已安装。有关安装 RHEL 的更多信息,请参阅 从安装介质交互安装 RHEL。
注意在 RHEL 8.5 及更早版本中,Ansible 软件包通过 Ansible Engine 提供,而不是通过 Ansible Core ,并具有不同的支持级别。不要使用 Ansible Engine,因为软件包可能与 RHEL 8.6 及之后版本中的 Ansible 自动化内容不兼容。如需更多信息,请参阅 RHEL 9 和 RHEL 8.6 以及后期的 AppStream 存储库中包含的 Ansible Core 软件包的支持范围。
- 该系统已注册到客户门户网站。
-
Red Hat Enterprise Linux Server订阅被附加到系统上。 -
可选:
Ansible Automation Platform订阅被附加到系统上。
步骤
创建一个名为
ansible的用户,来管理并运行 playbook:[root@control-node]# useradd ansible切换到新创建的
ansible用户:[root@control-node]# su - ansible以这个用户身份执行其余步骤。
创建一个 SSH 公钥和私钥:
[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> ...为密钥文件使用推荐的默认位置。
- 可选: 要防止 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注意~/.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请注意,控制节点必须能够解析主机名。如果 DNS 服务器无法解析某些主机名,请在主机条目旁边添加
ansible_host参数来指定其 IP 地址。安装 RHEL 系统角色:
在没有 Ansible Automation Platform 的 RHEL 主机上,安装
rhel-system-roles软件包:[root@control-node]# yum install rhel-system-roles此命令在
/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@control-node]$ ansible-galaxy collection install redhat.rhel_system_roles此命令在
~/.ansible/collections/ansible_collections/redhat/rhel_system_roles/目录中安装集合。
-
在
后续步骤
- 准备受管节点。如需更多信息,请参阅 准备一个受管节点。
2.2. 准备受管节点 复制链接链接已复制到粘贴板!
受管节点是在清单中列出的系统,它由控制节点根据 playbook 进行配置。您不必在受管主机上安装 Ansible。
先决条件
- 您已准备好了控制节点。如需更多信息,请参阅 在 RHEL 8 上准备一个控制节点。
您有从控制节点进行 SSH 访问的权限。
重要以
root用户身份进行直接的 SSH 访问是一个安全风险。要降低这个风险,您将在此节点上创建一个本地用户,并在准备受管节点时配置一个sudo策略。然后,控制节点上的 Ansible 可以使用本地用户帐户登录到受管节点,并以不同的用户身份(如root)运行 playbook。
流程
创建一个名为
ansible的用户:[root@managed-node-01]# useradd ansible控制节点稍后使用这个用户建立与这个主机的 SSH 连接。
为
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.当 Ansible 使用
sudo以root用户身份执行任务时,您必须输入此密码。在受管主机上安装
ansible用户的 SSH 公钥:以
ansible用户身份登录到控制节点,并将 SSH 公钥复制到受管节点:[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.当提示时,输入
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当提示时,输入密码:
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.通过在控制节点上远程执行命令来验证 SSH 连接:
[ansible@control-node]$ ssh managed-node-01.example.com whoami ansible
为
ansible用户创建一个sudo配置:使用
visudo命令创建并编辑/etc/sudoers.d/ansible文件:[root@managed-node-01]# visudo /etc/sudoers.d/ansible在普通编辑器中使用
visudo的好处是该工具提供基本的检查,如在安装文件之前解析错误。在
/etc/sudoers.d/ansible文件中配置满足您要求的sudoers策略,例如:要为
ansible用户授予权限,以便在输入ansible用户密码后以此主机上的任何用户和组身份运行所有命令,请使用:ansible ALL=(ALL) ALL要向
ansible用户授予权限,以便在不输入ansible用户密码的情况下以该主机上任何用户和组的身份运行所有命令,请使用:ansible ALL=(ALL) NOPASSWD: ALL
或者,配置匹配您安全要求的更精细的策略。有关
sudoers策略的详情,请查看sudoers (5)手册页。
验证
验证您可以在所有受管节点上执行来自控制节点的命令:
[ansible@control-node]$ ansible all -m ping BECOME password: <password> managed-node-01.example.com | SUCCESS => { ... "ping": "pong" } ...硬编码的所有组会动态包含清单文件中列出的所有主机。
使用 Ansible
command模块,通过在所有受管节点上运行whoami工具来验证特权升级是否正常工作:[ansible@control-node]$ ansible all -m command -a whoami BECOME password: <password> managed-node-01.example.com | CHANGED | rc=0 >> root ...如果命令返回 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
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
查看一个加密的文件
以下命令提示您输入现有的 vault 密码。然后,它显示已加密的文件的敏感内容。
# ansible-vault view vault.yml
Vault password: <vault_password>
my_secret: "yJJvPqhsiusmmPPZdnjndkdnYNDjdj782meUZcw"
编辑一个加密的文件
以下命令提示您输入现有的 vault 密码。然后,它使用默认编辑器打开已加密的文件,以便您更新敏感变量。
# ansible-vault edit vault.yml
Vault password: <vault_password>
加密一个现有文件
以下命令提示您输入新的 vault 密码。然后,它会加密一个现有的未加密的文件。
# ansible-vault encrypt vault.yml
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
Encryption successful
解密一个现有文件
以下命令提示您输入现有的 vault 密码。然后,它解密一个现有的加密文件。
# ansible-vault decrypt vault.yml
Vault password: <vault_password>
Decryption successful
更改加密文件的密码
以下命令提示您输入原始 vault 密码,然后提示输入新的 vault 密码。
# 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 }}"
您在 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:usr: administrator pwd: <password>- 保存更改,并关闭编辑器。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"示例 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角色不会使用timesyncRHEL 系统角色在受管节点上配置时间同步。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ad_integration/README.md文件。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
检查 AD 用户(如
administrator)是否在受管节点上本地可用:$ 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
第 5 章 使用 RHEL 系统角色配置 GRUB 引导装载程序 复制链接链接已复制到粘贴板!
通过使用 bootloader RHEL 系统角色,您可以自动化与 GRUB 引导装载程序相关的配置和管理任务。
此角色目前支持配置在以下 CPU 构架上运行的 GRUB 引导装载程序:
- 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
检查您指定的引导装载程序条目是否有更新的内核命令行参数:
# 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" ...
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.bootloader/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上运行前面的 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)" } ] ...命令行输出显示以下有关引导条目的显著的配置信息:
args- 在引导过程中,命令行参数被 GRUB2 引导装载程序传递给内核。它们配置内核的各种设置和行为、initramfs 和其他引导时组件。
id- 分配给引导装载程序菜单中每个引导条目的唯一标识符。它由机器 ID 和内核版本组成。
root- 要挂载的内核的根文件系统,并在启动过程中用作主文件系统。
第 6 章 从 CA 请求证书,并使用 RHEL 系统角色创建自签名证书 复制链接链接已复制到粘贴板!
许多服务,如 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 证书,并在此主机上运行的服务中使用它们。通过使用 certificate 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示例 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_tSELinux 上下文。您可以使用selinuxRHEL 系统角色管理 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
列出
certmonger服务管理的证书:# 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
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示例 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_tSELinux 上下文。您可以使用selinuxRHEL 系统角色管理 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
列出
certmonger服务管理的证书:# 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
第 7 章 使用 RHEL 系统角色安装和配置 web 控制台 复制链接链接已复制到粘贴板!
使用 cockpit RHEL 系统角色,您可以在多个 RHEL 系统上自动部署和启用 Web 控制台。
7.1. 使用 cockpit RHEL 系统角色安装 Web 控制台 复制链接链接已复制到粘贴板!
您可以使用 cockpit 系统角色在多个系统上自动安装和启用 RHEL web 控制台。
在本例中,您使用 cockpit 系统角色来:
- 安装 RHEL web 控制台。
-
允许
firewalld和selinux系统角色配置系统来打开新端口。 -
将 web 控制台设置为使用
ipatrusted 证书颁发机构的证书,而不使用自签名证书。
您不必在 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示例 playbook 中指定的设置包括如下:
cockpit_manage_selinux: true-
允许使用
selinux系统角色配置 SELinux,以对websm_port_tSELinux 类型设置正确的端口权限。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 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示例 playbook 中指定的设置包括如下:
crypto_policies_policy: FUTURE-
在受管节点上配置所需的加密策略(
FUTURE)。它可以是基本策略,也可以是带有一些子策略的基本策略。指定的基本策略和子策略必须在受管节点上可用。默认值为null。这意味着配置没有改变,crypto_policiesRHEL 系统角色将只收集 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
因为 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示例 playbook 中指定的设置包括如下:
crypto_policies_active-
导出的 Ansible 事实包含当前活动的
crypto_policies_policy变量可接受的格式的策略名称。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/verify_playbook.yml运行 playbook:
$ ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }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>示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
以用户身份执行不在允许列表中的二进制应用程序:
$ 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
第 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上运行这个命令,来远程检查受管节点上的所有防火墙配置是否被重置为其默认值:
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
您可以使用 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上,运行以下命令来远程检查受管节点上的转发端口:
# 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=
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上,运行以下命令来远程检查有关受管节点上
dmz区域的信息:# 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:
第 11 章 使用 RHEL 系统角色配置高可用性集群 复制链接链接已复制到粘贴板!
通过 ha_cluster 系统角色,您可以配置和管理使用 Pacemaker 高可用性集群资源管理器的高可用性集群。
11.1. ha_cluster RHEL 系统角色的变量 复制链接链接已复制到粘贴板!
在 ha_cluster RHEL 系统角色 playbook 中,您可以根据集群部署的要求为高可用性集群定义变量。
您可以为 ha_cluster RHEL 系统角色设置的变量如下:
ha_cluster_enable_repos-
一个布尔值标志,其启用包含
ha_clusterRHEL 系统角色所需的软件包的存储库。当此变量被设置为true时(默认值),您必须在将用作集群成员的系统上有活动的涵盖 RHEL 和 RHEL High Availability Add-On 的订阅,否则系统角色将失败。 ha_cluster_enable_repos_resilient_storage-
(RHEL 8.10 及更高版本)一个布尔值标志,其启用包含弹性存储软件包(如
dlm或gfs2)的存储库。要使此选项生效,ha_cluster_enable_repos必须设置为true。此变量的默认值为false。 ha_cluster_manage_firewall(RHEL 8.8 及更高版本)一个布尔值标志,其决定
ha_clusterRHEL 系统角色是否可以管理防火墙。当ha_cluster_manage_firewall设为true时,防火墙高可用性服务和fence-virt端口被启用。当ha_cluster_manage_firewall被设置为false时,ha_clusterRHEL 系统角色不管理防火墙。如果您的系统正在运行firewalld服务,则必须在 playbook 中将该参数设置为true。您可以使用
ha_cluster_manage_firewall参数来添加端口,但您无法使用该参数删除端口。要删除端口,请直接使用firewall系统角色。在 RHEL 8.8 及更高版本中,防火墙不再被默认配置,因为它仅在
ha_cluster_manage_firewall被设置为true时才被配置。ha_cluster_manage_selinux(RHEL 8.8 及更高版本)一个布尔值标志,其决定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理属于防火墙高可用性服务的端口。当ha_cluster_manage_selinux设为true时,属于防火墙高可用性服务的端口与 SELinux 端口类型cluster_port_t相关联。当ha_cluster_manage_selinux被设置为false时,ha_clusterRHEL 系统角色不管理 SELinux。如果您的系统正在运行
selinux服务,则必须在 playbook 中将此参数设置为true。防火墙配置是管理 SELinux 的先决条件。如果没有安装防火墙,则管理 SELinux 策略会被跳过。您可以使用
ha_cluster_manage_selinux参数添加策略,但您无法使用该参数删除策略。要删除策略,请直接使用selinuxRHEL 系统角色。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_clusterha_cluster_start_on_boot-
确定是否将集群服务配置为在引导时启动的布尔值标志。此变量的默认值为
true。 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 8.9 及更高版本)为仲裁设备指定
hacluster用户的密码的字符串值。只有在ha_cluster_quorum参数被配置为使用类型为net的仲裁设备,且仲裁设备上hacluster用户的密码与ha_cluster_hacluster_password参数指定的hacluster用户的密码不同时,才需要此参数。hacluster用户对集群具有完全访问权限。为保护敏感数据,vault 会加密密码,如使用 Ansible Vault 加密内容 中所述。此密码没有默认值。 ha_cluster_corosync_key_srcCorosync
authkey文件的路径,它是 Corosync 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的authkey值。密钥应为 256 字节的随机数据。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。
如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys。此变量的默认值为 null。
ha_cluster_pacemaker_key_srcPacemaker
authkey文件的路径,它是 Pacemaker 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的authkey值。密钥应为 256 字节的随机数据。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。
如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys。此变量的默认值为 null。
ha_cluster_fence_virt_key_srcfence-virt或fence-xvm预共享密钥文件的路径,它是fence-virt或fence-xvm隔离代理验证密钥的位置。如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。如果
ha_clusterRHEL 系统角色以这种方式生成一个新密钥,那么您应该将密钥复制到节点的 hypervisor 中,以确保隔离正常工作。如果设置了此变量,则忽略这个密钥的
ha_cluster_regenerate_keys。此变量的默认值为 null。
ha_cluster_pcsd_public_key_srcr,ha_cluster_pcsd_private_key_srcpcsdTLS 证书和私钥的路径。如果没有指定,则使用节点上已存在的证书密钥对。如果没有证书密钥对,则会生成一个随机的新密钥对。如果为此变量指定了私钥值,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。
如果设置了这些变量,则将忽略此证书密钥对的
ha_cluster_regenerate_keys。这些变量的默认值为 null。
ha_cluster_pcsd_certificates(RHEL 8.8 及更高版本)使用
certificateRHEL 系统角色创建一个pcsd私钥和证书。如果您的系统没有使用
pcsd私钥和证书配置,则您可以使用以下两种方式之一创建它们:-
设置
ha_cluster_pcsd_certificates变量。当您设置ha_cluster_pcsd_certificates变量时,certificateRHEL 系统角色在内部使用,它会按照定义为pcsd创建私钥和证书。 -
不要设置
ha_cluster_pcsd_public_key_src、ha_cluster_pcsd_private_key_src或ha_cluster_pcsd_certificates变量。如果没有设置这些变量,ha_clusterRHEL 系统角色将通过pcsd自身创建pcsd证书。ha_cluster_pcsd_certificates的值被设置为certificateRHEL 系统角色中指定的变量certificate_requests的值。有关certificateRHEL 系统角色的更多信息,请参阅 使用 RHEL 系统角色请求证书。
-
设置
以下操作注意事项适用于
ha_cluster_pcsd_certificate变量的使用:-
除非您使用 IPA ,并将系统加入 IPA 域,否则
certificateRHEL 系统角色会创建自签名证书。在这种情况下,您必须在 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_clusterRHEL 系统角色 playbook 的示例,请参阅 为高可用性集群创建 pcsd TLS 证书和密钥文件。ha_cluster_regenerate_keys-
布尔值标志,当设为
true时,决定将重新生成预共享密钥和 TLS 证书。有关重新生成密钥和证书的更多信息,请参阅ha_cluster_corosync_key_src、ha_cluster_pacemaker_key_srcha_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 - writeha_cluster_cluster_name-
集群的名称。这是一个字符串值,默认值为
my-cluster。 ha_cluster_transport(RHEL 8.7 及更高版本) 设置集群传输方法。您使用这个变量配置的项目如下:
-
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) man page 的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_clusterRHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。ha_cluster_totem(RHEL 8.7 及更高版本) 配置 Corosync totem。有关允许的选项列表,请查看
pcs -h cluster setup帮助页或pcs(8) man page 的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有关配置 Corosync totem 的
ha_clusterRHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。ha_cluster_quorum(RHEL 8.7 及更高版本) 配置集群仲裁。您可以为集群仲裁配置以下项目:
-
options(可选)- 配置仲裁的名称-值字典的列表。允许的选项有:auto_tie_breaker、last_man_standing、last_man_standing_window和wait_for_all。有关仲裁选项的详情,请查看votequorum(5)手册页。 device(可选)- (RHEL 8.8 及更新的版本)将集群配置为使用仲裁设备。默认情况下,不使用仲裁设备。-
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_clusterRHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。有关配置使用仲裁设备的集群的ha_clusterRHEL 系统角色 playbook 的示例,请参阅 配置使用仲裁设备的高可用性集群。ha_cluster_sbd_enabled(RHEL 8.7 和更高版本) 一个布尔值标记,它决定集群是否可以使用 SBD 节点隔离机制。此变量的默认值为
false。有关启用 SBD 的
ha_cluster系统角色 playbook 的示例,请参阅 配置带有 SBD 节点隔离的高可用性集群。ha_cluster_sbd_options(RHEL 8.7 及更高版本) 指定 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
-
有关配置 SBD 选项的
ha_cluster系统角色 playbook 的示例,请参阅 配置带有 SBD 节点隔离的高可用性集群。使用 SBD 时,您可以选择性地为清单中的每个节点配置 watchdog 和 SBD 设备。有关在清单文件中配置 watchdog 和 SBD 设备的详情,请参考 为 ha_cluster 系统角色指定清单。
ha_cluster_cluster_propertiesPacemaker 集群范围配置的集群属性集列表。仅支持一组集群属性。
一组集群属性的结构如下:
ha_cluster_cluster_properties: - attrs: - name: property1_name value: property1_value - name: property2_name value: property2_value默认情况下,不设置任何属性。
以下示例 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_clusterha_cluster_node_options(RHEL 8. 10 及更高版本)此变量定义因集群节点而异的设置。它为指定的节点设置选项,但不指定哪些节点组成了集群。您可以在清单或 playbook 中使用
hosts参数指定哪些节点组成了集群。您使用这个变量配置的项目如下:
-
node_name(必需)- 为其定义 Pacemaker 节点属性的节点的名称。它必须匹配为节点定义的名称。 -
attributes(可选)- 节点的 Pacemaker 节点属性集合的列表。目前,只支持一个集合。使用第一个集合,其余的忽略。
-
ha_cluster_node_options变量的结构如下:ha_cluster_node_options: - node_name: node1 attributes: - attrs: - name: attribute1 value: value1_node1 - name: attribute2 value: value2_node1 - node_name: node2 attributes: - attrs: - name: attribute1 value: value1_node2 - name: attribute2 value: value2_node2默认情况下,没有定义节点选项。
有关包含节点选项配置的
ha_clusterRHEL 系统角色 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 8.9 及更新版本)资源代理通常为资源操作定义默认设置,如interval和timeout,为特定代理进行了优化。如果此变量被设为true,则这些设置将被复制到资源配置中。否则,集群范围的默认值应用到资源。如果您使用ha_cluster_resource_operation_defaults角色变量为资源定义资源操作默认值,则您可以将其设置为false。此变量的默认值为true。 operations(可选) - 资源操作列表。-
action(必需)- pacemaker 以及资源或隔离代理定义的操作措施。 -
attrs(必需)- 操作选项,必须至少指定一个选项。
-
-
使用
ha_clusterRHEL 系统角色配置的资源定义的结构如下:- 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默认情况下不定义任何资源。
有关包含资源配置的
ha_clusterRHEL 系统角色 playbook 的示例,请参阅 配置带有隔离和资源的高可用性集群。ha_cluster_resource_groups此变量定义由系统角色配置的 pacemaker 资源组。您可以为每个资源组配置以下项目:
-
id(必需)- 组的 ID. -
resources(必需) - 组的资源列表.每个资源通过其 ID 引用,资源必须在ha_cluster_resource_primitives变量中定义。必须至少列出一个资源。 -
meta_attrs(可选) - 组的元属性集合列表。目前,只支持一个集合。
-
使用
ha_clusterRHEL 系统角色配置的资源组定义的结构如下: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_clusterRHEL 系统角色 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_clusterRHEL 系统角色配置的资源克隆定义的结构如下: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_clusterRHEL 系统角色 playbook 的示例,请参阅 配置隔离和资源的高可用性集群。ha_cluster_resource_defaults(RHEL 8.9 及更新版本)此变量定义资源默认值集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源。您使用
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_clusterRHEL 系统角色 playbook 的示例,请参阅 配置带有资源和资源操作默认值的高可用性集群。ha_cluster_resource_operation_defaults(RHEL 8.9 及更新版本)此变量定义资源操作默认值的集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源和特定的资源操作。使用
ha_cluster_resource_operation_defaults变量指定的默认值不应用到使用它们自己定义的值覆盖它们的资源操作。默认情况下,ha_clusterRHEL 系统角色配置资源,来为资源操作定义自己的值。有关使用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 8.10 及更高版本)此变量定义 STONITH 级别,也称为隔离拓扑。隔离级别将集群配置为使用多个设备来隔离节点。如果一个设备失败,您可以定义替代设备,并且可以要求多个设备全部成功执行才能认为节点被成功隔离。有关隔离级别的更多信息,请参阅 配置和管理高可用性集群 中的 配置隔离级别。
您可以在定义隔离级别时配置以下条目:
-
level(必需)- 尝试隔离级别的顺序。Pacemaker 按照升序尝试级别,直到有一个成功为止。 -
target(可选)- 此级别应用到的节点的名称。 您必须指定以下三个选择之一:
-
target_pattern- 与此级别应用到的节点名称匹配的POSIX 扩展正则表达式。 -
target_attribute- 为此级别应用到的节点设置的节点属性的名称。 -
target_attribute和target_value- 为此级别应用到的节点设置的节点属性的名称和值。
-
resouce_ids(必需)- 必须为此级别尝试的所有隔离资源的列表。默认情况下,没有定义隔离级别。
-
使用
ha_clusterRHEL 系统角色配置的隔离级别定义的结构如下: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_clusterRHEL 系统角色 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您为资源位置约束配置的项目,用于指定资源模式是为资源位置约束配置的相同项目,用于指定资源 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您可以为指定资源 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为资源位置约束配置的项目,用于指定资源模式,规则是用于资源位置约束的相同项目,用于指定资源 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_clusterRHEL 系统角色 playbook 的示例,请参阅 配置带有资源约束的高可用性集群。ha_cluster_constraints_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您可以为资源集托管约束配置以下项目:
resource_sets(必需)- 资源集合列表。-
resource_ids(必需)- 资源列表。 -
options(可选)- “名称/值”字典列表精细调整集合中资源如何被约束处理。
-
-
id(可选)- 与简单的托管约束同样的值。 -
options(可选)- 与简单的托管约束同样的值。
资源集托管约束的结构如下:
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_clusterRHEL 系统角色 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您可以为资源集顺序约束配置以下项目:
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_clusterRHEL 系统角色 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您可以为资源集票据约束配置以下项目:
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_clusterRHEL 系统角色 playbook 的示例,请参阅 配置带有资源约束的高可用性集群。ha_cluster_qnetd(RHEL 8.8 及更高版本)此变量配置
qnetd主机,然后其可以作为集群的外部仲裁设备。您可以为
qnetd主机配置以下项目:-
present(可选)- 如果为true,则在主机上配置qnetd实例。如果为false,请从主机中删除qnetd配置。默认值为false。如果将其设置为true,则必须将ha_cluster_cluster_present设置为false。 -
start_on_boot(可选)- 配置qnetd实例是否应在引导时自动启动。默认值为true。 -
regenerate_keys(可选)- 将此变量设置为true以重新生成qnetdTLS 证书。如果重新生成了证书,则必须重新运行角色,以便每个集群再次连接到qnetd主机,或者手动运行pcs。
-
您无法在集群节点上运行
qnetd,因为隔离会破坏qnetd操作。有关配置使用仲裁设备的集群的
ha_clusterRHEL 系统角色 playbook 的示例,请参阅 配置使用仲裁设备的集群。
11.2. 为 ha_cluster RHEL 系统角色指定一个清单 复制链接链接已复制到粘贴板!
使用 ha_cluster RHEL 系统角色 playbook 配置 HA 集群时,您可以在清单中为集群配置节点的名称和地址。
11.2.1. 在清单中配置节点名称和地址 复制链接链接已复制到粘贴板!
对于清单中的每个节点,您可以选择指定以下项目:
-
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
11.2.2. 在清单中配置 watchdog 和 SBD 设备 复制链接链接已复制到粘贴板!
(RHEL 8.7 及更高版本)使用 SBD 时,您可以有选择地为清单中的每个节点配置 watchdog 和 SBD 设备。虽然所有 SBD 设备都必须与所有节点共享并可从所有节点访问,但每个节点可以为设备使用不同的名称。每个节点的 watchdog 设备也可以不同。有关您可以在系统角色 playbook 中设置的 SBD 变量的详情,请查看 ha_cluster RHEL 系统角色变量 中的 ha_cluster_sbd_enabled 和 ha_cluster_sbd_options 条目。
对于清单中的每个节点,您可以选择指定以下项目:
-
sbd_watchdog_modules(可选)- (RHEL 8.9 及更新版本)要载入的 Watchdog 内核模块,其创建/dev/watchdog*设备。如果没有设置,则默认为空列表。 -
sbd_watchdog_modules_blocklist(可选)- (RHEL 8.9 及更新版本)要卸载和阻止的 Watchdog 内核模块。如果没有设置,则默认为空列表。 -
sbd_watchdog- SBD 使用的 Watchdog 设备。如果没有设置,则默认为/dev/watchdog。 -
sbd_devices- 用于交换 SBD 信息和监控的设备。如果没有设置,则默认为空列表。始终引用使用长而稳定的设备名称(/dev/disk/by-id/)的设备。
以下示例显示了为目标 node1 和 node2 配置 watchdog 和 SBD 设备的清单。
all:
hosts:
node1:
ha_cluster:
sbd_watchdog_modules:
- module1
- module2
sbd_watchdog: /dev/watchdog2
sbd_devices:
- /dev/disk/by-id/000001
- /dev/disk/by-id/000001
- /dev/disk/by-id/000003
node2:
ha_cluster:
sbd_watchdog_modules:
- module1
sbd_watchdog_modules_blocklist:
- module2
sbd_watchdog: /dev/watchdog1
sbd_devices:
- /dev/disk/by-id/000001
- /dev/disk/by-id/000002
- /dev/disk/by-id/000003
有关创建使用 SBD 隔离的高可用性集群的流程示例,请参阅 配置带有 SBD 节点隔离的高可用性集群。
11.3. 为高可用性集群创建 pcsd TLS 证书和密钥文件 复制链接链接已复制到粘贴板!
(RHEL 8.8 及更高版本)集群节点之间的连接是使用传输层安全(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 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.4. 配置不运行任何资源的高可用性集群 复制链接链接已复制到粘贴板!
您可以使用 ha_cluster 系统角色,以简单、自动的方式配置基本集群。创建基本集群后,您可以使用 pcs 命令行界面逐个资源地配置其他集群组件和行为。以下示例流程配置基本的双节点集群,但没有使用最低所需参数配置隔离。
ha_cluster 系统角色替换指定节点上任何现有的群集配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster 系统角色指定清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.5. 配置带有隔离和资源的高可用性集群 复制链接链接已复制到粘贴板!
集群配置的特定组件取决于您的各个需求,这因站点而异。以下示例流程显示了使用 ha_cluster RHEL 系统角色配置不同集群组件的格式。配置的群集包括隔离设备、集群资源、资源组和克隆的资源。
ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_resource_primitives: <cluster_resources>- 由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
ha_cluster_resource_groups: <resource_groups>-
由
ha_clusterRHEL 系统角色配置的资源组定义的列表。 ha_cluster_resource_clones: <resource_clones>-
ha_clusterRHEL 系统角色配置的资源克隆定义的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.6. 配置具有资源和资源操作默认值的高可用性集群 复制链接链接已复制到粘贴板!
(RHEL 8.9 及更高版本)在集群配置中,您可以更改所有资源的资源选项的 Pacemaker 默认值。您还可以更改集群中所有资源操作的默认值。
有关更改资源选项的默认值的详情,请参考 更改资源选项的默认值。有关全局资源操作默认值的详情,请参考 配置全局资源操作默认设置。
以下示例流程使用 ha_cluster RHEL 系统角色创建定义资源和资源操作默认值的高可用性集群。
ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.7. 配置带有隔离级别的高可用性集群 复制链接链接已复制到粘贴板!
(RHEL 8.10 及更高版本)当您为节点配置多个隔离设备时,您需要为这些设备定义隔离级别,以决定 Pacemaker 将使用设备尝试隔离节点的顺序。有关隔离级别的详情,请参考 配置隔离级别。
以下流程示例使用 ha_cluster RHEL 系统角色创建定义隔离级别的高可用性集群。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password> fence1_password: <fence1_password> fence2_password: <fence2_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.8. 使用资源限制配置高可用性集群 复制链接链接已复制到粘贴板!
在配置集群时,您可以指定集群资源的行为,以符合您应用程序的要求。您可以通过配置资源约束来控制集群资源的行为。
您可以定义以下类别的资源约束:
- 位置约束,其决定资源可在哪些节点上运行。有关位置约束的详情,请参阅 确定资源可在哪些节点上运行。
- 排序约束,其决定资源运行的顺序。有关排序约束的详情,请参考 确定集群资源运行的顺序。
- 托管约束,指定一个资源的位置取决于另一个资源的位置。有关托管约束的详情,请参考 托管集群资源。
- 票据约束,其指示依赖于特定 Booth 票据的资源。有关 Booth 票据约束的详情,请参考 多站点 Pacemaker 集群。
以下流程示例使用 ha_cluster RHEL 系统角色创建高可用性集群,其中包含资源位置约束、资源托管约束、资源顺序约束和资源票据约束。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.9. 在高可用性集群中配置 Corosync 值 复制链接链接已复制到粘贴板!
(RHEL 8.7 及更高版本) 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 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
11.10. 使用 SBD 节点隔离配置高可用性集群 复制链接链接已复制到粘贴板!
(RHEL 8.7 及更高版本)以下流程使用 ha_cluster RHEL 系统角色创建一个使用 SBD 节点隔离的高可用性集群。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
此 playbook 使用一个加载 watchdog 模块的清单文件(在 RHEL 8.9 及更新版本中支持),如 在清单中配置 watchdog 和 SBD 设备 中所述。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:--- - name: Create a high availability cluster that uses SBD node fencing hosts: node1 node2 roles: - rhel-system-roles.ha_cluster vars: ha_cluster_cluster_name: my-new-cluster ha_cluster_hacluster_password: <password> ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_sbd_enabled: yes ha_cluster_sbd_options: - name: delay-start value: 'no' - name: startmode value: always - name: timeout-action value: 'flush,reboot' - name: watchdog-timeout value: 30 # Suggested optimal values for 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 - name: devices value: "{{ ha_cluster.sbd_devices | join(',') }}" - name: pcmk_delay_base value: 30这个 playbook 示例文件配置一个运行
firewalld和selinux服务的集群,其使用 SBD 隔离并创建 SBD Stonith 资源。为生产环境创建 playbook 文件时,vault 会加密密码,如在 使用 Ansible Vault 加密内容 中所述。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
11.11. 使用仲裁设备配置高可用性集群 复制链接链接已复制到粘贴板!
(RHEL 8.8 及更高版本),当配置单独的仲裁设备时,集群可以承受比标准仲裁规则允许的多的节点故障。仲裁设备充当集群的轻量级仲裁设备。对于偶数节点的集群,建议使用仲裁设备。对于双节点集群,使用仲裁设备可以更好地决定在脑裂情况下保留哪些节点。
有关仲裁设备的详情,请参考 配置仲裁设备。
要使用 ha_cluster RHEL 系统角色配置带有单独仲裁设备的高可用性集群,请首先请设置仲裁设备。设置仲裁设备后,您可以在任意数量的集群中使用该设备。
11.11.1. 配置仲裁设备 复制链接链接已复制到粘贴板!
要使用 ha_cluster RHEL 系统角色配置仲裁设备,请按照此流程示例中的步骤操作。请注意,您不能在集群节点上运行仲裁设备。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 您要用来运行仲裁设备的系统有涵盖 RHEL 和 RHEL High Availability 附加组件的有效订阅。
- 清单文件指定仲裁设备,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_present: false-
如果设为
false,则变量决定所有集群配置将从目标主机中删除。 ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_qnetd: <quorum_device_options>-
配置
qnetd主机的变量。
验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-qdevice.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook-qdevice.yml
11.11.2. 配置一个集群以使用仲裁设备 复制链接链接已复制到粘贴板!
要将集群配置为使用仲裁设备,请按照此流程示例中的步骤操作。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
- 您已配置了一个仲裁设备。
流程
创建包含以下内容的 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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 ha_cluster_quorum: <quorum_parameters>- 配置集群仲裁的变量,您可以用来指定集群使用仲裁设备。
验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-cluster-qdevice.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook-cluster-qdevice.yml
11.12. 配置带有节点属性的高可用性集群 复制链接链接已复制到粘贴板!
(RHEL 8.10 及更高版本),您可以使用 Pacemaker 规则使您的配置更加动态。例如,您可以使用 node 属性,根据时间将机器分配给不同的处理组,然后在创建位置约束时使用该属性。
节点属性表达式用于根据节点或节点定义的属性控制资源。有关节点属性的详情,请参考 使用规则确定资源位置。
以下流程示例使用 ha_cluster RHEL 系统角色创建配置节点属性的高可用性集群。
ha_cluster RHEL 系统角色替换指定节点上任何现有集群配置。playbook 中未指定的任何设置都将丢失。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。
- 清单文件指定集群节点,如 为 ha_cluster RHEL 系统角色指定一个清单 中所述。有关创建清单文件的常规信息,请参阅 在 RHEL 8 上准备一个控制节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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: value2Bha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml其他资源
11.13. 使用 ha_cluster RHEL 系统角色在高可用性集群中配置 Apache HTTP 服务器 复制链接链接已复制到粘贴板!
高可用性型机器通过消除单点失效以及在一个节点停止运作时将服务从一个群集节点切换到另外一个节点来提供高可用性服务。红帽提供了各种用于规划、配置和维护红帽高可用性集群的文档。有关向红帽集群文档的不同区域提供索引的文章的列表,请参阅 Red Hat High Availability Add-On 文档指南。
以下用例示例使用 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 8 上准备一个控制节点。
- 您已配置了具有 XFS 文件系统的 LVM 逻辑卷,如在 在 Pacemaker 集群中配置具有 XFS 文件系统的 LVM 卷 中所述。
- 您已配置了 Apache HTTP 服务器,如 配置 Apache HTTP 服务器 中所述。
- 您的系统包含一个用于隔离群集节点的 APC 电源开关。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:cluster_password: <cluster_password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
ha_cluster_cluster_name: <cluster_name>- 您要创建的集群的名称。
ha_cluster_hacluster_password: <password>-
hacluster用户的密码。hacluster用户对集群具有完全访问权限。 ha_cluster_manage_firewall: true-
确定
ha_clusterRHEL 系统角色是否管理防火墙的变量。 ha_cluster_manage_selinux: true-
确定
ha_clusterRHEL 系统角色是否使用selinuxRHEL 系统角色管理防火墙高可用性服务的端口的变量。 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_clusterRHEL 系统角色配置的资源组定义的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml当您使用
apache资源代理来管理 Apache 时,它不会使用systemd。因此,您必须编辑 Apache 提供的logrotate脚本,使其不使用systemctl重新加载 Apache。在集群中的每个节点上删除
/etc/logrotate.d/httpd文件中的以下行:# /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true对于 RHEL 8.6 及之后的版本,将您删除的行替换为以下三行,将
/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对于 RHEL 8.5 及更早版本,将您删除的行替换为以下三行:
/usr/bin/test -f /run/httpd.pid >/dev/null 2>/dev/null && /usr/bin/ps -q $(/usr/bin/cat /run/httpd.pid) >/dev/null 2>/dev/null && /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true
验证
从集群中的一个节点检查集群的状态。请注意,所有四个资源都运行在同一个节点上,
z1.example.com。如果发现配置的资源没有运行,则您可以运行
pcs resource debug-start resource命令来测试资源配置。[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集群启动并运行后,您可以将浏览器指向定义为
IPaddr2资源的 IP 地址,来查看示例显示,包含简单的单词"Hello"。Hello要测试运行在
z1.example.com上的资源组是否可以切换到节点z2.example.com,请将节点z1.example.com置于待机模式,之后该节点将不能再托管资源。[root@z1 ~]# pcs node standby z1.example.com将节点
z1置于待机模式后,从集群中的某个节点检查集群状态。请注意,资源现在都应运行在z2上。[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定义的 IP 地址的网页仍会显示,而不中断。
要从
待机模式中删除z1,请输入以下命令。[root@z1 ~]# pcs node unstandby z1.example.com注意从
待机模式中删除节点本身不会导致资源切换到该节点。这将依赖于资源的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>示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 13 章 使用 RHEL 系统角色配置自动崩溃转储 复制链接链接已复制到粘贴板!
要使用 Ansible 管理 kdump,您可以使用 kdump 角色,这是 RHEL 8 中可用的 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证内核崩溃转储参数:
$ ansible managed-node-01.example.com -m command -a 'grep crashkernel /proc/cmdline'
第 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证受影响的内核参数:
# 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'
第 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]示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在受管节点上,测试
/etc/rsyslog.conf文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.在受管节点上,验证系统是否向日志发送包含
error字符串的消息:发送测试信息:
# logger error查看
/var/log/errors.log日志,例如:# cat /var/log/errors.log Aug 5 13:48:31 hostname root[6778]: error其中
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]示例 playbook 的第一个 play 中指定的设置包括以下:
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 的第二个 play 中指定的设置包括以下:
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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在客户端和服务器系统上测试
/etc/rsyslog.conf文件的语法:# 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.验证客户端系统向服务器发送信息:
在客户端系统中发送测试信息:
# logger test在服务器系统上,查看
/var/log/<host2.example.com>/messages日志,例如:# cat /var/log/<host2.example.com>/messages Aug 5 13:48:31 <host2.example.com> root[6778]: test其中
<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 域中注册。
流程
创建一个包含以下内容的 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]示例 playbook 中指定的设置包括如下:
logging_certificates-
此参数的值被传到
certificateRHEL 系统角色中的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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其他资源
-
/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 域中注册。
流程
创建一个包含以下内容的 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]示例 playbook 中指定的设置包括如下:
logging_certificates-
此参数的值被传到
certificateRHEL 系统角色中的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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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]示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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]示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 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示例 playbook 中指定的设置包括如下:
metrics_retention_days: <number>-
设置多少天后
pmlogger_dailysystemd 计时器删除旧的 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询一个指标,例如:
# ansible managed-node-01.example.com -m command -a 'pminfo -f kernel.all.load'
下一步
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:metrics_usr: <username> metrics_pwd: <password>- 保存更改,并关闭编辑器。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 }}"示例 playbook 中指定的设置包括如下:
metrics_retention_days: <number>-
设置多少天后
pmlogger_dailysystemd 计时器删除旧的 PCP 归档。 metrics_manage_firewall: <true|false>-
定义角色是否应该在
firewalld服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为true。 metrics_username: <username>-
角色在受管节点本地创建此用户,将凭证添加到
/etc/pcp/passwd.dbSimple 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
在安装了
pcp软件包的主机上,查询一个需要身份验证的指标:使用您在 playbook 中使用的凭证查询指标:
# 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如果命令成功,它会返回
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
下一步
如果您已在多个主机上配置了 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:grafana_admin_pwd: <password>- 保存更改,并关闭编辑器。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 }}"示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
-
在浏览器中打开
http://<grafana_server_IP_or_hostname>:3000,并以admin用户身份,使用您在流程中设置的密码登录。 显示监控数据:
要显示实时数据:
-
单击左侧导航栏中的
Performance Co-Pilot图标,然后选择PCP Vector Checklist。 -
默认情况下,图形显示运行 Grafana 的主机中的指标。要切换到其他主机,请在
hostspec字段中输入主机名,然后按 Enter 键。
-
单击左侧导航栏中的
-
要显示存储在 Redis 数据库中的历史数据:创建一个带有 PCP Redis 数据源的面板。这要求您在 playbook 中设置
metrics_query_service: true。
第 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此示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。命令必须返回与您为加密和解密传递的相同的消息:
# ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' test
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这个示例 playbook 配置 Clevis 客户端,以便在两个 Tang 服务器中至少有一个可用时自动解锁两个 LUKS 加密的卷。
示例 playbook 中指定的设置包括如下:
state: present-
state的值表示运行 playbook 后的配置。使用present值来创建新绑定或更新现有绑定。与clevis luks bind命令不同,您可以使用state: present来覆盖其设备插槽中的现有绑定。absent的值会删除指定的绑定。 nbde_client_early_boot: truenbde_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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在 NBDE 客户端上,检查应被您的 Tang 服务器自动解锁的加密卷是否在其 LUKS pin 中包含相应的信息:
# 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/>"}'如果不使用
nbde_client_early_boot: false变量,请验证绑定是否可用于早期引导,例如:# 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 …
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创建一个包含以下内容的 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"此 playbook 为
~/static-ip-settings-clients.yml文件中列出的每个主机动态读取某些值。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 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创建一个包含以下内容的 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此 playbook 从清单文件中动态读取每个主机的某些值,并在 playbook 中对所有主机相同的设置使用静态值。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
# 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" ] }, ...
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
# 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" ] }, ...
18.3. 使用 network RHEL 系统角色和接口名称,配置具有动态 IP 地址的以太网连接 复制链接链接已复制到粘贴板!
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。使用此角色,您可以将连接配置文件分配给指定的接口名称。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
# 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" ] }, ...
18.4. 使用 network RHEL 系统角色和设备路径,配置具有动态 IP 地址的以太网连接 复制链接链接已复制到粘贴板!
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。角色可以根据其路径而不是接口名称将连接配置文件分配给设备。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
# 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" ] }, ...
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pwd: <password>- 保存更改,并关闭编辑器。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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
- 访问需要网络身份验证的网络上的资源。
18.6. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
从其中一个网络设备临时拔掉网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如
nmcli),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。
18.7. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证 VLAN 设置:
# 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 ...
18.8. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示作为特定网桥端口的以太网设备的链接状态:
# 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显示作为任意网桥设备的端口的以太网设备状态:
# 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
18.9. 使用 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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
# 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", ... } ...
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: 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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示 IPv4 路由:
# 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显示 IPv6 路由:
# 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
18.11. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在内部工作站子网的 RHEL 主机上:
安装
traceroute软件包:# yum install traceroute使用
traceroute工具显示到互联网上主机的路由:# 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 ...命令的输出显示路由器通过
192.0.2.1,即提供商 B 的网络来发送数据包。
在服务器子网的 RHEL 主机上:
安装
traceroute软件包:# yum install traceroute使用
traceroute工具显示到互联网上主机的路由:# 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 ...命令的输出显示路由器通过
198.51.100.2,即供应商 A 的网络来发送数据包。
在使用 RHEL 系统角色配置的 RHEL 路由器上:
显示规则列表:
# 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默认情况下,RHEL 包含表
local、main和default的规则。显示表
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显示接口和防火墙区:
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0验证
external区是否启用了伪装:# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
18.12. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查询受管节点的 Ansible 事实,并验证卸载设置:
# 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", ... } ...
18.13. 使用 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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示网络设备的当前卸载功能:
# 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 ...
18.14. 使用 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示例 playbook 中指定的设置包括如下:
rx: <value>- 设置接收的环缓冲区条目的最大数。
tx: <value>- 设置传输的环缓冲区条目的最大数。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示最大环缓冲大小:
# 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
18.15. 使用 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示
mlx4_ib0.8002设备的 IP 设置:# 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显示
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显示
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
18.16. 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 |
|
|
例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars 块:
| 带有状态配置的 playbook | 常规 playbook |
|
|
第 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示例 playbook 中指定的设置包括如下:
run_as_user和run_as_group- 指定容器是无根的。
kube_file_content包含一个 Kubernetes YAML 文件,定义名为
db的第一个容器。您可以使用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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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-----您在后续步骤中需要此信息。
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:root_password: <root_password> certificate: |- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- key: |- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----确保
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流程创建一个与 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
第 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pwd: <password>- 保存更改,并关闭编辑器。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示例 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 域套接字的未加密的连接。
- 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
-
来自 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
使用
postgres超级用户连接到 PostgreSQL 服务器,并执行\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)如果输出显示 TLS 协议版本和密码详情,则连接可以正常工作,且 TLS 加密已启用。
如果应用程序需要 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pwd: <password>- 保存更改,并关闭编辑器。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示例 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 域套接字的未加密的连接。
- 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
-
来自 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
使用
postgres超级用户连接到 PostgreSQL 服务器,并执行\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)如果输出显示 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 New Vault password: <password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:activationKey: <activation_key> organizationID: <organizationID> username: <username> password: <password>- 保存更改,并关闭编辑器。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 }}"示例 playbook 中指定的设置包括如下:
rhc_auth: activation_keys-
码
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 }}"
示例 playbook 中指定的设置包括如下:
rhc_auth: login-
码
login指定您要使用用户名和密码进行注册。
验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
22.2. 使用 rhc RHEL 系统角色,使用 Satellite 注册系统 复制链接链接已复制到粘贴板!
当组织使用 Satellite 管理系统时,需要通过 Satellite 注册系统。您可以使用 rhc RHEL 系统角色,使用 Satellite 远程注册您的系统。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:activationKey: <activation_key> organizationID: <organizationID>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
hostname: example.com- 用于系统注册和软件包管理的 Satellite 服务器的完全限定域名(FQDN)。
port: 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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示例 playbook 中指定的设置包括如下:
rhc_insights absent|present- 启用或禁用 Red Hat Insights 的系统注册,以进行主动分析和建议。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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示例 playbook 中指定的设置包括如下:
name: RepositoryName- 应该启用的存储库的名称。
state: enabled|disabled-
可选,启用或禁用存储库。默认为
enabled。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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"示例 playbook 中指定的设置包括如下:
rhc_release: version- 要为系统设置的 RHEL 版本,因此可用内容将仅限于此版本。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
22.6. 在使用 rhc RHEL 系统角色注册主机时使用代理服务器 复制链接链接已复制到粘贴板!
如果您的安全限制只允许通过代理服务器访问互联网,您可以在使用 rhc 注册系统时指定 rhc 角色的代理设置。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:username: <username> password: <password> proxy_username: <proxyusernme> proxy_password: <proxypassword>- 保存更改,并关闭编辑器。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 }}"示例 playbook 中指定的设置包括如下:
hostname: proxy.example.com- 代理服务器的完全限定域名(FQDN)。
port: 3128- 定义用于与代理服务器进行通信的网络端口。
username: proxy_username- 指定用于身份验证的用户名。这只有在代理服务器需要身份验证时才需要。
password: proxy_password- 指定用于身份验证的密码。这只有在代理服务器需要身份验证时才需要。
验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
22.7. 使用 rhc RHEL 系统角色管理 Insights 规则的自动更新 复制链接链接已复制到粘贴板!
您可以使用 rhc RHEL 系统角色启用或禁用 Red Hat Insights 的自动集合规则更新。默认情况下,当您的系统连接到 Red Hat Insights 时,这个选项就启用了。您可以使用 rhc 禁用它。
如果禁用了此功能,您就存在使用过时的规则定义文件,且没有获得最新验证更新的风险。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 您已注册系统。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:username: <username> password: <password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
autoupdate: true|false- 启用或禁用 Red Hat Insights 的自动集合规则更新。
验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
22.9. 使用 rhc RHEL 系统角色配置 Insights 标签 复制链接链接已复制到粘贴板!
您可以使用 rhc RHEL 系统角色为系统过滤和分组配置 Red Hat Insights 标签。您还可以根据要求自定义标签。使用 Red Hat Insights 标签过滤和分组系统,可帮助管理员根据属性,如环境、位置或功能等来有效地管理、监控,并将策略应用到特定的系统集合。这提高了可见性,简化了自动化,并增强了跨大型基础设施的安全合规性。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:username: <username> password: <password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
group: group-name-value- 指定用于组织和管理注册主机的系统组。
location:location-name-value- 定义与已注册的系统关联的位置。
description- 为已注册的系统提供一个简短摘要或标识符。
state: present|absent表示已注册系统的当前状态。
注意tags中的内容是一个 YAML 结构,代表管理员所需的用于已配置的系统的标签。这里给出的示例仅用于说明目的,并不详尽。管理员可以自定义 YAML 结构,来根据需要包含任何其他键和值。
验证 playbook 语法:
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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示例 playbook 中指定的设置包括如下:
rhc_state: absent- 指定应该从注册服务器、RHSM 或 Satellite 中取消注册的系统。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
第 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:ipmi_usr: <username> ipmi_pwd: <password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
name: <bmc_hostname_or_ip_address>- 定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
port: <bmc_port_number>-
设置远程管理控制协议(RMCP)端口号。默认值为
623。 bootdev: <value>设置引导设备。您可以选择以下值之一:
-
hd: 从硬盘引导。 -
network:从网络引导。 -
optical:从光驱(如 DVD-ROM)引导。 -
floppy:从软盘引导。 -
safe:在安全模式下从硬盘驱动器引导。 -
setup:引导到 BIOS 或 UEFI。 -
default:删除任何 IPMI 定向的引导设备请求。
-
persistent: <true|false>-
配置远程主机是否对所有以后的引导都使用定义的设置,或只对下一次引导使用定义的设置。默认情况下,此变量被设置为
false。请注意,并非所有 BMC 都支持永久设置引导设备。
如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.ipmi_boot命令来显示模块的文档。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:ipmi_usr: <username> ipmi_pwd: <password>- 保存更改,并关闭编辑器。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示例 playbook 中指定的设置包括如下:
name: <bmc_hostname_or_ip_address>- 定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
port: <bmc_port_number>-
设置远程管理控制协议(RMCP)端口号。默认值为
623。 state: <value>设置设备应处于的状态。您可以选择以下值之一:
-
on:打开系统的电源。 -
ff:在不通知操作系统的情况下关闭系统。 -
shutdown:从操作系统请求关闭。 -
reset:执行硬重置。 -
boot: 如果系统已关闭,打开系统电源,或如果系统已关闭,重置系统。
-
如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.ipmi_power命令显示模块的文档。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>- 保存更改,并关闭编辑器。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示例 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_command命令来显示模块的文档。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>- 保存更改,并关闭编辑器。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 }}"示例 playbook 中指定的设置包括如下:
baseuri: <uri>- 定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
category: <value>设置要查询的信息的类别。可用的类别如下:
-
Accounts:OOB 控制器的用户帐户 -
Chassis:与机箱相关的设置 -
Manager: Redfish 服务 -
Session:Redfish 登录会话 -
Systems(默认):与机器相关的设置 -
Update:与固件相关的设置 -
All: 来自所有类别的信息。
如果使用列表,您还可以设置多个类别,如
["Systems", "Accounts"]。-
command: <command>- 设置要执行的查询命令。
如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用
ansible-doc redhat.rhel_mgmt.redfish_info命令显示模块的文档。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:redfish_usr: <username> redfish_pwd: <password>- 保存更改,并关闭编辑器。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"示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
第 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/示例 playbook 中指定的设置包括如下:
selinux_restore_dirs: <list>- 定义角色应重置 SELinux 上下文的目录的列表。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.selinux/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示您已重置了上下文的文件或目录的 SELinux 上下文。例如,要显示
/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/
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示分配了
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
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表:
# ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'如果列出了模块,则其已安装且启用了。
第 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
- '::'
呈现为:
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: PermitRootLogin: no PasswordAuthentication: no Match: - Condition: "Address 192.0.2.0/24" PermitRootLogin: yes PasswordAuthentication: yes示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
登录到 SSH 服务器:
$ ssh <username>@<ssh_server>验证 SSH 服务器上
sshd_config文件的内容:$ cat /etc/ssh/sshd_config ... PasswordAuthentication no PermitRootLogin no ... Match Address 192.0.2.0/24 PasswordAuthentication yes PermitRootLogin yes ...检查您是否可以以 root 用户身份从
192.0.2.0/24子网连接到服务器:确定您的 IP 地址:
$ hostname -I 192.0.2.1如果 IP 地址在
192.0.2.1-192.0.2.254范围内,您可以连接到服务器。以
root用户身份连接到服务器:$ ssh root@<ssh_server>
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: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR对于运行 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: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证 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>对于运行 RHEL 9 或更高版本的受管节点:
# cat /etc/ssh/sshd_config.d/42-my-application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:
$ 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 ...
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
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
通过显示 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
第 26 章 使用 RHEL 系统角色管理本地存储 复制链接链接已复制到粘贴板!
要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 存储 角色,这是 RHEL 8 中可用的 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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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示例 playbook 中指定的设置包括如下:
size: <size>- 您必须使用单位(如 GiB)或百分比(例如 60%)来指定大小。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证指定的卷是否已创建或调整到请求的大小:
# ansible managed-node-01.example.com -m command -a 'lvs myvg'
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证在线块丢弃选项是否已启用:
# ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'
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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证阵列是否被正确创建:
# ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证您的池是否在 RAID 上:
# ansible managed-node-01.example.com -m command -a 'lsblk'
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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证条带大小是否被设置为所需的大小:
# ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'
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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
查看压缩和去重的当前状态:
$ 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
26.10. 使用 storage RHEL 系统角色创建 LUKS2 加密的卷 复制链接链接已复制到粘贴板!
您可以通过运行 Ansible playbook,使用 storage 角色来创建和配置使用 LUKS 加密的卷。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo权限。
流程
将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:luks_password: <password>- 保存更改,并关闭编辑器。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 }}"有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
查找 LUKS 加密卷的
luksUUID值:# ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb' 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 ...验证创建的 LUKS 加密的卷:
# 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] ...
第 27 章 使用 RHEL 系统角色管理 systemd 单元 复制链接链接已复制到粘贴板!
通过使用 systemd RHEL 系统角色,您可以自动化某些与 systemd 相关的任务,并远程执行它们。您可以对以下操作使用角色:
- 管理服务
- 部署单元
- 部署置入文件
27.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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
27.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此置入文件在
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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证角色是否将置入文件放在了正确的位置:
# ansible managed-node-01.example.com -m command -a 'ls /etc/systemd/system/sshd.service.d/' 99-override.conf
27.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对文件名使用
<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有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.systemd/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证该服务是否已启用并启动:
# 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 ...
第 28 章 使用 RHEL 系统角色配置时间同步 复制链接链接已复制到粘贴板!
Network Time Protocol(NTP)和 Precision Time Protocol (PTP)是通过网络同步计算机时钟的标准。网络中准确的时间同步非常重要,因为某些服务依赖它。例如,Kerberos 只容许服务器和客户端之间很少的时间差异,以防止重播攻击。
您可以在 playbook 的 timesync_ntp_provider 变量中设置要配置的时间服务。如果没有设置此变量,角色会根据以下因素决定时间服务:
-
在 RHEL 8 及更新版本上:
chronyd -
在 RHEL 6 和 7 上:
chronyd(默认)或者如果已安装了ntpd。
28.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示例 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请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
显示时间源的详情:
如果受管节点运行
chronyd服务,请输入:# 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 ...如果受管节点运行
ntpd服务,请输入:# 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 ...
28.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示例 playbook 中指定的设置包括如下:
iburst: yes- 启用快速初始同步。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.timesync/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
如果受管节点运行
chronyd服务:显示时间源的详情:
# 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对于启用了 NTS 的源,显示特定于 NTP 源身份验证的信息:
# 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验证
Cook列中报告的 cookies 是否大于 0。
如果受管节点运行
ntpd服务,请输入:# 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
第 29 章 使用 RHEL 系统角色配置系统以进行会话记录 复制链接链接已复制到粘贴板!
使用 tlog RHEL 系统角色,以自动的方式记录和监控受管节点上终端会话活动。您可以使用 SSSD 服务将记录配置为为每个用户或用户组进行。
在 tlog RHEL 系统角色中记录解决方案的会话由以下组件组成:
-
tlog工具 - 系统安全性服务守护进程(SSSD)
- 可选: Web 控制台界面
29.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>tlog_scope_sssd: < value>-
一些值指定只记录某些用户和组,而不是all或none。 tlog_users_sssd: < ;list_of_users>- 您要记录会话的用户的 YAML 列表。请注意,如果不存在,角色不会添加用户。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
检查 SSSD 置入文件的内容:
# cd /etc/sssd/conf.d/sssd-session-recording.conf您可以看到该文件包含您在 playbook 中设置的参数。
- 以其会话将被记录的用户的身份登录,执行某些操作,然后退出。
以
root用户身份:显示记录的会话的列表:
# 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",... ...下一步需要
rec(记录 ID)字段的值。请注意,由于 15 个字符的限制,
_COMM字段的值被缩短了。回放会话:
# tlog-play -r journal -M TLOG_REC=<recording_id>
29.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: - adminstlog_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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
检查 SSSD 置入文件的内容:
# cat /etc/sssd/conf.d/sssd-session-recording.conf您可以看到该文件包含您在 playbook 中设置的参数。
- 以其会话将被记录的用户的身份登录,执行某些操作,然后退出。
以
root用户身份:显示记录的会话的列表:
# 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",... ...下一步需要
rec(记录 ID)字段的值。请注意,由于 15 个字符的限制,
_COMM字段的值被缩短了。回放会话:
# tlog-play -r journal -M TLOG_REC=<recording_id>
第 30 章 使用 RHEL 系统角色配置 IPsec VPN 连接 复制链接链接已复制到粘贴板!
您可以使用虚拟专用网络(VPN)通过不可信网络(如互联网)建立安全加密的隧道。此类隧道可确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部。
通过使用 vpn RHEL 系统角色,您可以自动创建 Libreswan IPsec VPN 配置的过程。
vpn RHEL 系统角色只能创建使用预共享密钥(PSK)或证书的 VPN 配置来相互验证对等点。
30.1. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN 复制链接链接已复制到粘贴板!
主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。
为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。
通过使用 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示例 playbook 中指定的设置包括如下:
hosts: < ;list>使用您要配置 VPN 的对等点定义 YAML 字典。如果条目不是一个 Ansible 管理的节点,则您必须在
hostname参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1角色在每个受管节点上配置 VPN 连接。连接名为 <
peer_A>-to-<peer_B>,例如managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。auth_method: psk-
启用对等点之间的 PSK 身份验证。角色在控制节点上使用
openssl来创建 PSK。 auto: <startup_method>-
指定连接的启动方法。有效值是
add、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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
确认连接已成功启动,例如:
# 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'请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。
为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。
例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 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示例 playbook 中指定的设置包括如下:
hosts: < ;list>定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为
<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: <startup_method>-
指定连接的启动方法。有效值是
add、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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
确认连接已成功启动,例如:
# 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'请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
30.3. 使用 vpn RHEL 系统角色使用 PSK 身份验证配置 IPsec 站点到站点 VPN 复制链接链接已复制到粘贴板!
站点到站点的 VPN 在两个不同的网络之间建立一个安全、加密的隧道,在不安全的公共网络(如互联网)中无缝链接。例如,这可让分支机构中的设备访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。
为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。
通过使用 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: subnets: - 192.0.2.0/24 managed-node-02.example.com: subnets: - 198.51.100.0/24 - 203.0.113.0/24 auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true示例 playbook 中指定的设置包括如下:
hosts: < ;list>使用您要配置 VPN 的网关定义 YAML 字典。如果条目不是 Ansible 管理的节点,您必须在
hostname参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1角色在每个受管节点上配置 VPN 连接。连接名为
-to-,例如managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。subnets: <yaml_list_of_subnets>- 定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
auth_method: psk-
启用对等点之间的 PSK 身份验证。角色在控制节点上使用
openssl来创建 PSK。 auto: <startup_method>-
指定连接的启动方法。有效值是
add、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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
确认连接已成功启动,例如:
# 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'请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
30.4. 使用 vpn RHEL 系统角色,配置具有基于证书身份验证的 IPsec 网状 VPN 复制链接链接已复制到粘贴板!
IPsec 网格会创建一个完全互连的网络,每个服务器都可以与所有其他服务器安全通信。这是涵盖多个数据中心或云供应商的分布式数据库集群或高可用性环境的理想选择。在每对服务器之间建立直接的加密隧道可确保安全通信,而无需中央瓶颈。
为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。网格中的每个主机都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。
通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 您可以为每个受管节点准备一个 PKCS #12 文件:
每个文件包含:
- 服务器的私钥
- 服务器证书
- CA 证书
- 如果需要,则中间证书
-
文件被命名为
<managed_node_name_as_in_the_inventory>.p12。 - 文件存储在与 playbook 相同的目录中。
服务器证书包含以下字段:
-
扩展的密钥使用(EKU)设置为
TLS Web 服务器身份验证。 - 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
- X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
-
扩展的密钥使用(EKU)设置为
流程
编辑
~/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将
cert_name变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将敏感变量存储在加密的文件中:
创建 vault :
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pkcs12_pwd: <password>- 保存更改,并关闭编辑器。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: Initialize IPsec NSS database if not initialized ansible.builtin.command: cmd: ipsec initnss when: db_files.matched == 0 - 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示例 playbook 中指定的设置包括如下:
opportunistic: true-
在多个主机之间启用机会网格。
policies变量定义必须或可以加密哪些子网和主机流量,并且哪些应该继续使用纯文本连接。 auth_method: cert- 启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
policies: <list_of_policies>以 YAML 列表格式定义 Libreswan 策略。
默认策略是
private-or-clear。要将它改为private,上面的 playbook 包含默认cidr条目的一个相应策略。如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个
clear策略。例如,如果应该为192.0.2.0/24子网配置网格,并且控制节点使用 IP 地址192.0.2.1,则您需要一个用于192.0.2.1/32的clear策略,如 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
在网格的一个节点上,ping 另一个节点来激活连接:
[root@managed-node-01]# ping managed-node-02.example.com确认连接处于活跃状态:
[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'
第 31 章 使用 RHEL 系统角色配置 Microsoft SQL Server 复制链接链接已复制到粘贴板!
您可以使用 microsoft.sql.server Ansible 系统角色自动化 Microsoft SQL Server 的安装和管理。此角色还通过应用 mssql TuneD 配置文件优化 Red Hat Enterprise Linux (RHEL),来提高 SQL Server 的性能和吞吐量。
在安装过程中,角色将 SQL Server 的存储库及相关软件包添加到受管主机。这些存储库中的软件包由 Microsoft 提供、维护和托管。
如果应用程序需要 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:sa_pwd: <sa_password>- 保存更改,并关闭编辑器。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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
在 SQL Server 主机上,使用带有
-N参数的sqlcmd工具来建立到 SQL server 的加密连接,并运行查询,例如:$ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'如果命令成功,则到服务器的连接是 TLS 加密的。
如果应用程序需要 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:sa_pwd: <sa_password>- 保存更改,并关闭编辑器。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示例 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
在 SQL Server 主机上,使用带有
-N参数的sqlcmd工具来建立到 SQL server 的加密连接,并运行查询,例如:$ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'如果命令成功,则到服务器的连接是 TLS 加密的。
当您使用 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:sa_pwd: <sa_password>- 保存更改,并关闭编辑器。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'示例 playbook 中指定的设置包括如下:
mssql_datadir_mode和mssql_logdir_mode- 设置权限模式。在单引号中指定值,以确保角色将值解析为字符串,而不是解析为八进制数。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/microsoft.sql-server/README.md文件。验证 playbook 语法:
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml
验证
显示数据目录的模式:
$ 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/显示日志目录的模式:
$ 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/
您可以将 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 New Vault password: <vault_password> Confirm New Vault password: <vault_password>在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:sa_pwd: <sa_password> sql_pwd: <SQL_AD_password> ad_admin_pwd: <AD_admin_password>- 保存更改,并关闭编辑器。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 }}"示例 playbook 中指定的设置包括如下:
mssql_ad_configure: true- 启用针对 AD 的身份验证。
mssql_ad_join: true-
使用
ad_integrationRHEL 系统角色将受管节点加入到 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请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
$ ansible-playbook --ask-vault-pass ~/playbook.yml授权应能够向 SQL Server 进行身份验证的 AD 用户。在 SQL Server 上,执行以下步骤:
获取
Administrator用户的 Kerberos 票据:$ kinit Administrator@ad.example.com授权一个 AD 用户:
$ /opt/mssql-tools/bin/sqlcmd -S. -Q 'CREATE LOGIN [AD\<AD_user>] FROM WINDOWS;'对应该能够访问 SQL Server 的每个 AD 用户重复此步骤。
验证
在运行 SQL Server 的受管节点上:
获取 AD 用户的 Kerberos 票据:
$ kinit <AD_user>@ad.example.com使用
sqlcmd工具登录到 SQL Server ,并运行一个查询,例如:$ /opt/mssql-tools/bin/sqlcmd -S. -Q 'SELECT SYSTEM_USER'