使用 RHEL 系统角色自动化系统管理


Red Hat Enterprise Linux 9

使用 Red Hat Ansible Automation Platform playbook 在多个主机上进行一致且可重复配置的 RHEL 部署

Red Hat Customer Content Services

摘要

Red Hat Enterprise Linux (RHEL)系统角色是 Ansible 角色、模块和 playbook 的集合,帮助自动化 RHEL 系统的一致且可重复的管理。使用 RHEL 系统角色,您可以通过从一个系统运行配置 playbook 来高效地管理大型系统清单。

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 在顶部导航栏中点 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

第 1 章 RHEL 系统角色简介

通过使用 RHEL 系统角色,您可以远程管理跨 RHEL 主版本的多个 RHEL 系统的系统配置。

重要术语和概念

下面描述了 Ansible 环境中的重要术语和概念:

控制节点
控制节点是您运行 Ansible 命令和 playbook 的系统。您的控制节点可以是 Ansible Automation Platform、Red Hat Satellite 或 RHEL 9、8 或 7 主机。如需更多信息,请参阅 在 RHEL 9 上准备一个控制节点
受管节点
受管节点是您通过 Ansible 管理的服务器和网络设备。受管节点有时也称为主机。Ansible 不必安装到受管节点上。如需更多信息,请参阅 准备一个受管节点
Ansible playbook
在 playbook 中,您可以定义要在受管节点上实现的配置,或受管节点上系统要执行的一组步骤。Playbook 是 Ansible 的配置、部署和编配语言。
清单(Inventory)
在清单文件中,您可以列出受管节点并指定每个受管节点的信息,如 IP 地址。在清单中,您还可以通过创建和嵌套组来组织受管节点,以便于扩展。清单文件有时也称为 hostfile。

Red Hat Enterprise Linux 9 控制节点上的可用角色和模块

rhel-system-roles 软件包提供的角色:

  • ad_integration :活动目录集成
  • aide :高级入侵检测环境
  • 引导加载程序 :GRUB 引导装载程序管理
  • 证书 :证书颁发和续订
  • cockpit :Web 控制台安装和配置
  • crypto_policies: 系统范围的加密策略
  • fapolicy: 文件访问策略守护进程配置
  • firewall: Firewalld management
  • ha_cluster: HA 集群管理
  • journald: Systemd journald 管理
  • kdump: 内核转储管理
  • kernel_settings: 内核设置管理
  • 日志记录 :配置日志记录
  • 指标 :性能监控和指标
  • nbde_client: Network Bound Disk Encryption client
  • nbde_server: Network Bound Disk Encryption server
  • 网络:网络配置
  • Podman: Podman 容器管理
  • Postfix :Postfix 配置
  • PostgreSQL: PostgreSQL 配置
  • rhc :订阅 RHEL 并配置 Insights 客户端
  • SELinux: SELinux 管理
  • SSH :SSH 客户端配置
  • sshd :SSH 服务器配置
  • 存储 :存储管理
  • systemd: 管理 systemd 单元
  • timesync: 时间同步
  • tlog: 终端会话记录
  • VPN :配置 IPsec VPN

ansible-collection-microsoft-sql 软件包提供的角色:

  • Microsoft.sql.server: Microsoft SQL Server

ansible-collection-redhat-rhel_mgmt 软件包提供的模块:

  • rhel_mgmt.ipmi_boot: 设置引导设备
  • rhel_mgmt.ipmi_power :设置系统电源状态
  • rhel_mgmt.redfish_command: 管理带外控制器(OOB)
  • rhel_mgmt.redfish_command: 从 OOB 控制器查询信息
  • rhel_mgmt.redfish_command: 管理 BIOS、UEFI 和 OOB 控制器

第 2 章 准备一个控制节点和受管节点以使用 RHEL 系统角色

在使用单独的 RHEL 系统角色管理服务和设置前,您必须准备控制节点和受管节点。

2.1. 在 RHEL 9 上准备一个控制节点

在使用 RHEL 系统角色前,您必须配置一个控制节点。然后,此系统根据 playbook 从清单中配置受管主机。

先决条件

  • 该系统已注册到客户门户网站。
  • Red Hat Enterprise Linux Server 订阅被附加到系统上。
  • 可选:Ansible Automation Platform 订阅被附加到系统上。

步骤

  1. 创建一个名为 ansible 的用户,来管理并运行 playbook:

    [root@control-node]# useradd ansible
    Copy to Clipboard
  2. 切换到新创建的 ansible 用户:

    [root@control-node]# su - ansible
    Copy to Clipboard

    以这个用户身份执行其余步骤。

  3. 创建一个 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>
    ...
    Copy to Clipboard

    为密钥文件使用推荐的默认位置。

  4. 可选: 要防止 Ansible 在每次建立连接时提示您输入 SSH 密钥密码,请配置一个 SSH 代理。
  5. 使用以下内容创建 ~/.ansible.cfg 文件:

    [defaults]
    inventory = /home/ansible/inventory
    remote_user = ansible
    
    [privilege_escalation]
    become = True
    become_method = sudo
    become_user = root
    become_ask_pass = True
    Copy to Clipboard
    注意

    ~/.ansible.cfg 文件中的设置具有更高的优先级,并覆盖全局 /etc/ansible/ansible.cfg 文件中的设置。

    使用这些设置,Ansible 执行以下操作:

    • 管理指定清单文件中的主机。
    • 当帐户建立到受管节点的 SSH 连接时,使用 remote_user 参数中设置的帐户。
    • 使用 sudo 工具,以 root 用户身份在受管节点上执行任务。
    • 每次应用 playbook 时,都会提示输入远程用户的 root 密码。出于安全考虑,建议这样做。
  6. 创建一个列出受管主机主机名的 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
    Copy to Clipboard

    请注意,控制节点必须能够解析主机名。如果 DNS 服务器无法解析某些主机名,请在主机条目旁边添加 ansible_host 参数来指定其 IP 地址。

  7. 安装 RHEL 系统角色:

    • 在没有 Ansible Automation Platform 的 RHEL 主机上,安装 rhel-system-roles 软件包:

      [root@control-node]# dnf install rhel-system-roles
      Copy to Clipboard

      此命令在 /usr/share/ansible/collections/ansible_collections/redhat/rhel_system_roles/ 目录中安装集合,并且 ansible-core 软件包作为依赖项。

    • 在 Ansible Automation Platform 上,以 ansible 用户身份执行以下步骤:

      1. ~/.ansible.cfg 文件中的内容 将 Red Hat Automation hub 定义为主要源
      2. 从 Red Hat Automation Hub 安装 redhat.rhel_system_roles 集合:

        [ansible@control-node]$ ansible-galaxy collection install redhat.rhel_system_roles
        Copy to Clipboard

        此命令在 ~/.ansible/collections/ansible_collections/redhat/rhel_system_roles/ 目录中安装集合。

后续步骤

2.2. 准备受管节点

受管节点是在清单中列出的系统,它由控制节点根据 playbook 进行配置。您不必在受管主机上安装 Ansible。

先决条件

  • 您已准备好了控制节点。如需更多信息,请参阅 在 RHEL 9 上准备一个控制节点
  • 您从控制节点进行 SSH 访问的权限。

    重要

    root 用户身份进行直接的 SSH 访问是一个安全风险。要降低这个风险,您将在此节点上创建一个本地用户,并在准备受管节点时配置一个 sudo 策略。然后,控制节点上的 Ansible 可以使用本地用户帐户登录到受管节点,并以不同的用户身份(如 root )运行 playbook。

流程

  1. 创建一个名为 ansible 的用户:

    [root@managed-node-01]# useradd ansible
    Copy to Clipboard

    控制节点稍后使用这个用户建立与这个主机的 SSH 连接。

  2. ansible 用户设置密码:

    [root@managed-node-01]# passwd ansible
    Changing password for user ansible.
    New password: <password>
    Retype new password: <password>
    passwd: all authentication tokens updated successfully.
    Copy to Clipboard

    当 Ansible 使用 sudoroot 用户身份执行任务时,您必须输入此密码。

  3. 在受管主机上安装 ansible 用户的 SSH 公钥:

    1. 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.
      Copy to Clipboard
    2. 当提示时,输入 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
      Copy to Clipboard
    3. 当提示时,输入密码:

      ansible@managed-node-01.example.com's password: <password>
      
      Number of key(s) added: 1
      
      Now try logging into the machine, with:   "ssh 'managed-node-01.example.com'"
      and check to make sure that only the key(s) you wanted were added.
      Copy to Clipboard
    4. 通过在控制节点上远程执行命令来验证 SSH 连接:

      [ansible@control-node]$ ssh managed-node-01.example.com whoami
      ansible
      Copy to Clipboard
  4. ansible 用户创建一个 sudo 配置:

    1. 使用 visudo 命令创建并编辑 /etc/sudoers.d/ansible 文件:

      [root@managed-node-01]# visudo /etc/sudoers.d/ansible
      Copy to Clipboard

      与普通编辑器相比,使用 visudo 的好处是,该工具在安装文件前提供基本的检查,如,检查解析错误。

    2. /etc/sudoers.d/ansible 文件中配置满足您要求的 sudoers 策略,例如:

      • 要为 ansible 用户授予权限,以便在输入 ansible 用户密码后以此主机上的任何用户和组身份运行所有命令,请使用:

        ansible   ALL=(ALL) ALL
        Copy to Clipboard
      • 要向 ansible 用户授予权限,以便在不输入 ansible 用户密码的情况下以该主机上任何用户和组的身份运行所有命令,请使用:

        ansible   ALL=(ALL) NOPASSWD: ALL
        Copy to Clipboard

    或者,配置匹配您安全要求的更精细的策略。有关 sudoers 策略的详情,请查看 sudoers (5) 手册页。

验证

  1. 验证您可以在所有受管节点上执行来自控制节点的命令:

    [ansible@control-node]$ ansible all -m ping
    BECOME password: <password>
    managed-node-01.example.com | SUCCESS => {
            ...
        	"ping": "pong"
    }
    ...
    Copy to Clipboard

    硬编码的所有组会动态包含清单文件中列出的所有主机。

  2. 使用 Ansible command 模块在所有受管节点上运行 whoami 工具来验证特权升级是否正常工作:

    [ansible@control-node]$ ansible all -m command -a whoami
    BECOME password: <password>
    managed-node-01.example.com | CHANGED | rc=0 >>
    root
    ...
    Copy to Clipboard

    如果命令返回 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>
Copy to Clipboard

查看加密的文件

以下命令提示您输入现有的 vault 密码。然后,它显示已加密的文件的敏感内容。

# ansible-vault view vault.yml
Vault password: <vault_password>
my_secret: "yJJvPqhsiusmmPPZdnjndkdnYNDjdj782meUZcw"
Copy to Clipboard

编辑加密的文件

以下命令提示您输入现有的 vault 密码。然后,它打开已加密的文件,以供您使用默认编辑器更新敏感变量。

# ansible-vault edit vault.yml
Vault password: <vault_password>
Copy to Clipboard

加密现有文件

以下命令提示您输入新的 vault 密码。然后,它加密现有的未加密的文件。

# ansible-vault encrypt vault.yml
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
Encryption successful
Copy to Clipboard

解密现有文件

以下命令提示您输入现有的 vault 密码。然后,它会解密现有的加密文件。

# ansible-vault decrypt vault.yml
Vault password: <vault_password>
Decryption successful
Copy to Clipboard

更改加密的文件的密码

以下命令提示您输入原始 vault 密码,然后提示输入新的 vault 密码。

# ansible-vault rekey vault.yml
Vault password: <vault_password>
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>
Rekey successful
Copy to Clipboard

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 }}"
Copy to Clipboard

您使用 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)域的过程。

先决条件

步骤

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      usr: administrator
      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ad_integration_allow_rc4_crypto: <true|false>

    配置角色是否在受管节点上激活 AD-SUPPORT 加密策略。默认情况下,RHEL 不支持弱 RC4 加密,但如果 AD 中的 Kerberos 仍然需要 RC4,则您可以通过设置 ad_integration_allow_rc4_crypto: true 来启用这个加密类型。

    如果 Kerberos 使用 AES 加密,则可省略此变量或将其设置为 false

    ad_integration_timesync_source: <time_server>
    指定用于时间同步的 NTP 服务器。Kerberos 需要在 AD 域控制器和域成员之间同步时间,以防止重播攻击。如果省略此变量,ad_integration 角色不会利用 timesync RHEL 系统角色在受管节点上配置时间同步。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ad_integration/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 检查 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
    Copy to Clipboard

第 5 章 使用 RHEL 系统角色配置 GRUB 引导装载程序

通过使用 引导装载程序 RHEL 系统角色,您可以自动化与 GRUB 引导装载程序相关的配置和管理任务。

此角色目前支持配置 GRUB 引导装载程序,该加载程序运行在以下 CPU 构架上:

  • AMD 和 Intel 64 位构架(x86-64)
  • 64 位 ARM 架构(ARMv8.0)
  • IBM Power Systems, Little Endian(POWER9)

5.1. 使用 bootloader RHEL 系统角色更新现有引导装载程序条目

您可以使用 bootloader RHEL 系统角色,以自动的方式更新 GRUB 引导菜单中的现有条目。这样,您可以有效地传递可以优化系统性能或行为的特定内核命令行参数。

例如,如果您利用不需要来自内核和 init 系统的详细引导消息的系统,请使用 bootloaderquiet 参数应用到受管节点上现有的引导装载程序条目中,以实现更干净、更整洁、更用户友好的引导体验。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您确定了与您要更新的引导装载程序条目对应的内核。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    kernel
    指定与您要更新的引导装载程序条目连接的内核。
    options
    为所选引导装载程序条目指定要更新的内核命令行参数(内核)。
    bootloader_reboot_ok: true
    该角色检测是否需要重启才能使更改生效,并执行受管节点的重启。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.bootloader/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 检查您指定的引导装载程序条目是否已更新了内核命令行参数:

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'grubby --info=ALL'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    index=1
    kernel="/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64"
    args="ro crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap $tuned_params quiet"
    root="/dev/mapper/rhel-root"
    initrd="/boot/initramfs-5.14.0-362.24.1.el9_3.aarch64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (5.14.0-362.24.1.el9_3.aarch64) 9.4 (Plow)"
    id="2c9ec787230141a9b087f774955795ab-5.14.0-362.24.1.el9_3.aarch64"
    ...
    Copy to Clipboard

5.2. 使用 bootloader RHEL 系统角色,使用密码保护引导菜单

您可以使用 bootloader RHEL 系统角色,以自动的方式为 GRUB 引导菜单设置密码。这样,您可以有效地防止未经授权的用户修改引导参数,并更好地控制系统引导。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuration and management of GRUB boot loader
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Set the bootloader password
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.bootloader
          vars:
            bootloader_password: "{{ pwd }}"
            bootloader_reboot_ok: true
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    bootloader_password: "{{ pwd }}"
    变量确保使用密码保护引导参数。
    bootloader_reboot_ok: true
    该角色检测是否需要重启才能使更改生效,并执行受管节点的重启。
    重要

    更改引导装载程序密码不是幂等的事务。这意味着,如果您再次应用相同的 Ansible playbook,则结果将不一样,并且受管节点的状态将改变。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.bootloader/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  1. 在 GRUB 引导菜单屏幕中,在受管节点上按 e 键进行编辑。

    GRUB2 引导装载程序菜单
  2. 会提示您输入用户名和密码:

    GRUB2 菜单锁
    输入 username: root
    引导装载程序用户名始终是 root,您不需要在 Ansible playbook 中指定它。
    Enter password: <password>
    引导装载程序密码对应于您在 vault.yml 文件中定义的 pwd 变量。
  3. 您可以查看或编辑特定引导装载程序条目的配置:

    GRUB2 引导装载程序条目详情

5.3. 使用 bootloader RHEL 系统角色为引导装载程序菜单设置超时

您可以使用 bootloader RHEL 系统角色,以自动的方式为 GRUB 引导装载程序菜单配置超时。您可以更新要干预的时间,并为各种目的选择一个非默认引导条目。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuration and management of the GRUB boot loader
      hosts: managed-node-01.example.com
      tasks:
        - name: Update the boot loader timeout
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.bootloader
          vars:
            bootloader_timeout: 10
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    bootloader_timeout: 10
    输入一个整数,以控制在引导默认条目前,GRUB 引导装载程序菜单显示多长时间。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.bootloader/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 远程重启受管节点:

    # ansible managed-node-01.example.com -m ansible.builtin.reboot
    managed-node-01.example.com | CHANGED => {
        "changed": true,
        "elapsed": 21,
        "rebooted": true
    }
    Copy to Clipboard
  2. 在受管节点上,观察 GRUB 引导菜单屏幕。

    GRUB2 引导装载程序菜单超时
    突出显示的条目将在 10s 内自动执行

    在 GRUB 自动使用默认条目之前,此引导菜单显示多长时间。

    • 替代方案:您可以远程查询受管节点的 /boot/grub2/grub.cfg 文件中的"timeout"设置:

      # ansible managed-node-01.example.com -m ansible.builtin.command -a "grep 'timeout' /boot/grub2/grub.cfg"
      managed-node-01.example.com | CHANGED | rc=0 >>
      if [ x$feature_timeout_style = xy ] ; then
        set timeout_style=menu
        set timeout=10
      # Fallback normal timeout code in case the timeout_style feature is
        set timeout=10
      if [ x$feature_timeout_style = xy ] ; then
          set timeout_style=menu
          set timeout=10
          set orig_timeout_style=${timeout_style}
          set orig_timeout=${timeout}
            # timeout_style=menu + timeout=0 avoids the countdown code keypress check
            set timeout_style=menu
            set timeout=10
            set timeout_style=hidden
            set timeout=10
      if [ x$feature_timeout_style = xy ]; then
        if [ "${menu_show_once_timeout}" ]; then
          set timeout_style=menu
          set timeout=10
          unset menu_show_once_timeout
          save_env menu_show_once_timeout
      Copy to Clipboard

5.4. 使用 bootloader RHEL 系统角色收集引导装载程序配置信息

您可以使用 bootloader RHEL 系统角色,以自动的方式收集有关 GRUB 引导装载程序条目的信息。您可以使用这些信息来验证系统引导参数的正确配置,如内核和初始 RAM 磁盘镜像路径。

因此,您可以,例如:

  • 防止引导失败。
  • 在故障排除时恢复回已知的良好状态。
  • 确保与安全相关的内核命令行参数被正确配置。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.bootloader/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 在控制节点上运行前面的 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)"
            }
        ]
    ...
    Copy to Clipboard

    命令行输出显示以下值得注意的有关引导条目的配置信息:

    args
    在引导过程中 GRUB2 引导装载程序传递给内核的命令行参数。它们配置内核、initramfs 和其他引导时组件的各种设置和行为。
    id
    引导装载程序菜单中分配给每个引导条目的唯一标识符。它由机器 ID 和内核版本组成。
    root
    内核要挂载的根文件系统,并在启动过程中作为主文件系统使用。

第 6 章 使用 RHEL 系统角色从 CA 请求证书并创建自签名证书

许多服务(如 Web 服务器)都使用 TLS 加密与客户端的连接。这些服务需要一个私钥和一个证书,以及签名证书的可信证书颁发机构(CA)。

通过使用 certificate RHEL 系统角色,您可以在受管节点上自动生成私钥。另外,角色配置 certmonger 服务,来向 CA 发送证书签名请求(CSR),且服务会在证书过期前自动更新证书。

出于测试目的,您可以使用 certificate 角色创建自签名证书,而不是从 CA 请求签名的证书。

6.1. 使用 certificate RHEL 系统角色从 IdM CA 请求一个新证书

如果 Red Hat Enterprise Linux 主机是 RHEL 身份管理(IdM)环境的成员,则您可以从 IdM 证书颁发机构(CA)请求 TLS 证书,并在此主机上运行的服务中使用它们。通过使用 证书 RHEL 系统角色,您可以自动化创建私钥的过程,并让 certmonger 服务从 CA 请求一个证书。默认情况下,certmonger 会在证书过期前更新证书。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 受管节点是 IdM 域的成员,且域使用 IdM 集成的 CA。

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    name: <path_or_file_name>

    定义生成的私钥的名称或路径,以及证书文件:

    • 如果将变量设置为 web-server,角色会将私钥存储在 /etc/pki/tls/private/web-server.key 中,并将证书存储在 /etc/pki/tls/certs/web-server.crt 文件中。
    • 如果将变量设置为一个路径,如 /tmp/web-server,则角色会将私钥存储在 /tmp/web-server.key 中,并将证书存储在 /tmp/web-server.crt 文件中。

      请注意,您使用的目录必须设置 cert_t SELinux 上下文。您可以使用 selinux RHEL 系统角色来管理 SELinux 上下文。

    ca: ipa
    定义角色从 IdM CA 请求证书。
    dns: <hostname_or_list_of_hostnames>
    设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(*)或以 YAML 列表格式指定多个名称。
    principal: <kerberos_principal>
    可选:设置应该包含在证书中的 Kerberos 主体。
    run_before: <command>
    可选:定义 certmonger 在从 CA 请求证书之前应执行的命令。
    run_after: < command>
    可选:定义 certmonger 在从 CA 收到发布的证书后应该执行的命令。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.certificate/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 列出 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
    Copy to Clipboard

6.2. 使用 certificate RHEL 系统角色请求一个新的自签名证书

如果需要用于测试环境的 TLS 证书,您可以使用自签名证书。通过使用 certificate RHEL 系统角色,您可以自动化创建私钥的过程,并让 certmonger 服务创建自签名证书。默认情况下,certmonger 会在证书过期前更新证书。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    name: <path_or_file_name>

    定义生成的私钥的名称或路径,以及证书文件:

    • 如果将变量设置为 web-server,角色会将私钥存储在 /etc/pki/tls/private/web-server.key 中,并将证书存储在 /etc/pki/tls/certs/web-server.crt 文件中。
    • 如果将变量设置为一个路径,如 /tmp/web-server,则角色会将私钥存储在 /tmp/web-server.key 中,并将证书存储在 /tmp/web-server.crt 文件中。

      请注意,您使用的目录必须设置 cert_t SELinux 上下文。您可以使用 selinux RHEL 系统角色来管理 SELinux 上下文。

    ca: self-sign
    定义角色创建一个自签名证书。
    dns: <hostname_or_list_of_hostnames>
    设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(*)或以 YAML 列表格式指定多个名称。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.certificate/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 列出 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
    Copy to Clipboard

第 7 章 使用 RHEL 系统角色安装和配置 web 控制台

使用 cockpit RHEL 系统角色,您可以在多个 RHEL 系统上自动部署和启用 Web 控制台。

7.1. 使用 cockpit RHEL 系统角色安装 Web 控制台

您可以使用 cockpit 系统角色在多个系统上自动安装和启用 RHEL web 控制台。

在本例中,您可以使用 cockpit 系统角色来:

  • 安装 RHEL web 控制台。
  • 允许 firewalldselinux 系统角色配置系统,以开放新端口。
  • 将 web 控制台设置为使用 ipa trusted 证书颁发机构的证书,而不使用自签名证书。
注意

您不必在 playbook 中调用 firewallcertificate 系统角色来管理防火墙或创建证书。cockpit 系统角色根据需要自动调用它们。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    cockpit_manage_selinux: true
    允许使用 selinux 系统角色配置 SELinux,来对 websm_port_t SELinux 类型设置正确的端口权限。
    cockpit_manage_firewall: true
    允许 cockpit 系统角色使用 firewalld 系统角色来添加端口。
    cockpit_certificates: <YAML_dictionary>

    默认情况下,RHEL web 控制台使用自签名证书。或者,您可以将 cockpit_certificates 变量添加到 playbook 中,并将角色配置为请求 IdM 证书颁发机构(CA)中的证书,或使用受管节点上提供的现有证书和私钥。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.cockpit/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 8 章 使用 RHEL 系统角色设置自定义加密策略

自定义加密策略是一组管理加密算法和协议使用的规则和配置。这些策略帮助您在多个系统和应用程序中维护受保护的、一致且可管理的安全环境。

通过使用 crypto_policies RHEL 系统角色,您可以以自动的方式,快速且一致地在多个操作系统中配置自定义加密策略。

8.1. 使用 crypto_policies RHEL 系统角色,使用 FUTURE 加密策略增强安全性

您可以使用 crypto_policies RHEL 系统角色在受管节点上配置 FUTURE 策略。例如,此策略有助于实现:

  • 防范未来新出现的威胁:预测计算能力的进步。
  • 增强了安全性:更强大的加密标准需要更长的密钥长度和更安全的算法。
  • 遵守高安全性标准:例如在医疗保健、电信和财务方面,数据敏感度很高,并且强大的加密可用性至关重要。

通常,FUTURE 适合处理高度敏感数据,为未来法规做准备或采用长期安全策略的环境。

警告

传统系统或软件不必支持FUTURE 策略强制执行的更现代化且更严格的算法和协议。例如,旧的系统可能不支持 TLS 1.3 或更大的密钥大小。这可能导致兼容性问题。

另外,使用强大的算法通常会增加计算工作负载,这可能会对您的系统性能造成负面影响。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    crypto_policies_policy: FUTURE
    在受管节点上配置所需的加密策略(FUTURE)。它可以是基本策略,也可以是带有一些子策略的基本策略。指定的基本策略和子策略必须在受管节点上提供。默认值为 null。这意味着配置没有被更改,crypto_policies RHEL 系统角色将只收集 Ansible 事实。
    crypto_policies_reboot_ok: true
    导致系统在加密策略更改后重启,以确保所有服务和应用程序将读取新的配置文件。默认值为 false

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard
警告

因为 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 指南的链接,请参阅有关 产品合规 红帽客户门户网站上的 通用标准 部分。

验证

  1. 在控制节点上,创建另一个 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    crypto_policies_active
    导出的 Ansible 事实含有当前活动的策略名称,格式为 crypto_policies_policy 变量所接受的格式。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/verify_playbook.yml
    Copy to Clipboard
  3. 运行 playbook:

    $ ansible-playbook ~/verify_playbook.yml
    TASK [debug] **************************
    ok: [host] => {
        "crypto_policies_active": "FUTURE"
    }
    Copy to Clipboard

    crypto_policies_active 变量显示受管节点上活动的策略。

第 9 章 使用 fapolicyd RHEL 系统角色限制应用程序的执行

通过使用 fapolicyd 软件框架,您可以根据用户定义的策略限制应用程序的执行,框架会在执行前验证应用程序的完整性。这是一种防止运行不可靠的且可能恶意的应用程序的有效方法。您可以使用 fapolicyd RHEL 系统角色自动化 fapolicyd 的安装和配置。

重要

fapolicyd 服务只阻止以常规用户身份,而不是以 root 身份执行未授权的应用程序。

9.1. 使用 fapolicyd RHEL 系统角色防止用户执行不可靠代码

您可以使用 fapolicyd RHEL 系统角色自动化 fapolicyd 服务的安装和配置。使用此角色,您可以远程配置服务,以允许用户仅执行可信的应用程序,例如 RPM 数据库和允许列表中列出的应用程序。另外,该服务也可以在执行允许的应用程序之前执行完整性检查。

先决条件

流程

  1. 创建一个包含以下内容的 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>
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook ~/playbook.yml --syntax-check
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 以用户身份执行不在允许列表中的二进制应用程序:

    $ ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>'
    bash: line 1: /bin/not_authorized_application: Operation not permitted non-zero return code
    Copy to Clipboard

第 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 设置重置为其默认状态。这样,您可以有效地删除任何非预期的或不安全的防火墙规则,并简化其管理。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    previous: replaced

    删除所有现有的用户定义的设置,并将 firewalld 设置重置为默认值。如果将 previous:replaced 参数与其他设置相结合,则 firewall 角色会在应用新设置前删除所有现有设置。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 在控制节点上运行此命令,来远程检查受管节点上的所有防火墙配置是否已重置为其默认值:

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
    Copy to Clipboard

10.2. 使用 firewall RHEL 系统角色,将 firewalld 中的传入流量从一个本地端口转发到不同的本地端口

您可以使用 firewall RHEL 系统角色来远程配置流量从一个本地端口到另一个本地端口的转发。

例如,如果您有一个环境,其中同一机器上有多个服务共存,且需要相同的默认端口,则可能会出现端口冲突。这些冲突可能会中断服务并导致停机。使用 firewall RHEL 系统角色,您可以高效地将流量转发到替代端口,以确保您的服务可以在不修改其配置的情况下同时运行。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    forward_port: 8080/tcp;443
    使用 TCP 协议将到本地端口 8080 的流量转发到端口 443。
    runtime: true

    在运行时配置中启用更改。默认值被设置为 true

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 在控制节点上,运行以下命令来远程检查受管节点上的转发端口:

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports'
    managed-node-01.example.com | CHANGED | rc=0 >>
    port=8080:proto=tcp:toport=443:toaddr=
    Copy to Clipboard

10.3. 使用 firewall RHEL 系统角色配置 firewalld DMZ 区域

作为系统管理员,您可以使用 firewall RHEL 系统角色在 enp1s0 接口上配置 dmz 区域,以允许到区域的 HTTPS 流量。这样,您可以让外部用户访问您的 web 服务器。

先决条件

步骤

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 在控制节点上,运行以下命令来远程检查受管节点上 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:
    Copy to Clipboard

第 11 章 使用 RHEL 系统角色配置高可用性集群

通过 ha_cluster 系统角色,您可以配置和管理使用 Pacemaker 高可用性集群资源管理器的高可用性集群。

11.1. ha_cluster RHEL 系统角色的变量

ha_cluster RHEL 系统角色 playbook 中,您可以根据集群部署的要求为高可用性集群定义变量。

您可以为 ha_cluster RHEL 系统角色设置的变量如下:

ha_cluster_enable_repos
启用包含 ha_cluster RHEL 系统角色所需的软件包的存储库的布尔值标志。当此变量被设置为默认值 true 时,您必须在将用作集群成员的系统上有活跃的覆盖 RHEL 和 RHEL 高可用性附加组件订阅,否则系统角色将失败。
ha_cluster_enable_repos_resilient_storage
(RHEL 9.4 及更高版本)一个布尔值标志,它启用包含弹性存储软件包(如 dlmgfs2)的存储库。要使此选项生效,ha_cluster_enable_repos 必须被设为 true。此变量的默认值为 false
ha_cluster_manage_firewall

(RHEL 9.2 及更高版本)一个决定 ha_cluster RHEL 系统角色是否管理防火墙的布尔值标志。当 ha_cluster_manage_firewall 设为 true 时,防火墙高可用性服务和fence-virt 端口被启用。当 ha_cluster_manage_firewall 被设置为 false 时,ha_cluster RHEL 系统角色不管理防火墙。如果您的系统正在运行 firewalld 服务,则必须在 playbook 中将该参数设置为 true

您可以使用 ha_cluster_manage_firewall 参数来添加端口,但您无法使用该参数删除端口。要删除端口,请直接使用 firewall 系统角色。

在 RHEL 9.2 及更高版本中,防火墙不再会被默认配置,因为它仅在 ha_cluster_manage_firewall 设为 true 时才进行配置。

ha_cluster_manage_selinux

(RHEL 9.2 及更高版本)一个决定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理属于防火墙高可用性服务的端口的布尔值标志。当 ha_cluster_manage_selinux 设为 true 时,属于防火墙高可用性服务的端口与 SELinux 端口类型 cluster_port_t 相关联。当 ha_cluster_manage_selinux 被设置为 false 时,ha_cluster RHEL 系统角色不管理 SELinux。

如果您的系统正在运行 selinux 服务,则必须在 playbook 中将此参数设置为 true。防火墙配置是管理 SELinux 的先决条件。如果没有安装防火墙,则管理 SELinux 策略会被跳过。

您可以使用 ha_cluster_manage_selinux 参数添加策略,但您无法使用该参数删除策略。要删除策略,请直接使用 selinux RHEL 系统角色。

ha_cluster_cluster_present

布尔值标志,如果设为 true,则会根据传递给角色的变量,决定是否在主机上配置 HA 集群。playbook 中没有指定且不被角色支持的任何集群配置都将丢失。

如果 ha_cluster_cluster_present 设为 false,则会从目标主机中删除所有 HA 集群配置。

此变量的默认值为 true

以下示例 playbook 删除了 node1node2 上的所有集群配置

- hosts: node1 node2
  vars:
    ha_cluster_cluster_present: false

  roles:
    - rhel-system-roles.ha_cluster
Copy to Clipboard
ha_cluster_start_on_boot
确定是否将集群服务配置为在引导时启动的布尔值标志。此变量的默认值为 true
ha_cluster_install_cloud_agents
(RHEL 9.5 及更高版本)一个决定是否安装了云环境的资源和隔离代理的布尔值标志。这些代理默认不会安装。另外,您可以使用 ha_cluster_fence_agent_packagesha_cluster_extra_packages 变量为云环境指定软件包。此变量的默认值为 false
ha_cluster_fence_agent_packages
要安装的隔离代理软件包列表。此变量的默认值为 fence-agents-allfence-virt
ha_cluster_extra_packages

要安装的其他软件包列表。此变量的默认值是 no packages。

此变量可用于安装角色未自动安装的其他软件包,如自定义资源代理。

可以将隔离代理指定为这个列表的成员。但是,ha_cluster_fence_agent_packages 是用于指定隔离代理的推荐的角色变量,因此其默认值会被覆盖。

ha_cluster_hacluster_password
指定 hacluster 用户的密码的字符串值。hacluster 用户对集群具有完全访问权限。为保护敏感数据,vault 会加密密码,如使用 Ansible Vault 加密内容 中所述。没有默认密码值,必须指定此变量。
ha_cluster_hacluster_qdevice_password
(RHEL 9.3 及更高版本)指定仲裁设备的 hacluster 用户的密码的字符串值。只有在 ha_cluster_quorum 参数被配置为使用类型 net 的仲裁设备,且仲裁设备上 hacluster 用户的密码与 ha_cluster_hacluster_password 参数指定的 hacluster 用户的密码不同时,才需要此参数。hacluster 用户对集群具有完全访问权限。为保护敏感数据,vault 会加密密码,如使用 Ansible Vault 加密内容 中所述。此密码没有默认值。
ha_cluster_corosync_key_src

Corosync authkey 文件的路径,它是 Corosync 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的 authkey 值。密钥应为 256 字节的随机数据。

如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。

如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。

如果设置了此变量,则忽略这个密钥的 ha_cluster_regenerate_keys

此变量的默认值为 null。

ha_cluster_pacemaker_key_src

Pacemaker authkey 文件的路径,它是 Pacemaker 通信的身份验证和加密密钥。强烈建议您对每个集群都有一个唯一的 authkey 值。密钥应为 256 字节的随机数据。

如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。

如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。

如果设置了此变量,则忽略这个密钥的 ha_cluster_regenerate_keys

此变量的默认值为 null。

ha_cluster_fence_virt_key_src

fence-virtfence-xvm 预共享密钥文件的路径,它是 fence-virtfence-xvm 隔离代理验证密钥的位置。

如果为此变量指定一个密钥,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。

如果没有指定密钥,则使用节点上已存在的密钥。如果节点没有相同的密钥,则一个节点的密钥将被分发到其他节点,以便所有节点都有相同的密钥。如果节点都没有密钥,则将生成一个新的密钥,并将其分发到节点。如果 ha_cluster RHEL 系统角色以这种方式生成一个新密钥,则您应该将密钥复制到节点的 hypervisor ,以确保隔离正常工作。

如果设置了此变量,则忽略这个密钥的 ha_cluster_regenerate_keys

此变量的默认值为 null。

ha_cluster_pcsd_public_key_srcr, ha_cluster_pcsd_private_key_src

pcsd TLS 证书和私钥的路径。如果没有指定,则使用节点上已存在的证书密钥对。如果没有证书密钥对,则会生成一个随机的新密钥对。

如果为此变量指定了私钥值,则建议您使用 vault 加密密钥,如 使用 Ansible Vault 加密内容 中所述。

如果设置了这些变量,则将忽略此证书密钥对的 ha_cluster_regenerate_keys

这些变量的默认值为 null。

ha_cluster_pcsd_certificates

(RHEL 9.2 及更高版本)使用 certificate RHEL 系统角色创建 pcsd 私钥和证书。

如果您的系统没有使用 pcsd 私钥和证书配置,则您可以使用以下两种方式之一创建它们:

  • 设置 ha_cluster_pcsd_certificates 变量。当您设置了 ha_cluster_pcsd_certificates 变量时,certificate RHEL 系统角色在内部使用,并按照定义为 pcsd 创建私钥和证书。
  • 不要设置 ha_cluster_pcsd_public_key_srcha_cluster_pcsd_private_key_srcha_cluster_pcsd_certificates 变量。如果没有设置这些变量中的任何一个,则 ha_cluster RHEL 系统角色将通过 pcsd 本身创建 pcsd 证书。ha_cluster_pcsd_certificates 的值被设置为变量 certificate_requests 的值,如 certificate RHEL 系统角色中所指定的。有关 certificate RHEL 系统角色的更多信息,请参阅 使用 RHEL 系统角色请求证书

以下操作注意事项适用于 ha_cluster_pcsd_certificate 变量的使用:

  • 除非您使用 IPA 并将系统加入到 IPA 域,否则 certificate RHEL 系统角色会创建自签名证书。在这种情况下,您必须在 RHEL 系统角色上下文之外明确配置信任设置。系统角色不支持配置信任设置。
  • 当您设置 ha_cluster_pcsd_certificates 变量时,不要设置 ha_cluster_pcsd_public_key_srcha_cluster_pcsd_private_key_src 变量。
  • 当您设置 ha_cluster_pcsd_certificates 变量时,此证书-密钥对会忽略 ha_cluster_regenerate_keys

此变量的默认值为 []

有关在高可用性集群中创建 TLS 证书和密钥文件的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 为高可用性集群创建 pcsd TLS 证书和密钥文件

ha_cluster_regenerate_keys
布尔值标志,当设为 true 时,决定将重新生成预共享密钥和 TLS 证书。有关重新生成密钥和证书的更多信息,请参阅 ha_cluster_corosync_key_srcha_cluster_pacemaker_key_src ha_cluster_fence_virt_key_srcha_cluster_pcsd_public_key_srcha_cluster_pcsd_private_key_src 变量的描述。
此变量的默认值为 false
ha_cluster_pcs_permission_list

配置使用 pcsd 管理集群的权限。您使用这个变量配置的项目如下:

  • type - 用户
  • name - 用户或组名称
  • allow_list - 对指定的用户或组允许的操作:

    • read - 查看集群状态和设置
    • write - 修改集群设置,权限和 ACL 除外
    • grant - 修改集群权限和 ACL
    • full - 对集群的无限制访问,包括添加和删除节点,以及访问密钥和证书

ha_cluster_pcs_permission_list 变量的结构及其默认值如下:

ha_cluster_pcs_permission_list:
  - type: group
    name: hacluster
    allow_list:
      - grant
      - read
      - write
Copy to Clipboard
ha_cluster_cluster_name
集群的名称。这是一个字符串值,默认值为 my-cluster
ha_cluster_transport

(RHEL 9.1 及更高版本) 设置集群传输方法。您使用这个变量配置的项目如下:

  • type (可选) - 传输类型:knet, udp, 或 udpuudpudpu 传输类型只支持一个链接。对于 udpudpu,始终禁用加密。若未指定,则默认为 knet
  • options (可选)- 带有传输选项的“名称-值”的字典列表。
  • links (可选)- “名称-值”的字典列表。每个 name-value 字典列表都包含适用于一个 Corosync 链接的选项。建议您为每个链接设置 linknumber 值。否则,第一个字典列表被默认分配给第一个链接,第二个分配给第二个链接,以此类推。
  • compression (可选)- 配置传输压缩的 name-value 字典列表。仅支持 knet 传输类型。
  • crypto (可选)- 配置传输加密的 name-value 字典列表。默认情况下启用加密。仅支持 knet 传输类型。

有关允许的选项列表,请查看 pcs -h cluster setup 帮助页或 pcs(8) 手册页的 cluster 部分中的 setup 描述。有关更详细的描述,请查看 corosync.conf(5) man page。

ha_cluster_transport 变量的结构如下:

ha_cluster_transport:
  type: knet
  options:
    - name: option1_name
      value: option1_value
    - name: option2_name
      value: option2_value
  links:
    -
      - name: option1_name
        value: option1_value
      - name: option2_name
        value: option2_value
    -
      - name: option1_name
        value: option1_value
      - name: option2_name
        value: option2_value
  compression:
    - name: option1_name
      value: option1_value
    - name: option2_name
      value: option2_value
  crypto:
    - name: option1_name
      value: option1_value
    - name: option2_name
      value: option2_value
Copy to Clipboard

有关配置传输方法的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值

ha_cluster_totem

(RHEL 9.1 及更高版本) 配置 Corosync totem。有关允许的选项列表,请查看 pcs -h cluster setup 帮助页或 pcs(8) 手册页的 cluster 部分中的 setup 描述。有关更详细的说明,请查看 corosync.conf(5) man page。

ha_cluster_totem 变量的结构如下:

ha_cluster_totem:
  options:
    - name: option1_name
      value: option1_value
    - name: option2_name
      value: option2_value
Copy to Clipboard

有关配置 Corosync totem 的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值

ha_cluster_quorum

(RHEL 9.1 及更高版本) 配置集群仲裁。您可以为集群仲裁配置以下项目:

  • options (可选)- 配置仲裁的名称-值字典的列表。允许的选项有:auto_tie_breakerlast_man_standinglast_man_standing_windowwait_for_all。有关仲裁选项的详情,请查看 votequorum(5)手册页。
  • device(可选)- (RHEL 9.2 及更高版本)将集群配置为使用仲裁设备。默认情况下,不使用仲裁设备。

    • model(必需)- 指定仲裁设备型号。仅支持 net
    • model_options (可选)- 配置指定仲裁设备型号的名称-值字典的列表。对于型号 net,您必须指定 hostalgorithm 选项。

      使用 pcs-address 选项设置连接到 qnetd 主机的自定义 pcsd 地址和端口。如果没有指定这个选项,角色会连接到 主机 上的默认 pcsd 端口。

    • generic_options(可选)- 不特定于型号的名称0值字典设置仲裁设备选项的列表。
    • heuristics_options(可选)- 配置仲裁设备启发式的名称-值字典的列表。

      有关仲裁设备选项的详情,请查看 corosync-qdevice(8)手册页。通用选项为 sync_timeouttimeout。有关型号 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
Copy to Clipboard

有关配置集群仲裁的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 在高可用性集群中配置 Corosync 值。有关使用仲裁设备配置集群的 ha_cluster RHEL 系统角色的 playbook 的示例,请参阅 使用仲裁设备配置高可用性集群

ha_cluster_sbd_enabled
(RHEL 9.1 和更高版本) 一个布尔值标记,它决定集群是否可以使用 SBD 节点隔离机制。此变量的默认值为 false。有关启用 SBD 的 ha_cluster 系统角色 playbook 的示例,请参阅 使用 ha_cluster_node_options 变量配置具有 SBD 节点隔离的高可用性集群,并 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群
ha_cluster_sbd_options

(RHEL 9.1 及更高版本) 指定 SBD 选项的 name-value 字典列表。有关这些选项的详情,请参考 sbd(8)手册页中的 Configuration via environment 部分。

支持的选项包括:

  • delay-start - 默认为 false,记录为 SBD_DELAY_START
  • startmode - 默认为 always,记录为 SBD_START_MODE
  • timeout-action - 默认为 flush,reboot,记录为 SBD_TIMEOUT_ACTION
  • watchdog-timeout - 默认为 5,记录为 SBD_WATCHDOG_TIMEOUT

Watchdog 和 SBD 设备可以在节点到节点的基础上配置为以下两个变量之一:

ha_cluster_cluster_properties

Pacemaker 集群范围配置的集群属性集列表。仅支持一组集群属性。

一组集群属性的结构如下:

ha_cluster_cluster_properties:
  - attrs:
      - name: property1_name
        value: property1_value
      - name: property2_name
        value: property2_value
Copy to Clipboard

默认情况下,不设置任何属性。

以下示例 playbook 配置包含 node1node2 的集群,并设置 stonith-enabledno-quorum-policy 集群属性。

- hosts: node1 node2
  vars:
    ha_cluster_cluster_name: my-new-cluster
    ha_cluster_hacluster_password: password
    ha_cluster_cluster_properties:
      - attrs:
          - name: stonith-enabled
            value: 'true'
          - name: no-quorum-policy
            value: stop

  roles:
    - rhel-system-roles.ha_cluster
Copy to Clipboard
ha_cluster_node_options

(RHEL 9.4 及更高版本)此变量定义因集群节点而异的设置。它为指定节点设置选项,但不指定哪些节点组成集群。您可以在清单或 playbook 中使用 hosts 参数指定哪些节点组成集群。

您使用这个变量配置的项目如下:

  • node_name(必需)- 为其定义 Pacemaker 节点属性的节点的名称。它必须与为节点而定义的名称相匹配。
  • pcs_address(可选)- (RHEL 9.5 及更新版本)pcs 用来与节点进行通信的地址。您可以指定名称、FQDN 或 IP 地址。您还可以指定端口。
  • corosync_addresses(可选)-(RHEL 9.5 及更高版本)Corosync 使用的地址的列表。所有节点必须有相同数量的地址。对于所有节点,地址的顺序必须相同,以便为所有节点在同一位置指定属于特定链接的地址。
  • sbd_watchdog_modules(可选)-(RHEL 9.5 及更高版本)要加载的 Watchdog 内核模块,其创建 /dev/watchdog* 设备。如果没有设置,则默认为空。
  • sbd_watchdog_modules_blocklist(可选)-(RHEL 9.5 及更高版本)要卸载和阻止的 Watchdog 内核模块。如果没有设置,则默认为空。
  • sbd_watchdog(可选)-(RHEL 9.5 及更高版本)要被 SBD 使用的 Watchdog 设备。如果没有设置,则默认为 /dev/watchdog
  • sbd_devices(可选)-(RHEL 9.5 及更高版本)用于交换 SBD 信息和监控的设备。如果没有设置,则默认为空。总是使用长而稳定的设备名称(/dev/disk/by-id/)引用设备。
  • attributes(可选)- 节点的 Pacemaker 节点属性的集合的列表。目前,只支持一个集合。第一个集合被使用,其余集合被忽略。
  • utilization(可选)-(RHEL 9.5 及更高版本)节点利用率的集合的列表。字段值必须是整数。目前,只支持一个集合。第一个集合被使用,其余集合被忽略。

ha_cluster_node_options 变量的结构如下:

ha_cluster_node_options:
  - node_name: node1
    pcs_address: node1-address
    corosync_addresses:
      - 192.168.1.11
      - 192.168.2.11
    sbd_watchdog_modules:
      - module1
      - module2
    sbd_watchdog_modules_blocklist:
      - module3
    sbd_watchdog: /dev/watchdog2
    sbd_devices:
      - /dev/disk/by-id/000001
      - /dev/disk/by-id/000002
      - /dev/disk/by-id/000003
    attributes:
      - attrs:
          - name: attribute1
            value: value1_node1
          - name: attribute2
            value: value2_node1
    utilization:
      - attrs:
          - name: utilization1
            value: value1_node1
          - name: utilization2
            value: value2_node1
  - node_name: node2
    pcs_address: node2-address:2224
    corosync_addresses:
      - 192.168.1.12
      - 192.168.2.12
    sbd_watchdog_modules:
      - module1
    sbd_watchdog_modules_blocklist:
      - module3
    sbd_watchdog: /dev/watchdog1
    sbd_devices:
      - /dev/disk/by-id/000001
      - /dev/disk/by-id/000002
      - /dev/disk/by-id/000003
    attributes:
      - attrs:
          - name: attribute1
            value: value1_node2
          - name: attribute2
            value: value2_node2
    utilization:
      - attrs:
          - name: utilization1
            value: value1_node2
          - name: utilization2
            value: value2_node2
Copy to Clipboard

默认情况下,没有定义节点选项。

有关包含节点选项配置的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置带有节点属性的高可用性集群

ha_cluster_resource_primitives

此变量定义 RHEL 系统角色配置的 pacemaker 资源,包括隔离资源。您可以为每个资源配置以下项目:

  • id (必需)- 资源的 ID。
  • agent(必需)- 资源或隔离代理的名称,如 ocf:pacemaker:Dummystonith:fence_xvm。对于 STONITH 代理,必须指定 stonith:。对于资源代理,可以使用短名称,如 Dummy,而不是 ocf:pacemaker:Dummy。但是,如果安装了多个具有相同短名称的代理,则角色将失败,因为它将无法决定应使用哪个代理。因此,建议您在指定资源代理时使用全名。
  • instance_attrs (可选) - 资源的实例属性集合列表。目前,只支持一个集合。属性的确切名称和值,以及它们是否是必需的,取决于资源或隔离代理。
  • meta_attrs (可选) - 资源的元属性集合列表。目前,只支持一个集合。
  • copy_operations_from_agent(可选)- (RHEL 9.3 及更新版本)资源代理通常会为资源操作定义默认设置,如 intervaltimeout,为特定代理进行了优化。如果此变量设为 true,则这些设置将被复制到资源配置。否则,集群范围的默认值应用到资源。如果您使用 ha_cluster_resource_operation_defaults 角色变量为资源定义资源操作默认值,则您可以将其设置为 false。此变量的默认值为 true
  • operations (可选) - 资源操作列表。

    • action(必需)- pacemaker 以及资源或隔离代理定义的操作。
    • attrs(必需)- 操作选项,必须至少指定一个选项。(RHEL 9.5 及更高版本)
  • utilization(可选)- 资源利用率集合的列表。value 字段必须是整数。只支持一个集合,因此第一个集合被使用,其余集合被忽略。

使用 ha_cluster RHEL 系统角色配置的资源定义的结构如下:

  - id: resource-id
    agent: resource-agent
    instance_attrs:
      - attrs:
          - name: attribute1_name
            value: attribute1_value
          - name: attribute2_name
            value: attribute2_value
    meta_attrs:
      - attrs:
          - name: meta_attribute1_name
            value: meta_attribute1_value
          - name: meta_attribute2_name
            value: meta_attribute2_value
    copy_operations_from_agent: bool
    operations:
      - action: operation1-action
        attrs:
          - name: operation1_attribute1_name
            value: operation1_attribute1_value
          - name: operation1_attribute2_name
            value: operation1_attribute2_value
      - action: operation2-action
        attrs:
          - name: operation2_attribute1_name
            value: operation2_attribute1_value
          - name: operation2_attribute2_name
            value: operation2_attribute2_value
Copy to Clipboard

默认情况下不定义任何资源。

有关包含资源配置的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群

ha_cluster_resource_groups

此变量定义由系统角色配置的 pacemaker 资源组。您可以为每个资源组配置以下项目:

  • id (必需)- 组的 ID.
  • resources (必需) - 组的资源列表.每个资源通过其 ID 引用,资源必须在 ha_cluster_resource_primitives 变量中定义。必须至少列出一个资源。
  • meta_attrs (可选) - 组的元属性集合列表。目前,只支持一个集合。

使用 ha_cluster RHEL 系统角色配置的资源组定义的结构如下:

ha_cluster_resource_groups:
  - id: group-id
    resource_ids:
      - resource1-id
      - resource2-id
    meta_attrs:
      - attrs:
          - name: group_meta_attribute1_name
            value: group_meta_attribute1_value
          - name: group_meta_attribute2_name
            value: group_meta_attribute2_value
Copy to Clipboard

默认情况下,不定义任何资源组。

有关包含资源组配置的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群

ha_cluster_resource_clones

此变量定义由系统角色配置的 pacemaker 资源克隆。您可以为资源克隆配置以下项目:

  • resource_id (必需)- 要克隆的资源.资源必须在 ha_cluster_resource_primitives 变量或 ha_cluster_resource_groups 变量中定义。
  • promotable(可选)- 表示要创建的资源克隆是否是可升级的克隆,用 truefalse 表示。
  • id (可选)- 克隆的自定义 ID。如果未指定 ID,将会生成它。如果集群不支持这个选项,则会显示一个警告。
  • meta_attrs (可选)- 克隆的元属性集合列表。目前,只支持一个集合。

使用 ha_cluster RHEL 系统角色配置的资源克隆定义的结构如下:

ha_cluster_resource_clones:
  - resource_id: resource-to-be-cloned
    promotable: true
    id: custom-clone-id
    meta_attrs:
      - attrs:
          - name: clone_meta_attribute1_name
            value: clone_meta_attribute1_value
          - name: clone_meta_attribute2_name
            value: clone_meta_attribute2_value
Copy to Clipboard

默认情况下,没有定义资源克隆。

有关包含资源克隆配置的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离和资源的高可用性集群

ha_cluster_resource_defaults

(RHEL 9.3 及更新版本)此变量定义资源默认值的集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源。您使用 ha_cluster_resource_defaults 变量指定的默认值不会应用到使用它们自己定义值的覆盖它们的资源。

只有 meta 属性可以被指定为默认值。

您可以为每个默认值集合配置以下项目:

  • id(可选)- 默认值集合的 ID。如果没有指定,它会自动生成。
  • rule (可选)- 使用 pcs 语法编写的规则,定义何时以及集合适用于哪些资源。有关指定规则的详情,请查看 pcs(8)手册页中的 资源默认值集合创建 部分。
  • score (可选)- 默认值集合的权重。
  • attrs (可选)- 作为默认值应用到资源的元数据属性。

ha_cluster_resource_defaults 变量的结构如下:

ha_cluster_resource_defaults:
  meta_attrs:
    - id: defaults-set-1-id
      rule: rule-string
      score: score-value
      attrs:
        - name: meta_attribute1_name
          value: meta_attribute1_value
        - name: meta_attribute2_name
          value: meta_attribute2_value
    - id: defaults-set-2-id
      rule: rule-string
      score: score-value
      attrs:
        - name: meta_attribute3_name
          value: meta_attribute3_value
        - name: meta_attribute4_name
          value: meta_attribute4_value
Copy to Clipboard

有关配置资源默认值的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有资源和资源操作默认值的高可用性集群

ha_cluster_resource_operation_defaults

(RHEL 9.3 及更新版本)此变量定义资源操作默认值集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源和特定的资源操作。使用 ha_cluster_resource_operation_defaults 变量指定的默认值不应用到使用它们自己定义的值覆盖它们的资源操作。默认情况下,ha_cluster RHEL 系统角色配置资源,来为资源操作定义自己的值。有关使用 ha_cluster_resource_operations_defaults 变量覆盖这些默认值的详情,请查看 ha_cluster_resource_primitives 中的 copy_operations_from_agent 项的描述。

只有 meta 属性可以被指定为默认值。

ha_cluster_resource_operations_defaults 变量的结构与 ha_cluster_resource_defaults 变量的结构一样,但指定规则的方式除外。有关指定规则来描述集合应用到的资源操作的详情,请查看 pcs(8)手册页中的 资源操作默认值集合创建 部分。

ha_cluster_stonith_levels

(RHEL 9.4 及更高版本)此变量定义 STONITH 级别,也称为隔离拓扑。隔离级别将集群为使用多个设备来隔离节点。如果一个设备失败了,您可以定义替代设备,且您可以要求多个设备成功执行,来将节点视为成功隔离。有关隔离级别的更多信息,请参阅 配置和管理高可用性集群 中的 配置隔离级别

您可以在定义隔离级别时配置以下项目:

  • level(必需)- 尝试隔离级别的顺序。Pacemaker 会按照升序尝试级别,直到一个成功。
  • target(可选)- 此级别应用到的节点的名称。
  • 您必须指定以下三个选择之一:

    • target_pattern - 与这个级别应用到的节点名称匹配的 POSIX 扩展正则表达式。
    • target_attribute - 为此级别应用到的节点设置的节点属性的名称。
    • target_attributetarget_value - 为此级别应用到的节点设置的节点属性的名称和值。
  • resouce_ids (必需)- 必须为此级别尝试的所有隔离资源的列表。

    默认情况下,没有定义隔离级别。

使用 ha_cluster RHEL 系统角色配置的隔离级别定义的结构如下:

ha_cluster_stonith_levels:
  - level: 1..9
    target: node_name
    target_pattern: node_name_regular_expression
    target_attribute: node_attribute_name
    target_value: node_attribute_value
    resource_ids:
      - fence_device_1
      - fence_device_2
  - level: 1..9
    target: node_name
    target_pattern: node_name_regular_expression
    target_attribute: node_attribute_name
    target_value: node_attribute_value
    resource_ids:
      - fence_device_1
      - fence_device_2
Copy to Clipboard

有关配置隔离默认值的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有隔离级别的高可用性集群

ha_cluster_constraints_location

此变量定义资源位置限制。资源位置限制表示资源可在哪些节点上运行。您可以指定资源 ID 或模式匹配的资源,它们可以匹配多个资源。您可以通过节点名称或规则指定节点。

您可以为资源位置约束配置以下项目:

  • resource (必需)- 约束应用到的资源规格。
  • node (必需)- 资源应首选或避免的节点的名称。
  • id (可选)- 约束 ID。如果未指定,它将自动生成。
  • options (可选)- “名称-值”字典列表。

    • score - 设置约束的权重。

      • score 值表示资源首选在节点上运行。
      • score 值表示资源应避免在节点上运行。
      • score 值为 -INFINITY 表示资源必须避免在节点上运行。
      • 如果没有指定 score,分数值默认为 INFINITY

默认情况下,没有定义资源位置限制。

指定资源 ID 和节点名称的资源位置约束的结构如下:

ha_cluster_constraints_location:
  - resource:
      id: resource-id
    node: node-name
    id: constraint-id
    options:
      - name: score
        value: score-value
      - name: option-name
        value: option-value
Copy to Clipboard

您为资源位置约束配置的项目,用于指定资源模式是为资源位置约束配置的相同项目,用于指定资源 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
Copy to Clipboard

您可以为指定资源 ID 和规则的资源位置约束配置以下项目:

  • resource (必需)- 约束应用到的资源规格。

    • id (必需)- 资源 ID。
    • role(可选)- 约束限制的资源角色:StartedUnpromoted,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
Copy to Clipboard

为资源位置约束配置的项目,用于指定资源模式,规则是用于资源位置约束的相同项目,用于指定资源 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
Copy to Clipboard

有关创建具有资源约束的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群

ha_cluster_constraints_colocation

此变量定义资源 colocation 约束。资源共存限制表示一个资源的位置取决于另一个资源的位置。存在两种类型的 colocation 约束:两个资源的一个简单 colocation 约束,并为多个资源设置 colocation 约束。

您可以为简单资源托管约束配置以下项目:

  • resource_follower (必需)- 应相对于 resource_leader 的资源。

    • id (必需)- 资源 ID。
    • role(可选)- 约束限制的资源角色:StartedUnpromoted,Promoted
  • resource_leader (必需)- 集群将决定优先放置此资源的位置,然后决定放置 resource_follower 的位置。

    • id (必需)- 资源 ID。
    • role(可选)- 约束限制的资源角色:StartedUnpromoted,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
Copy to Clipboard

您可以为资源集托管约束配置以下项目:

  • resource_sets (必需)- 资源集合列表。

    • resource_ids (必需)- 资源列表。
    • options (可选)- “名称/值”字典列表精细调整集合中资源如何被约束处理。
  • id (可选)- Same 值作为简单 colocation 约束。
  • options (可选)- Same 值作为简单 colocation 约束。

资源集 colocation 约束的结构如下:

ha_cluster_constraints_colocation:
  - resource_sets:
      - resource_ids:
          - resource-id1
          - resource-id2
        options:
          - name: option-name
            value: option-value
    id: constraint-id
    options:
      - name: score
        value: score-value
      - name: option-name
        value: option-value
Copy to Clipboard

有关创建具有资源约束的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群

ha_cluster_constraints_order

此变量定义资源顺序约束。资源顺序限制表示应发生某些资源操作的顺序。有两种资源顺序约束:两个资源的简单顺序约束,以及多个资源的设置顺序约束。

您可以为简单资源顺序约束配置以下项目:

  • resource_first (必需)- resource_then 资源依赖的资源。

    • id (必需)- 资源 ID。
    • action (可选)- 在为 resource_then 资源启动操作前必须完成的操作。允许的值: startstoppromotedemote
  • resource_then (必需)- 依赖资源。

    • id (必需)- 资源 ID。
    • action (可选)- 资源只能在 resource_first 资源执行操作后执行的操作。允许的值: startstoppromotedemote
  • 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
Copy to Clipboard

您可以为资源集顺序约束配置以下项目:

  • 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
Copy to Clipboard

有关创建具有资源限制的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群

ha_cluster_constraints_ticket

此变量定义资源 ticket 约束。资源票据限制表示依赖于特定票据的资源。有两种类型的资源 ticket 约束:一个资源的简单 ticket 约束,多个资源的 ticket 顺序约束。

您可以为简单资源票据约束配置以下项目:

  • resource (必需)- 约束应用到的资源规格。

    • id (必需)- 资源 ID。
    • role(可选)- 约束限制的资源角色:StartedUnpromoted,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
Copy to Clipboard

您可以为资源集票据约束配置以下项目:

  • 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
Copy to Clipboard

有关创建具有资源约束的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置具有资源约束的高可用性集群

ha_cluster_acls

(RHEL 9.5 及更高版本)此变量定义 ACL 角色、用户和组。

您可以为 acl_roles 配置以下项目:

  • id(必需)- ACL 角色的 ID。
  • description(可选)- ACL 角色的描述。
  • permissions(可选)- ACL 角色权限的列表。

    • kind(必需)- 被授予的访问权限。允许的值有 readwritedeny
    • xpath(可选)- 在 CIB 中选择权限应用的一个 XML 元素的 XPath 规范。必须准确指定其中一个项目 xpathreference
    • reference(可选)- 在 CIB 中权限应用的一个 XML 元素的 ID。必须准确指定其中一个项目:xpath 或 reference。ID 必须存在。

您可以为 acl_users 配置以下项目:

  • id(必需)- ACL 用户的 ID。
  • roles(可选)- 分配给用户的 ACL 角色 ID 的列表。

您可以为 acl_group 配置以下项目:

  • id(必需)- ACL 组的 ID。
  • roles(可选)- 分配给组的 ACL 角色 ID 的列表。

ACL 定义的结构如下:

ha_cluster_acls:
  acl_roles:
    - id: role-id-1
      description: role description
      permissions:
        - kind: access-type
          xpath: XPath expression
        - kind: access-type
          reference: cib-element-id
    - id: role-id-2
      permissions:
        - kind: access-type
          xpath: XPath expression
  acl_users:
    - id: user-name
      roles:
        - role-id-1
        - role-id-2
  acl_groups:
    - id: group-name
      roles:
        - role-id-2
Copy to Clipboard

要在集群中启用 ACLS,您必须配置 enable-acl 集群属性:

ha_cluster_cluster_properties:
  - attrs:
      - name: enable-acl
        value: 'true'
Copy to Clipboard

有关创建具有 ACL 角色、用户和组的集群 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 使用 RHEL 系统角色配置实现访问控制列表(ACLS)的高可用性集群

ha_cluster_alerts

(RHEL 9.5 及更高版本)此变量定义 Pacemaker 警报。

注意

ha_cluster 角色将集群配置为调用外部程序来处理警报。您必须提供程序,并将它们分发给集群节点。

您可以为 alerts 配置以下项目:

  • id(必需)- 警报的 ID
  • ipath(必需)- 警报代理可执行文件的路径。
  • description(可选)- 警报的描述。
  • instance_attrs(可选)- 警报的实例属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。
  • meta_attrs(可选)- 警报元属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。*recipients(可选)- 警报接收者的列表。

您可以为 recipients 配置以下项目:

  • value(必需)- 接收者的值。
  • id(可选)- 接收者的 ID。
  • description(可选)- 接收者的描述。
  • instance_attrs(可选)- 接收者实例属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。
  • meta_attrs(可选)- 接收者元属性集合的列表。只支持一个集合。第一个集合被使用,其余集合被忽略。

警报定义的结构如下:

ha_cluster_alerts:
  - id: alert1
    path: /alert1/path
    description: Alert1 description
    instance_attrs:
      - attrs:
        - name: alert_attr1_name
          value: alert_attr1_value
    meta_attrs:
      - attrs:
        - name: alert_meta_attr1_name
          value: alert_meta_attr1_value
    recipients:
      - value: recipient_value
        id: recipient1
        description: Recipient1 description
        instance_attrs:
          - attrs:
            - name: recipient_attr1_name
              value: recipient_attr1_value
        meta_attrs:
          - attrs:
            - name: recipient_meta_attr1_name
              value: recipient_meta_attr1_value
Copy to Clipboard

有关配置带有警报的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 使用 ha_cluster RHEL 系统角色为高可用性集群配置警报

ha_cluster_qnetd

(RHEL 9.2 及更高版本)此变量配置一个 qnetd 主机,然后其充当集群的外部仲裁设备。

您可以为 qnetd 主机配置以下项目:

  • present (可选)- 如果为 true,则在主机上配置 qnetd 实例。如果为 false,请从主机中删除 qnetd 配置。默认值为 false。如果将其设置为 true,则必须将 ha_cluster_cluster_present 设置为 false
  • start_on_boot(可选)- 配置 qnetd 实例是否应在引导时自动启动。默认值为 true
  • regenerate_keys(可选)- 将此变量设置为 true 以重新生成 qnetd TLS 证书。如果重新生成了证书,则必须重新运行角色,以便每个集群再次连接到 qnetd 主机,或者手动运行 pcs

您无法在集群节点上运行 qnetd,因为隔离会破坏 qnetd 操作。

有关配置使用仲裁设备的集群的 ha_cluster RHEL 系统角色 playbook 的示例,请参阅 配置使用仲裁设备的集群

11.2. 为 ha_cluster RHEL 系统角色指定一个清单

使用 ha_cluster RHEL 系统角色 playbook 配置 HA 集群时,您可以在清单中为集群配置节点的名称和地址。

对于清单中的每个节点,您可以选择指定以下项目:

  • node_name - 集群中节点的名称。
  • pcs_address - pcs 用于与节点进行通信的地址。它可以是名称、FQDN 或 IP 地址,并且可以包含端口号。
  • corosync_addresses - Corosync 使用的地址列表.组成特定集群的所有节点必须具有相同数量的地址。对于所有节点,地址的顺序必须相同,以便为所有节点在同一位置指定属于特定链接的地址。

以下示例显示了一个具有目标 node1node2 的清单。node1node2 必须是完全限定域名,或者必须能够连接到节点,例如,名称可以通过 /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
Copy to Clipboard

在 RHEL 9.1 及更新的版本中,您可以选择性地为清单中的每个节点配置 watchdog 和 SBD 设备。所有 SBD 设备都必须可以从所有节点共享和访问。每个节点的 watchdog 设备也可以不同。有关在清单文件中配置 SBD 节点隔离的流程示例,请参阅 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群

11.3. 为高可用性集群创建 pcsd TLS 证书和密钥文件

(RHEL 9.2 及更高版本)集群节点之间的连接使用传输层安全(TLS)加密进行保护。默认情况下,pcsd 守护进程生成自签名证书。但是,对于许多部署,您可能希望将默认证书替换为您公司的证书颁发机构发布的证书,并为 pcsd 应用您的公司证书策略。

您可以使用 ha_cluster RHEL 系统角色在高可用性集群中创建 TLS 证书和密钥文件。运行此 playbook 时,ha_cluster RHEL 系统角色在内部使用 certificate RHEL 系统角色来管理 TLS 证书。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

步骤

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_pcsd_certificates: <certificate_properties>
    /var/lib/pcsd 中创建自签名 pcsd 证书和私钥文件的变量。在本例中,pcsd 证书有文件名 FILENAME.crt,密钥文件名为 FILENAME.key

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.4. 配置不运行任何资源的高可用性集群

您可以使用 ha_cluster 系统角色,以简单、自动的方式配置基本集群。创建基本集群后,您可以使用 pcs 命令行界面逐个资源地配置其他集群组件和行为。以下示例流程配置基本的双节点集群,但没有使用最低所需参数配置隔离。

警告

ha_cluster 系统角色替换指定节点上任何现有的群集配置。playbook 中未指定的任何设置都将丢失。

先决条件

步骤

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.5. 配置带有隔离和资源的高可用性集群

集群配置的特定组件取决于您的各个需求,这因站点而异。以下示例流程显示了使用 ha_cluster RHEL 系统角色配置不同集群组件的格式。配置的群集包括隔离设备、集群资源、资源组和克隆的资源。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

步骤

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_resource_primitives: <cluster_resources>
    由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
    ha_cluster_resource_groups: <resource_groups>
    ha_cluster RHEL 系统角色配置的资源组定义的列表。
    ha_cluster_resource_clones: <resource_clones>
    ha_cluster RHEL 系统角色配置的资源克隆定义的列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.6. 配置具有资源和资源操作默认值的高可用性集群

(RHEL 9.3 及更高版本)在集群配置中,您可以更改所有资源的资源选项的 Pacemaker 默认值。您还可以更改集群中所有资源操作的默认值。

有关更改资源选项的默认值的详情,请参考 更改资源选项的默认值。有关全局资源操作默认值的详情,请参考 配置全局资源操作默认值

以下示例流程使用 ha_cluster RHEL 系统角色创建定义资源和资源操作默认值的高可用性集群。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

步骤

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_resource_defaults: <resource_defaults>
    定义资源默认值集合的变量。
    ha_cluster_resource_operation_defaults: <resource_operation_defaults>
    定义资源操作默认值集合的变量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.7. 配置具有隔离级别的高可用性集群

(RHEL 9.4 及更高版本)当您为节点配置多个隔离设备时,您需要为这些设备定义隔离级别,以确定 Pacemaker 将使用设备尝试隔离节点的顺序。有关隔离级别的详情,请参考 配置隔离级别

以下示例流程使用 ha_cluster RHEL 系统角色创建定义隔离级别的高可用性集群。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      fence1_password: <fence1_password>
      fence2_password: <fence2_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个 playbook 文件,如 ~/playbook.yml。这个示例 playbook 文件配置一个运行 firewalldselinux 服务的集群。

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster that defines fencing levels
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
            ha_cluster_cluster_name: my-new-cluster
            ha_cluster_hacluster_password: "{{ cluster_password }}"
            ha_cluster_manage_firewall: true
            ha_cluster_manage_selinux: true
            ha_cluster_resource_primitives:
              - id: apc1
                agent: 'stonith:fence_apc_snmp'
                instance_attrs:
                  - attrs:
                      - name: ip
                        value: apc1.example.com
                      - name: username
                        value: user
                      - name: password
                        value: "{{ fence1_password }}"
                      - name: pcmk_host_map
                        value: node1:1;node2:2
              - id: apc2
                agent: 'stonith:fence_apc_snmp'
                instance_attrs:
                  - attrs:
                      - name: ip
                        value: apc2.example.com
                      - name: username
                        value: user
                      - name: password
                        value: "{{ fence2_password }}"
                      - name: pcmk_host_map
                        value: node1:1;node2:2
            # Nodes have redundant power supplies, apc1 and apc2. Cluster must
            # ensure that when attempting to reboot a node, both power
            # supplies # are turned off before either power supply is turned
            # back on.
            ha_cluster_stonith_levels:
              - level: 1
                target: node1
                resource_ids:
                  - apc1
                  - apc2
              - level: 1
                target: node2
                resource_ids:
                  - apc1
                  - apc2
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_resource_primitives: <cluster_resources>
    由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
    ha_cluster_stonith_levels: <stonith_levels>
    定义 STONITH 级别,也称为隔离拓扑的变量,它将集群配置为使用多个设备来隔离节点。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.8. 使用资源限制配置高可用性集群

在配置集群时,您可以指定集群资源的行为与应用程序要求保持一致。您可以通过配置资源约束来控制集群资源的行为。

您可以定义以下资源约束的类别:

以下示例流程使用 ha_cluster RHEL 系统角色创建高可用性集群,其中包括资源位置约束、资源托管约束、资源顺序约束和资源票据约束。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_resource_primitives: <cluster_resources>
    由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
    ha_cluster_constraints_location: <location_constraints>
    定义资源位置约束的变量。
    ha_cluster_constraints_colocation: <colocation_constraints>
    定义资源托管约束的变量。
    ha_cluster_constraints_order: <order_constraints>
    定义资源顺序约束的变量。
    ha_cluster_constraints_ticket: <ticket_constraints>
    定义 Booth 票据约束的变量。
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.9. 在高可用性集群中配置 Corosync 值

(RHEL 9.1 及更高版本) corosync.conf 文件提供 Corosync 使用的集群参数,Pacemaker 构建的集群成员资格和消息传递层。对于您的系统配置,您可以更改 corosync.conf 文件中的一些默认参数。通常,您不应该直接编辑 corosync.conf 文件。但是,您可以使用 ha_cluster RHEL 系统角色配置 Corosync 值。

以下示例流程使用 ha_cluster RHEL 系统角色创建配置 Corosync 值的高可用性集群。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_transport: <transport_method>
    设置集群传输方法的变量。
    ha_cluster_totem: <totem_options>
    配置 Corosync totem 选项的变量。
    ha_cluster_quorum: <quorum_options>
    配置集群仲裁选项的变量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.10. 导出集群配置以创建 RHEL 系统角色 playbook

从 RHEL 9.6 开始,您可以使用 ha_cluster RHEL 系统角色将集群的 Corosync 配置导出到 ha_cluster 变量中,这些变量可以重定向到角色来重新创建同一集群。如果您没有使用 ha_cluster 创建集群,或者无法访问集群的原始 playbook,您可以使用此功能来构建用于创建集群的新 playbook。

当您使用 ha_cluster RHEL 系统角色导出集群的配置时,不会导出所有变量。您必须手动修改配置以考虑这些变量。

导出中存在以下变量:

  • ha_cluster_cluster_present
  • ha_cluster_start_on_boot
  • ha_cluster_cluster_name
  • ha_cluster_transport
  • ha_cluster_totem
  • ha_cluster_quorum
  • ha_cluster_node_options - 仅存在 node_namecorosync_addressespcs_address 选项。

导出中不存在以下变量:

  • ha_cluster_hacluster_password - 这是角色的强制变量,但不能从现有集群中提取。
  • ha_cluster_corosync_key_src,ha_cluster_pacemaker_key_srcha_cluster_fence_virt_key_src - 这些变量应包含使用 Corosync 和 Pacemaker 密钥的文件的路径。由于密钥本身没有导出,因此这些变量不会存在于导出中。这些密钥对于每个集群应该是唯一的。
  • ha_cluster_regenerate_keys - 您应该决定是否使用现有密钥或生成新的密钥。

要导出当前的集群配置,请运行 ha_cluster RHEL 系统角色并设置 ha_cluster_export_configuration: true。这会在角色完成集群或 qnetd 主机后触发导出,并将其存储在 ha_cluster_facts 变量中。

默认情况下,ha_cluster_cluster_present 设为 trueha_cluster_qnetd.present 设为 false。这些设置将在指定的主机上重新配置集群,从指定的主机中删除 qnetd 配置,然后导出配置。要在不修改现有配置的情况下触发导出,请使用以下设置运行角色:

- hosts: node1
  vars:
    ha_cluster_cluster_present: null
    ha_cluster_qnetd: null
    ha_cluster_export_configuration: true

  roles:
    - linux-system-roles.ha_cluster
Copy to Clipboard

以下流程:

  • 将群集配置从集群节点 node1 导出到 ha_cluster_facts 变量。
  • ha_cluster_cluster_presentha_cluster_qnetd 变量设置为 null,以确保运行此 playbook 不会修改现有集群配置。
  • 使用 Ansible debug 模块显示 ha_cluster_facts 的内容。
  • 以 YAML 格式将 ha_cluster_facts 的内容保存到控制节点上的文件,供您在其中编写 playbook。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您之前已将带有配置的高可用性集群配置为导出。
  • 您已在控制节点上创建了一个清单文件,如 在 RHEL 9 上准备控制节点 中所述。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Export high availability cluster configuration
      hosts: node1
      Tasks:
        - name: Export configuration that does not modify existing cluster
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
            ha_cluster_cluster_present: null
            ha_cluster_qnetd: null
            ha_cluster_export_configuration: true
        - name: Print ha_cluster_info_result variable
          ansible.builtin.debug:
            var: ha_cluster_facts
        - name: Save current cluster configuration to a file
          delegate_to: localhost
          ansible.builtin.copy:
            content: "{{ ha_cluster_facts | to_nice_yaml(sort_keys=false) }}"
            dest: /path/to/file
            mode: "0640"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    hosts: node1
    包含要导出的集群信息的节点。
    ha_cluster_cluster_present: null
    设置 以指示在指定主机上不更改集群配置。
    ha_cluster_qnetd: null
    设置 以指示在指定主机上不会更改 qnetd 主机配置。
    ha_cluster_export_configuration: true
    一个变量,用来决定导出当前集群配置并将其存储在 ha_cluster_facts 变量中,该变量由 ha_cluster_info 模块生成。
    ha_cluster_facts
    包含导出的集群配置的变量。
    delegate_to: localhost
    将控制节点指定为导出配置文件的位置。
    Content: "{{ ha_cluster_facts | to_nice_yaml (sort_keys=false)}"}, dest: /path/to/file, mode: "0640"
    将 YAML 格式的配置文件复制到 /path/to/file,将文件权限设置为 0640。
  2. 使用您导出到控制节点上的 /path/to/file 的变量为您的系统编写 playbook。

    您必须添加 ha_cluster_hacluster_password 变量,因为它是一个必要的变量,但不存在于导出中。(可选)添加 ha_cluster_corosync_key_src,ha_cluster_pacemaker_key_src,ha_cluster_fence_virt_key_src, 和 ha_cluster_regenerate_keys 变量(如果您的系统需要它们)。这些变量永远不会导出。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

11.11. 使用 ha_cluster RHEL 系统角色配置实现访问控制列表(ACL)的高可用性集群

(RHEL 9.5 及更高版本)集群的 pcs 管理帐户是 hacluster。使用访问控制列表(ACL),您可以为除用户 hacluster 以外的特定本地用户授予权限来管理 Pacemaker 集群。此功能的常见用例是限制未经授权的用户访问业务敏感信息。

默认情况下不启用 ACL。因此,所有节点上的 haclient 组的任何成员都对集群 configuratioan 有完全的本地读写权限。不是 haclient 成员的用户没有访问权限。当启用 ACL 时,即使属于 haclient 组成员的用户也只能访问 ACL 为该用户授予的内容。roothacluster 用户帐户始终对集群配置有完全访问权限,即使当启用了 ACL 时。

当您为具有 ACL 的本地用户设置权限时,您可以创建一个为该角色定义权限的角色。然后,您将该角色分配给用户。如果您为同一用户分配了多个角色,则任何拒绝权限优先,然后是写,再然后是读。

以下示例流程使用 ha_cluster RHEL 系统角色,以自动方式创建一个集群,该集群实施 ACL ,来控制对配置的访问。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster with ACLs assigned
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
              ha_cluster_cluster_name: my-new-cluster
              ha_cluster_hacluster_password: "{{ cluster_password }}"
              ha_cluster_manage_firewall: true
              ha_cluster_manage_selinux: true
              # To use an ACL role permission reference, the reference must exist in CIB.
              ha_cluster_resource_primitives:
                - id: not-for-operator
                  agent: 'ocf:pacemaker:Dummy'
              # ACLs must be enabled (using the enable-acl cluster property) in order to be effective.
              ha_cluster_cluster_properties:
                - attrs:
                    - name: enable-acl
                      value: 'true'
              ha_cluster_acls:
                acl_roles:
                  - id: operator
                    description: HA cluster operator
                    permissions:
                      - kind: write
                        xpath: //crm_config//nvpair[@name='maintenance-mode']
                      - kind: deny
                        reference: not-for-operator
                  - id: administrator
                    permissions:
                      - kind: write
                        xpath: /cib
                acl_users:
                  - id: alice
                    roles:
                      - operator
                      - administrator
                  - id: bob
                    roles:
                      - administrator
                acl_groups:
                  - id: admins
                    roles:
                      - administrator
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_resource_primitives: <cluster resources>
    ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。
    ha_cluster_cluster_properties: <cluster properties>
    Pacemaker 集群范围配置的集群属性集合的列表。
    ha_cluster_acls: <dictionary>
    ACL 角色、用户和组值的字典。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.12. 使用 ha_cluster_node_options 变量配置具有 SBD 节点隔离的高可用性集群

您必须配置具有至少一个隔离设备的红帽高可用性集群,以确保当集群中的节点遇到问题时,集群提供的服务仍然可用。如果您的环境不允许远程访问电源开关来隔离集群节点,您可以使用 STONITH 块设备(SBD)配置隔离。此设备通过利用共享块存储交换消息,来为基于 Pacemaker 的集群提供节点隔离机制。SBD 与 Pacemaker 集成,一个 watchdog 设备,以及可选的共享存储,来在需要隔离时安排节点可靠地自行终止。

您可以使用 ha_cluster RHEL 系统角色,以自动的方式配置 SBD 隔离。使用 ha_cluster 时,您可以使用以下两个变量之一逐个节点地配置 watchdog 和 SBD 设备:

  • ha_cluster_node_options: (RHEL 9.5 及更高版本)这是您在 playbook 文件中定义的一个变量。它是字典的列表,其中每个字典为一个节点定义选项。
  • ha_cluster: (RHEL 9.1 及更高版本)一个只为一个节点定义选项的字典。您可以在清单文件中配置 ha_cluster 变量。要为每个节点设置不同的值,您可以分别为每个节点定义变量。

如果 ha_cluster_node_optionsha_cluster 变量都包含 SBD 选项,则 ha_cluster_node_options 中的选项具有优先权。

这个示例流程使用 playbook 文件中的 ha_cluster_node_options 变量来基于每个节点配置节点地址和 SBD 选项。有关在清单文件中使用 ha_cluster 变量的示例流程,请参阅 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster with SBD fencing
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
            my_sbd_devices:
              # This variable is indirectly used by various variables of the ha_cluster RHEL system role.
              # Its purpose is to define SBD devices once so they do not need
              # to be repeated several times in the role variables.
              - /dev/disk/by-id/000001
              - /dev/disk/by-id/000002
              - /dev/disk/by-id/000003
            ha_cluster_cluster_name: my-new-cluster
            ha_cluster_hacluster_password: "{{ cluster_password }}"
            ha_cluster_manage_firewall: true
            ha_cluster_manage_selinux: true
            ha_cluster_sbd_enabled: true
            ha_cluster_sbd_options:
              - name: delay-start
                value: 'no'
              - name: startmode
                value: always
              - name: timeout-action
                value: 'flush,reboot'
              - name: watchdog-timeout
                value: 30
            ha_cluster_node_options:
              - node_name: node1
                sbd_watchdog_modules:
                  - iTCO_wdt
                sbd_watchdog_modules_blocklist:
                  - ipmi_watchdog
                sbd_watchdog: /dev/watchdog1
                sbd_devices: "{{ my_sbd_devices }}"
              - node_name: node2
                sbd_watchdog_modules:
                  - iTCO_wdt
                sbd_watchdog_modules_blocklist:
                  - ipmi_watchdog
                sbd_watchdog: /dev/watchdog1
                sbd_devices: "{{ my_sbd_devices }}"
            # Best practice for setting SBD timeouts:
            # watchdog-timeout * 2 = msgwait-timeout (set automatically)
            # msgwait-timeout * 1.2 = stonith-timeout
            ha_cluster_cluster_properties:
              - attrs:
                  - name: stonith-timeout
                    value: 72
            ha_cluster_resource_primitives:
              - id: fence_sbd
                agent: 'stonith:fence_sbd'
                instance_attrs:
                  - attrs:
                      - name: devices
                        value: "{{ my_sbd_devices | join(',') }}"
                      - name: pcmk_delay_base
                        value: 30
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_sbd_enabled: true
    确定集群是否可以使用 SBD 节点隔离机制的变量。
    ha_cluster_sbd_options: <sbd options>
    指定 SBD 选项的名称-值字典的列表。有关这些选项的详情,请参考您系统上 sbd(8)手册页的 通过环境配置 部分。
    ha_cluster_node_options: <node options>

    定义因集群节点而异的设置的变量。您可以配置以下 SBD 和 watchdog 项目:

    • sbd_watchdog_modules - 要载入的模块,其创建 /dev/watchdog* 设备。
    • sbd_watchdog_modules_blocklist - 要卸载和阻止的 Watchdog 内核模块。
    • sbd_watchdog - SBD 使用的 Watchdog 设备。
    • sbd_devices - 用于交换 SBD 信息和监控的设备。总是使用长而稳定的设备名称(/dev/disk/by-id/)引用设备。
    ha_cluster_cluster_properties: <cluster properties>
    Pacemaker 集群范围配置的集群属性集合的列表。
    ha_cluster_resource_primitives: <cluster resources>
    ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.13. 使用 ha_cluster 变量配置具有 SBD 节点隔离的高可用性集群

您必须配置具有至少一个隔离设备的红帽高可用性集群,以确保当集群中的节点遇到问题时,集群提供的服务仍然可用。如果您的环境不允许远程访问电源开关来隔离集群节点,您可以使用 STONITH 块设备(SBD)配置隔离。此设备通过利用共享块存储交换消息,来为基于 Pacemaker 的集群提供节点隔离机制。SBD 与 Pacemaker 集成,一个 watchdog 设备,以及可选的共享存储,来在需要隔离时安排节点可靠地自行终止。

您可以使用 ha_cluster RHEL 系统角色,以自动的方式配置 SBD 隔离。使用 ha_cluster 时,您可以使用以下两个变量之一逐个节点地配置 watchdog 和 SBD 设备:

  • ha_cluster_node_options: (RHEL 9.5 及更高版本)这是您在 playbook 文件中定义的一个变量。它是字典的列表,其中每个字典为一个节点定义选项。
  • ha_cluster: (RHEL 9.1 及更高版本)一个只为一个节点定义选项的字典。您可以在清单文件中配置 ha_cluster 变量。要为每个节点设置不同的值,您可以分别为每个节点定义变量。

如果 ha_cluster_node_optionsha_cluster 变量都包含 SBD 选项,则 ha_cluster_node_options 中的选项具有优先权。

如果 ha_cluster_node_optionsha_cluster 变量都包含 SBD 选项,则 ha_cluster_node_options 中的选项具有优先权。

以下示例流程使用 ha_cluster 系统角色创建具有 SBD 隔离的高可用性集群。这个示例流程使用清单文件中的 ha_cluster 变量来基于每个节点配置节点地址和 SBD 选项。有关在 playbook 文件中使用 ha_cluster_node_options 变量的示例流程,请参阅 使用 ha_cluster_nodes_options 变量配置具有 SBD 节点隔离的高可用性集群

警告

ha_cluster 系统角色替换指定节点上任何现有的群集配置。playbook 中未指定的任何设置都将丢失。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 作为集群成员运行的系统必须拥有对 RHEL 和 RHEL 高可用性附加组件的有效订阅。

流程

  1. 为集群创建一个清单文件,该集群使用 ha_cluster 变量为每个节点配置 watchdog 和 SBD 设备,如下例中所示:

    all:
      hosts:
        node1:
          ha_cluster:
            sbd_watchdog_modules:
              - iTCO_wdt
            sbd_watchdog_modules_blocklist:
              - ipmi_watchdog
            sbd_watchdog: /dev/watchdog1
            sbd_devices:
              - /dev/disk/by-id/000001
              - /dev/disk/by-id/000001
              - /dev/disk/by-id/000003
        node2:
          ha_cluster:
            sbd_watchdog_modules:
              - iTCO_wdt
            sbd_watchdog_modules_blocklist:
              - ipmi_watchdog
            sbd_watchdog: /dev/watchdog1
            sbd_devices:
              - /dev/disk/by-id/000001
              - /dev/disk/by-id/000002
              - /dev/disk/by-id/000003
    Copy to Clipboard

    示例清单中指定的 SBD 和 watchdog 设置包括:

    sbd_watchdog_modules
    要载入的 watchdog 内核模块,其创建 /dev/watchdog* 设备。
    sbd_watchdog_modules_blocklist
    要卸载和阻止的 watchdog 内核模块。
    sbd_watchdog
    SBD 使用的 watchdog 设备。
    sbd_devices
    用于交换 SBD 消息和监控的设备。总是使用长而稳定的设备名称(/dev/disk/by-id/)引用设备。

    有关创建清单文件的常规信息,请参阅 在 RHEL 9 上准备一个控制节点

  2. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个 playbook 文件,例如 ~/playbook.yml,如下例所示。因为您已在清单中指定了 SBD 和 watchog 变量,因此您不需要在 playbook 中包含它们。

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster with sbd fencing devices configured in an inventory file
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
              ha_cluster_cluster_name: my-new-cluster
              ha_cluster_hacluster_password: "{{ cluster_password }}"
              ha_cluster_manage_firewall: true
              ha_cluster_manage_selinux: true
              ha_cluster_sbd_enabled: true
              ha_cluster_sbd_options:
                - name: delay-start
                  value: 'no'
                - name: startmode
                  value: always
                - name: timeout-action
                  value: 'flush,reboot'
                - name: watchdog-timeout
                  value: 30
              # Best practice for setting SBD timeouts:
              # watchdog-timeout * 2 = msgwait-timeout (set automatically)
              # msgwait-timeout * 1.2 = stonith-timeout
              ha_cluster_cluster_properties:
                - attrs:
                    - name: stonith-timeout
                      value: 72
              ha_cluster_resource_primitives:
                - id: fence_sbd
                  agent: 'stonith:fence_sbd'
                  instance_attrs:
                    - attrs:
                        # taken from host_vars
                        # this only works if all nodes have the same sbd_devices
                        - name: devices
                          value: "{{ ha_cluster.sbd_devices | join(',') }}"
                        - name: pcmk_delay_base
                          value: 30
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: cluster_name
    您要创建的集群的名称。
    ha_cluster_hacluster_password: password
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_sbd_enabled: true
    确定集群是否可以使用 SBD 节点隔离机制的变量。
    ha_cluster_sbd_options: sbd options
    指定 SBD 选项的名称-值字典的列表。有关这些选项的详情,请参考您系统上 sbd(8)手册页的 通过环境配置 部分。
    ha_cluster_cluster_properties: cluster properties
    Pacemaker 集群范围配置的集群属性集合的列表。
    ha_cluster_resource_primitives: cluster resources
    ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  4. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.14. 使用 RHEL ha_cluster RHEL 系统角色为高可用性集群配置放置策略

(RHEL 9.5 及更高版本) Pacemaker 集群根据资源分配分数分配资源。默认情况下,如果所有节点上的资源分配分数都相同,则 Pacemaker 会将资源分配给具有最少分配资源的节点。如果集群中的资源使用的节点容量(如内存或 I/O)的比例差异很大,则默认行为可能不是平衡系统工作负载的最佳策略。在这种情况下,您可以通过为节点和资源配置使用属性和放置策略来自定义分配策略。

有关配置使用属性和放置策略的详细信息,请参阅 配置节点放置策略

这个示例流程使用 ha_cluster RHEL 系统角色,以自动的方式创建高可用性集群,其配置使用属性来定义放置策略。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster with utilization attributes
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
              ha_cluster_cluster_name: my-new-cluster
              ha_cluster_hacluster_password: "{{ cluster_password }}"
              ha_cluster_manage_firewall: true
              ha_cluster_manage_selinux: true
              ha_cluster_cluster_properties:
                - attrs:
                    - name: placement-strategy
                      value: utilization
              ha_cluster_node_options:
                - node_name: node1
                  utilization:
                    - attrs:
                        - name: utilization1
                          value: 1
                        - name: utilization2
                          value: 2
                - node_name: node2
                  utilization:
                    - attrs:
                        - name: utilization1
                          value: 3
                        - name: utilization2
                          value: 4
              ha_cluster_resource_primitives:
                - id: resource1
                  agent: 'ocf:pacemaker:Dummy'
                  utilization:
                    - attrs:
                        - name: utilization1
                          value: 2
                        - name: utilization2
                          value: 3
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_cluster_properties: <cluster properties>
    Pacemaker 集群范围配置的集群属性集列表。要使利用率生效,必须设置 placement-strategy 属性,并且其值必须与值 default 不同。
    ha_cluster_node_options: <node options>
    定义因集群节点而异的不同设置的变量。
    ha_cluster_resource_primitives: <cluster resources>

    ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离资源。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.15. 使用 ha_cluster RHEL 系统角色为高可用性集群配置警报

(RHEL 9.5 及更高版本)当 Pacemaker 事件发生(如资源或节点故障或配置更改)时,您可能需要执行一些外部操作。例如,您可能想要发送一封电子邮件消息或记录到文件或更新监控系统。

您可以使用警报代理配置系统,来执行外部操作。这些是集群调用的外部程序,其方式与集群调用资源代理的方式相同,以处理资源配置和操作。集群通过环境变量将关于事件的信息传递给代理。

注意

ha_cluster RHEL 系统角色配置集群,以调用外部程序来处理警报。但是,您必须提供这些程序,并将它们分发到集群节点。

有关报警代理的详情,请参阅 为集群事件触发脚本

这个示例流程使用 ha_cluster RHEL 系统角色,以自动配置 Pacemaker 警报的方式创建高可用性集群。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Configure a cluster with alerts
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
              ha_cluster_cluster_name: my-new-cluster
              ha_cluster_hacluster_password: "{{ cluster_password }}"
              ha_cluster_manage_firewall: true
              ha_cluster_manage_selinux: true
              ha_cluster_alerts:
                - id: alert1
                  path: /alert1/path
                  description: Alert1 description
                  instance_attrs:
                    - attrs:
                        - name: alert_attr1_name
                          value: alert_attr1_value
                  meta_attrs:
                    - attrs:
                        - name: alert_meta_attr1_name
                          value: alert_meta_attr1_value
                  recipients:
                    - value: recipient_value
                      id: recipient1
                      description: Recipient1 description
                      instance_attrs:
                        - attrs:
                            - name: recipient_attr1_name
                              value: recipient_attr1_value
                      meta_attrs:
                        - attrs:
                            - name: recipient_meta_attr1_name
                              value: recipient_meta_attr1_value
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_alerts: <alert definitions>

    定义 Pacemaker 警报的变量。

    • id - 警报的 ID。
    • path - 警报代理可执行文件的路径。
    • description - 警报的描述信息。
    • instance_attrs - 警报实例属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。
    • meta_attrs - 警报元属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。
    • recipients - 警报接收者的列表。
    • value - 接收者的值。
    • id - 接收者的 ID。
    • description - 接收者的描述。
    • instance_attrs - 接收者实例属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。
    • meta_attrs - 接收者元属性集合的列表。目前,只支持一个集合,因此第一个集合被使用,其余集合被忽略。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

11.16. 使用仲裁设备配置高可用性集群

(RHEL 9.2 及更高版本),当配置单独的仲裁设备时,集群可以保持比标准仲裁规则允许的多的节点故障。仲裁设备充当集群的轻量级仲裁设备。对于偶数节点的集群,建议使用仲裁设备。对于双节点集群,使用仲裁设备可以更好地决定在脑裂情况下保留哪些节点。

有关仲裁设备的详情,请参考 配置仲裁设备

要使用 ha_cluster RHEL 系统角色配置具有单独仲裁设备的高可用性集群,首先要设置仲裁设备。设置仲裁设备后,您可以在任意数量的集群中使用该设备。

11.16.1. 配置仲裁设备

要使用 ha_cluster RHEL 系统角色配置仲裁设备,请按照本例流程中的步骤操作。请注意,您不能在集群节点上运行仲裁设备。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_present: false
    如果设为 false,则变量决定所有集群配置都将从目标主机中删除。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_qnetd: <quorum_device_options>
    配置 qnetd 主机的变量。
  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-qdevice.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook-qdevice.yml
    Copy to Clipboard

11.16.2. 配置一个集群以使用仲裁设备

要将集群配置为使用仲裁设备,请按照示例流程中的步骤操作。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_quorum: <quorum_parameters>
    配置集群仲裁的变量,您可以用来指定集群使用仲裁设备。
  2. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook-cluster-qdevice.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook-cluster-qdevice.yml
    Copy to Clipboard

11.17. 配置具有节点属性的高可用性集群

(RHEL 9.4 及更高版本),您可以使用 Pacemaker 规则使您的配置更动态。例如,您可以使用节点属性根据时间将机器分配给不同的处理组,然后在创建位置约束时使用该属性。

节点属性表达式用于根据节点或节点定义的属性控制资源。有关节点属性的详情,请参考 使用规则确定资源位置

以下示例流程使用 ha_cluster RHEL 系统角色创建配置节点属性的高可用性集群。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Create a high availability cluster
      hosts: node1 node2
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Create a cluster that defines node attributes
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ha_cluster
          vars:
            ha_cluster_cluster_name: my-new-cluster
            ha_cluster_hacluster_password: "{{ cluster_password }}"
            ha_cluster_manage_firewall: true
            ha_cluster_manage_selinux: true
            ha_cluster_node_options:
              - node_name: node1
                attributes:
                  - attrs:
                      - name: attribute1
                        value: value1A
                      - name: attribute2
                        value: value2A
              - node_name: node2
                attributes:
                  - attrs:
                      - name: attribute1
                        value: value1B
                      - name: attribute2
                        value: value2B
    Copy to Clipboard
    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_node_options: <node_settings>
    定义因集群节点而异的各种设置的变量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    其他资源

11.18. 使用 ha_cluster RHEL 系统角色在高可用性集群中配置一个 Apache HTTP 服务器

高可用性型机器通过消除单点失效以及在一个节点停止运作时将服务从一个群集节点切换到另外一个节点来提供高可用性服务。红帽提供了各种用于规划、配置和维护红帽高可用性集群的文档。有关向 Red Hat 集群文档的不同区域提供索引的文章的列表,请参阅 红帽高可用性附加组件文档指南

以下示例用例使用 ha_cluster RHEL 系统角色在双节点 Red Hat Enterprise Linux High Availability Add-On 集群中配置主动/被动 Apache HTTP 服务器。在这种情况下,客户端通过浮动 IP 地址访问 Apache HTTP 服务器。Web 服务器在集群的两个节点之一中运行。如果运行 web 服务器的节点出现问题,则 web 服务器会在集群的第二个节点上再次启动,以实现服务中断的最小化。

这个示例使用主机名为 zapc.example.com 的 APC 电源开关。如果集群不使用任何其他隔离代理,则您可以选择在定义 ha_cluster_fence_agent_packages 变量时只列出集群所需的隔离代理。

警告

ha_cluster RHEL 系统角色替换指定节点上任何现有的集群配置。playbook 中未指定的任何设置都将丢失。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ha_cluster_cluster_name: <cluster_name>
    您要创建的集群的名称。
    ha_cluster_hacluster_password: < password>
    hacluster 用户的密码。hacluster 用户对集群具有完全访问权限。
    ha_cluster_manage_firewall: true
    确定 ha_cluster RHEL 系统角色是否管理防火墙的变量。
    ha_cluster_manage_selinux: true
    确定 ha_cluster RHEL 系统角色是否使用 selinux RHEL 系统角色管理防火墙高可用性服务的端口的变量。
    ha_cluster_fence_agent_packages: <fence_agent_packages>
    要安装的隔离代理软件包的列表。
    ha_cluster_resource_primitives: <cluster_resources>
    由 ha_cluster RHEL 系统角色配置的 Pacemaker 资源的资源定义的列表,包括隔离
    ha_cluster_resource_groups: <resource_groups>
    ha_cluster RHEL 系统角色配置的资源组定义的列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ha_cluster/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard
  5. 当您使用 apache 资源代理来管理 Apache 时,它不会使用 systemd。因此,您必须编辑 Apache 提供的 logrotate 脚本,使其不使用 systemctl 重新加载 Apache。

    在集群中的每个节点上删除 /etc/logrotate.d/httpd 文件中的以下行:

    # /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    Copy to Clipboard

    使用以下三行替换您删除的行,将 /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
    Copy to Clipboard

验证

  1. 从集群中的一个节点检查集群的状态。请注意,所有四个资源都运行在同一个节点上,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
    Copy to Clipboard
  2. 集群启动并运行后,您可以将浏览器指向定义为 IPaddr2 资源的 IP 地址,来查看示例显示,包含简单的单词"Hello"。

    Hello
    Copy to Clipboard
  3. 要测试运行在 z1.example.com 上的资源组是否可以切换到节点 z2.example.com,请将节点 z1.example.com 置于 待机 模式,之后该节点将不能再托管资源。

    [root@z1 ~]# pcs node standby z1.example.com
    Copy to Clipboard
  4. 将节点 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
    Copy to Clipboard

    定义的 IP 地址的网页仍会显示,而不中断。

  5. 要从 待机 模式中删除 z1,请输入以下命令。

    [root@z1 ~]# pcs node unstandby z1.example.com
    Copy to Clipboard
    注意

    待机 模式中删除节点本身不会导致资源切换到该节点。这将依赖于资源的 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 系统角色在多个系统上一致地配置持久性日志记录。

先决条件

流程

  1. 创建一个包含以下内容的 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>
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 13 章 使用 RHEL 系统角色配置自动崩溃转储

要使用 Ansible 管理 kdump,您可以使用 kdump 角色,这是 RHEL 9 中提供的 RHEL 系统角色之一。

使用 kdump 角色可让您指定保存系统内存内容的位置,以便稍后进行分析。

13.1. 使用 kdump RHEL 系统角色配置内核崩溃转储机制

内核崩溃转储是诊断和故障排除系统问题的关键功能。当您的系统遇到内核 panic 或其他关键故障时,崩溃内核转储允许您在失败时捕获内核状态的内存转储(内核转储)。

通过使用 Ansible playbook,您可以使用 kdump RHEL 系统角色在多个系统上设置内核崩溃转储参数。这确保在所有受管节点上 kdump 服务的一致设置。

警告

kdump 系统角色替换了 /etc/kdump.conf/etc/sysconfig/kdump 配置文件中的内容。之前的设置变为角色变量中指定的变量,如果它们没有在角色变量中指定,则会丢失。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证内核崩溃转储参数:

    $ ansible managed-node-01.example.com -m command -a 'grep crashkernel /proc/cmdline'
    Copy to Clipboard

第 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 系统角色在多个受管操作系统上远程配置具有持久性效果的各种内核参数。例如,您可以配置:

  • 透明巨页,以通过减少管理较小页的开销来提高性能。
  • 通过带有回环接口的网络传输的最大数据包大小。
  • 对要同时打开的文件的限制。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  1. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  2. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证受影响的内核参数:

    # ansible managed-node-01.example.com -m command -a 'sysctl fs.file-max kernel.threads-max net.ipv6.conf.lo.mtu'
    # ansible managed-node-01.example.com -m command -a 'cat /sys/kernel/mm/transparent_hugepage/enabled'
    Copy to Clipboard

第 15 章 使用 RHEL 系统角色配置日志记录

您可以使用 logging RHEL 系统角色,以自动的方式将本地和远程主机配置为记录服务器,以便从多个客户端系统收集日志。

日志记录解决方案提供多种读取日志和多个日志记录输出的方法。

例如,日志记录系统可接受以下输入:

  • 本地文件
  • systemd/journal
  • 网络上的另一个日志记录系统

另外,日志记录系统还可有以下输出:

  • 存储在 /var/log/ 目录中本地文件中的日志
  • 发送到 Elasticsearch 引擎的日志
  • 日志被转发到另一个日志系统

使用 logging RHEL 系统角色,您可以组合输入和输出,以适应您的场景。例如,您可以配置一个日志解决方案,将来自 日志 的输入存储在本地文件中,而从文件读取的输入则被转发到另一个日志系统,并存储在本地日志文件中。

15.1. 使用 logging RHEL 系统角色过滤本地日志消息

您可以使用 logging RHEL 系统角色的基于属性的过滤器根据各种条件过滤本地日志消息。因此,您可以实现,例如:

  • 日志清晰度:在高流量环境中,日志可能会快速增长。专注于特定消息(如错误)有助于更快地识别问题。
  • 优化的系统性能:过多的日志通常与系统性能下降有关。仅针对重要事件选择的日志可以防止资源耗尽,这样可让您的系统更有效地运行。
  • 增强了安全性:通过安全消息,如系统错误和失败的登录进行高效过滤,有助于只捕获相关的日志。这对于检测违规行为和满足合规标准非常重要。

先决条件

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 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_inputslogging_outputs 之间的关系。inputs: [files_input] 选项指定一个开始处理日志的输入列表。outputs: [files_output0, files_output1] 选项指定一个日志发送到的输出列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.logging/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 在受管节点上,测试 /etc/rsyslog.conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-6.el8, config validation run...
    rsyslogd: End of config validation run. Bye.
    Copy to Clipboard
  2. 在受管节点上,验证系统是否向日志发送了包含 error 字符串的信息:

    1. 发送测试信息:

      # logger error
      Copy to Clipboard
    2. 查看 /var/log/errors.log 日志,例如:

      # cat /var/log/errors.log
      Aug  5 13:48:31 hostname root[6778]: error
      Copy to Clipboard

      其中 hostname 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为 root

15.2. 使用 logging RHEL 系统角色应用一个远程日志解决方案

您可以使用 logging RHEL 系统角色配置远程日志解决方案,其中一个或多个客户端从 systemd-journal 服务获取日志,并将其转发到远程服务器。服务器从 remote_rsyslogremote_files 配置接收远程输入,并将日志输出到远程主机名命名的目录中的本地文件中。

因此,您可以涵盖您需要的用例,例如:

  • 集中式日志管理:从单一存储点收集、访问和管理多台机器的日志消息,简化了日常监控和故障排除任务。而且,此用例还减少了登录到各个机器来检查日志消息的需要。
  • 增强了安全性:将日志消息存储在一个中心位置可增加它们处于安全且防止篡改的环境中的机会。这样的环境可以更轻松地检测和高效地响应安全事件,并满足审计要求。
  • 提高了日志分析的效率:关联来自多个系统的日志消息对于快速故障排除跨多个机器或服务的复杂问题非常重要。这样,您可以快速分析,并交叉引用来自不同来源的事件。

先决条件

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 playbook 中第一部分中指定的设置包括:

    logging_inputs
    定义日志输入字典的列表。type: remote 选项涵盖通过网络的来自其他日志记录系统的远程输入。udp_ports: [ 601 ] 选项定义要监控的 UDP 端口号的列表。tcp_ports: [ 601 ] 选项定义要监控的 TCP 端口号的列表。如果设置了 udp_portstcp_ports,则使用 udp_portstcp_ports 被丢弃。
    logging_outputs
    定义日志输出字典的列表。type: remote_files 选项使输出将日志存储到每个远程主机的本地文件中,并且程序名称产生日志。
    logging_flows
    定义记录流字典的列表,以指定 logging_inputslogging_outputs 之间的关系。inputs: [remote_udp_input, remote_tcp_input] 选项指定从其开始处理日志的输入的列表。outputs: [remote_files_output] 选项指定日志发送到的输出的列表。

    示例 playbook 的第二部分中指定的设置包括:

    logging_inputs
    定义日志输入字典的列表。type: basics 选项涵盖了来自 systemd 日志或 Unix 套接字的输入。
    logging_outputs
    定义日志输出字典的列表。type: forwards 选项支持通过网络向远程日志服务器发送日志。severity: info 选项指的是具有信息重要性的日志消息。facility: mail 选项指的是生成日志消息的系统程序的类型。target: <host1.example.com> 选项指定远程日志服务器的主机名。udp_port: 601/tcp_port: 601 选项定义远程日志服务器侦听的 UDP/TCP 端口。
    logging_flows
    定义记录流字典的列表,以指定 logging_inputslogging_outputs 之间的关系。inputs: [basic_input] 选项指定从其开始处理日志的输入的列表。outputs: [forward_output0, forward_output1] 选项指定日志发送到的输出的列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.logging/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 在客户端和服务器系统上测试 /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.
    Copy to Clipboard
  2. 验证客户端系统向服务器发送信息:

    1. 在客户端系统中发送测试信息:

      # logger test
      Copy to Clipboard
    2. 在服务器系统上,查看 /var/log/<host2.example.com>/messages 日志,例如:

      # cat /var/log/<host2.example.com>/messages
      Aug  5 13:48:31 <host2.example.com> root[6778]: test
      Copy to Clipboard

      其中 <host2.example.com> 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为 root

15.3. 使用带有 TLS 的 logging RHEL 系统角色

传输层安全性(TLS)是一种加密协议,旨在允许通过计算机网络的安全通信。

您可以使用 logging RHEL 系统角色配置日志消息的安全传输,其中一个或多个客户端从 systemd-journal 服务获取日志,并在使用 TLS 时将它们传送到远程服务器。

通常,在通过不可信或公共网络(如互联网)发送敏感数据时,远程日志记录解决方案中使用用于传输日志的 TLS 。另外,通过在 TLS 中使用证书,您可以确保客户端将日志转发到正确的可信服务器。这可以防止诸如"中间人"这样的攻击。

15.3.1. 配置带有 TLS 的客户端日志

您可以使用 logging RHEL 系统角色在 RHEL 客户端上配置日志,并使用 TLS 加密将日志传送到远程日志系统。

此流程创建一个私钥和一个证书。接下来,它会在 Ansible 清单中的 clients 组中的所有主机上配置 TLS。TLS 对信息的传输进行加密,确保日志在网络安全传输。

注意

您不必在 playbook 中调用 certificate RHEL 系统角色来创建证书。当设置了 logging_certificates 变量时,logging RHEL 系统角色会自动调用它。

要让 CA 能够为创建的证书签名,受管节点必须在 IdM 域中注册。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 受管节点已在 IdM 域中注册。
  • 如果要在管理节点上配置的日志服务器运行 RHEL 9.2 或更高版本,且启用了 FIPS 模式,客户端必须支持扩展 Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 强制执行的 TLS 扩展"扩展的主 Secret "。

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    logging_certificates
    此参数的值传递给 certificate RHEL 系统角色中的 certificate_requests,并用来创建一个私钥和证书。
    logging_pki_files

    使用这个参数,您可以配置日志记录用来查找用于 TLS 的 CA、证书和密钥文件的路径和其他设置,使用以下一个或多个子参数指定:ca_certca_cert_srccertcert_srcprivate_keyprivate_key_srctls

    注意

    如果您使用 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.logging/README.md 文件
  • /usr/share/doc/rhel-system-roles/logging/ 目录
  • /usr/share/ansible/roles/rhel-system-roles.certificate/README.md 文件
  • /usr/share/doc/rhel-system-roles/certificate/ 目录
  • 使用 RHEL 系统角色请求证书
  • rsyslog.conf (5)syslog (3) 手册页

15.3.2. 配置带有 TLS 的服务器日志

您可以使用 logging RHEL 系统角色在 RHEL 服务器上配置日志,并将它们设置为从使用 TLS 加密的远程日志系统接收日志。

此流程创建一个私钥和一个证书。接下来,它会在 Ansible 清单中 server 组中的所有主机上配置 TLS。

注意

您不必在 playbook 中调用 certificate RHEL 系统角色来创建证书。logging RHEL 系统角色会自动调用它。

要让 CA 能够为创建的证书签名,受管节点必须在 IdM 域中注册。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 受管节点已在 IdM 域中注册。
  • 如果要在管理节点上配置的日志服务器运行 RHEL 9.2 或更高版本,且启用了 FIPS 模式,客户端必须支持扩展 Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 强制执行的 TLS 扩展"扩展的主 Secret "。

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    logging_certificates
    此参数的值传递给 certificate RHEL 系统角色中的 certificate_requests,并用来创建一个私钥和证书。
    logging_pki_files

    使用这个参数,您可以配置日志记录用来查找用于 TLS 的 CA、证书和密钥文件的路径和其他设置,使用以下一个或多个子参数指定:ca_certca_cert_srccertcert_srcprivate_keyprivate_key_srctls

    注意

    如果您使用 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

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)来加密消息传输,保证日志在网络上安全传输。

先决条件

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    target
    这是一个必需的参数,用于指定运行远程日志系统的主机名。
    port
    远程日志记录系统正在监听的端口号。
    tls

    确保日志在网络上安全地传输。如果您不想要安全打包程序,可以将 tls 变量设置为 false。在与 RELP 工作时,默认的 tls 参数被设置为 true,且需要密钥/证书和 triplets {ca_certcertprivate_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
    接受身份验证模式为 namefingerprint
    permitted_servers
    日志客户端允许通过 TLS 连接和发送日志的服务器列表。
    输入
    日志输入字典列表。
    输出
    日志输出字典列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.logging/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

15.4.2. 配置带有 RELP 的服务器日志

您可以使用 logging RHEL 系统角色配置服务器,以便从带有 RELP 的远程日志记录系统接收日志信息。

此流程对 Ansible 清单中 服务器 组中的所有主机配置 RELP。RELP 配置使用 TLS 加密消息传输,以保证在网络上安全地传输日志。

先决条件

流程

  1. 创建一个包含以下内容的 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]
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    port
    远程日志记录系统正在监听的端口号。
    tls

    确保日志在网络上安全地传输。如果您不想要安全打包程序,可以将 tls 变量设置为 false。在与 RELP 工作时,默认的 tls 参数被设置为 true,且需要密钥/证书和 triplets {ca_certcertprivate_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
    接受身份验证模式为 namefingerprint
    permitted_clients
    日志记录服务器允许通过 TLS 连接和发送日志的客户端列表。
    输入
    日志输入字典列表。
    输出
    日志输出字典列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.logging/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 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 来记录指标。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    metrics_retention_days: <number>
    设置多少天后 pmlogger_daily systemd 计时器删除旧的 PCP 归档。
    metrics_manage_firewall: <true|false>
    定义角色是否应该在 firewalld 服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为 true

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.metrics/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询指标,例如:

    # ansible managed-node-01.example.com -m command -a 'pminfo -f kernel.all.load'
    Copy to Clipboard

16.2. 使用 metrics RHEL 系统角色,配置带有身份验证的 Performance Co-Pilot

您可以在 Performance Co-Pilot (PCP)中启用身份验证,以便 pmcd 服务和性能指标域代理(PDMA)可以决定是否允许运行监控工具的用户执行操作。已验证身份的用户有可以访问带有敏感信息的指标的权限。另外,某些代理需要身份验证。例如,bpftrace 代理使用身份验证来识别是否允许用户将 bpftrace 脚本加载到内核中来生成指标。

通过使用 metrics RHEL 系统角色,您可以在多个主机上远程配置带有身份验证的 PCP 。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      metrics_usr: <username>
      metrics_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    metrics_retention_days: <number>
    设置多少天后 pmlogger_daily systemd 计时器删除旧的 PCP 归档。
    metrics_manage_firewall: <true|false>
    定义角色是否应该在 firewalld 服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为 true
    metrics_username: <username>
    角色在受管节点本地创建此用户,将凭据添加到 /etc/pcp/passwd.db Simple Authentication and Security Layer(SASL)数据库中,并在 PCP 中配置身份验证。另外,如果您在 playbook 中设置了 metrics_from_bpftrace: true,则 PCP 使用此帐户注册 bpftrace 脚本。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.metrics/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 在安装了 pcp 软件包的主机上,查询需要身份验证的指标:

    1. 使用您在 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
      Copy to Clipboard

      如果命令成功,它会返回 proc.fd.count 指标的值。

    2. 再次运行该命令,但省略用户名,以验证命令是否对未经身份验证的用户失败:

      # pminfo -fmdt -h pcp://managed-node-01.example.com proc.fd.count
      
      proc.fd.count
      Error: No permission to perform requested operation
      Copy to Clipboard

16.3. 使用 metrics RHEL 系统角色设置 Grafana,以监控具有 Performance Co-Pilot 的多个主机

如果您已在多个主机上配置了 Performance Co-Pilot (PCP),您可以使用 Grafana 的一个实例来视觉化这些主机的指标。您可以显示实时数据,如果 PCP 数据存储在 Redis 数据库中,也可以显示过去的数据。

通过使用 metrics RHEL 系统角色,您可以自动化设置 Grafana、PCP 插件、可选 Redis 数据库以及配置数据源的过程。

注意

如果您使用 metrics 角色在主机上安装 Grafana,则角色也会在这个主机上安装 PCP。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      grafana_admin_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    metrics_graph_service: true
    安装 Grafana 和 PCP 插件。另外,该角色在 Grafana 中添加了 PCP VectorPCP RedisPCP 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 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  1. 在您的浏览器中打开 http://<grafana_server_IP_or_hostname>:3000,并使用您在流程中设置的密码,以 admin 用户身份登录。
  2. 显示监控数据:

    • 要显示实时数据:

      1. MenuAppsPerformance Co-PilotPCP Vector Checklist
      2. 默认情况下,图形显示运行 Grafana 的主机的指标。要切换到其他主机,请在 hostspec 字段中输入主机名,然后按 Enter 键。
    • 要显示存储在 Redis 数据库中的历史数据:创建一个带有 PCP Redis 数据源的面板。这要求您在 playbook 中设置 metrics_query_service: true

16.4. 使用 metrics RHEL 系统角色在 Performance Co-Pilot 中配置 web hook

Performance Co-Pilot (PCP)套件包含性能指标推理引擎(PMIE)服务。此服务实时评估性能规则。例如,您可以使用默认规则来检测过量的交换活动。

您可以将主机配置为一个从多个 PCP 节点收集监控数据的中央 PCP 管理站点。如果规则匹配,此中央主机会向 Web hook 发送一个通知,以通知其他服务。例如,web hook 可以触发事件驱动的 Ansible 在导致事件的主机上的 Ansible Automation Platform 模板或 playbook 上运行。

通过使用 metrics RHEL 系统角色,您可以自动化配置通知 web hook 的中央 PCP 管理主机。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Monitoring performance metrics
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure PMIE web hooks
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.metrics
          vars:
            metrics_manage_firewall: true
            metrics_retention_days: 7
            metrics_monitored_hosts:
              - pcp-node-01.example.com
              - pcp-node-02.example.com
            metrics_webhook_endpoint: "https://<webserver>:<port>/<endpoint>"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    metrics_retention_days: <number>
    设置多少天后 pmlogger_daily systemd 计时器删除旧的 PCP 归档。
    metrics_manage_firewall: <true|false>
    定义角色是否应该在 firewalld 服务中打开所需的端口。如果要远程访问受管节点上的 PCP,请将此变量设置为 true
    metrics_monitored_hosts: <list_of_hosts>
    指定要观察的主机。
    metrics_webhook_endpoint: <URL>
    设置性能指标推理引擎(PMIE)向其发送有关检测到的性能问题的通知的 web hook 端点。默认情况下,这些问题只记录到本地系统。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.metrics/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 检查关于 managed-node-node-01.example.com 的配置概述:

    # ansible managed-node-01.example.com -m command -a 'pcp summary'
    Performance Co-Pilot configuration on managed-node-01.example.com:
    
     platform: Linux managed-node-node-01.example.com 5.14.0-427.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Feb 23 01:51:18 EST 2024 x86_64
     hardware: 8 cpus, 1 disk, 1 node, 1773MB RAM
     timezone: CEST-2
     services: pmcd pmproxy
     pmcd: Version 6.2.0-1, 12 agents, 6 clients
     pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2
           dm openmetrics
     pmlogger: primary logger: /var/log/pcp/pmlogger/managed-node-node-01.example.com/20240510.16.25
               pcp-node-01.example.com: /var/log/pmlogger/pcp-node-01.example.com/20240510.16.25
               pcp-node-02.example.com: /var/log/pmlogger/pcp-node-02.example.com/20240510.16.25
     pmie: primary engine: /var/log/pcp/pmie/managed-node-node-01.example.com/pmie.log
           pcp-node-01.example.com: : /var/log/pcp/pmie/pcp-node-01.example.com/pmie.log
           pcp-node-02.example.com: : /var/log/pcp/pmie/pcp-node-02.example.com/pmie.log
    Copy to Clipboard

    最后三行确认是否 PMIE 被配置为监控三个系统。

第 17 章 使用 RHEL 系统角色配置 NBDE

您可以使用 nbde_clientnbde_server RHEL 系统角色,使用 Clevis 和 Tang 自动部署基于策略的解密(PBD)解决方案。rhel-system-roles 包中包含了这些系统角色、相关的例子以及参考文档。

17.1. 使用 nbde_server RHEL 系统角色设置多个 Tang 服务器

通过使用 nbde_server 系统角色,您可以部署和管理 Tang 服务器,来作为自动化磁盘加密解决方案的一部分。此角色支持以下功能:

  • 轮转 Tang 密钥
  • 部署和备份 Tang 密钥

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    此示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 在您的 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
    Copy to Clipboard

17.2. 使用 nbde_client RHEL 系统角色,使用 DHCP 设置 Clevis 客户端

nbde_client 系统角色使您能够以自动化的方式部署多个Clevis客户端。

此角色支持将 LUKS 加密的卷绑定到一个或多个网络绑定(NBDE)服务器 - Tang 服务器。您可以使用密码短语保留现有的卷加密,或者将其删除。删除密码短语后,您只能使用 NBDE 解锁卷。当卷最初是使用在置备系统后会删除的临时密钥或密码进行加密时,这非常有用,

如果您同时提供密语和密钥文件,角色将使用您首先提供的那一个。如果找不到任何有效密语或密码,它将尝试从现有的绑定中检索密码短语。

基于策略的解密(PBD)定义一个绑定,来作为设备到插槽的映射。这意味着对同一个设备你可以有多个绑定。默认插槽是插槽 1。

注意

nbde_client 系统角色只支持 Tang 绑定。因此,您无法将其用于 TPM2 绑定。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 已使用 LUKS 加密的卷。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    这个示例 playbook 配置 Clevis 客户端,以便在两个 Tang 服务器中至少有一个可用时自动解锁两个 LUKS 加密的卷。

    示例 playbook 中指定的设置包括以下内容:

    state: present
    state 的值表示运行 playbook 后的配置。使用 present 值来创建新绑定或更新现有绑定。与 clevis luks bind 命令不同,您可以使用 state: present 来覆盖其设备插槽中的现有绑定。absent 的值会删除指定的绑定。
    nbde_client_early_boot: true

    nbde_client 角色确保 Tang pin 的网络默认在早期引导时可用。如果您需要禁用此功能,请在 playbook 中添加 nbde_client_early_boot: false 变量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 在 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/>"}'
    Copy to Clipboard
  2. 如果不使用 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
    …
    Copy to Clipboard

17.3. 使用 nbde_client RHEL 系统角色设置静态 IP Clevis 客户端

nbde_client RHEL 系统角色只支持使用动态主机配置协议(DHCP)的情况。在带有静态 IP 配置的 NBDE 客户端上,您必须将网络配置作为内核引导参数传递。

通常,管理员希望重复使用 playbook,且不是为 Ansible 在早期引导过程中为其分配静态 IP 地址的每个主机维护单独的 playbook。在这种情况下,您可以在 playbook 中使用变量,并在外部文件中提供设置。因此,您只需要一个 playbook 和一个带有设置的文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 已使用 LUKS 加密的卷。

流程

  1. 使用您主机的网络设置创建一个文件,如 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
    Copy to Clipboard
  2. 创建一个包含以下内容的 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"
    Copy to Clipboard

    此 playbook 为 ~/static-ip-settings-clients.yml 文件中列出的每个主机动态读取某些值。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 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 配置网络。

流程

  1. 编辑 ~/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
    Copy to Clipboard
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    此 playbook 从清单文件中为每个主机动态读取某些值,并将 playbook 中的静态值用于所有主机的相同的设置。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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"
                ]
            },
    ...
    Copy to Clipboard

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= 命令显示设备路径。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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"
                ]
            },
    ...
    Copy to Clipboard

18.3. 使用 network RHEL 系统角色和接口名称,配置具有动态 IP 地址的以太网连接

要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置一个以太网连接,其从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。使用此角色,您可以将连接配置文件分配给指定的接口名称。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 服务器配置中存在物理或者虚拟以太网设备。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管节点使用 NetworkManager 服务配置网络。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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"
                ]
            },
    ...
    Copy to Clipboard

18.4. 使用 network RHEL 系统角色和设备路径,配置具有动态 IP 地址的以太网连接

要将 Red Hat Enterprise Linux 主机连接到以太网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置一个以太网连接,其从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。角色可以根据设备的路径而不是接口名称,将连接配置文件分配给设备。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管主机使用 NetworkManager 配置网络。
  • 您知道设备的路径。您可以使用 udevadm info /sys/class/net/<device_name> | grep ID_PATH= 命令显示设备路径。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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"
                ]
            },
    ...
    Copy to Clipboard

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 文件中。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ieee802_1x
    此变量包含与 802.1X 相关的设置。
    eap: tls
    将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的 TLS 身份验证方法。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 访问需要网络身份验证的网络上的资源。

18.6. 使用 network RHEL 系统角色配置一个具有 802.1X 网络身份验证的 wifi 连接

网络访问控制(NAC)保护网络免受未授权客户端的访问。您可以指定 NetworkManager 连接配置文件中身份验证所需的详情,以使客户端能够访问网络。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 您已在受管节点上安装了 wpa_supplicant 软件包。
  • DHCP 位于受管节点的网络中。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • CA 证书存储在 /srv/data/ca.crt 文件中。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure a wifi connection with 802.1X authentication
      hosts: managed-node-01.example.com
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Wifi connection profile with dynamic IP address settings and 802.1X
          ansible.builtin.import_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Wifi connection profile with dynamic IP address settings and 802.1X
                interface_name: wlp1s0
                state: up
                type: wireless
                autoconnect: yes
                ip:
                  dhcp4: true
                  auto6: true
                wireless:
                  ssid: "Example-wifi"
                  key_mgmt: "wpa-eap"
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/client.key"
                  private_key_password: "{{ pwd }}"
                  private_key_password_flags: none
                  client_cert: "/etc/pki/tls/client.pem"
                  ca_cert: "/etc/pki/tls/cacert.pem"
                  domain_suffix_match: "example.com"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    ieee802_1x
    此变量包含与 802.1X 相关的设置。
    eap: tls
    将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的 TLS 身份验证方法。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

18.7. 使用 network RHEL 系统角色配置网络绑定

您可以将网络接口组合在一个绑定中,以提供具有高吞吐量或冗余的逻辑接口。要配置绑定,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置网络绑定,如果绑定的父设备的连接配置文件不存在,角色也可以创建它。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 从其中一个网络设备中临时拔掉网线,并检查绑定中的其他设备是否在处理流量。

    请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如 nmcli ),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。

18.8. 使用 network RHEL 系统角色配置 VLAN 标记

如果您的网络使用 Virtual Local Area Networks (VLAN)将网络流量分离到逻辑网络中,请创建一个 NetworkManager 连接配置文件来配置 VLAN 标记。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置 VLAN 标记,如果 VLAN 的父设备的连接配置文件不存在,角色也可以创建它。

注意

如果 VLAN 设备需要 IP 地址、默认网关和 DNS 设置,请在 VLAN 设备上,而不是在父设备上配置它们。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证 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
        ...
    Copy to Clipboard

18.9. 使用 network RHEL 系统角色配置网桥

您可以通过创建网桥,在 Open Systems Interconnection (OSI)模型的第 2 层上连接多个网络。要配置网桥,请在 NetworkManager 中创建一个连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置网桥,如果网桥的父设备的连接配置文件不存在,角色也可以创建它。

注意

如果要为网桥分配 IP 地址、网关和 DNS 设置,请在网桥上而不是在其端口上配置它们。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 显示作为特定网桥端口的以太网设备的链接状态:

    # ansible managed-node-01.example.com -m command -a 'ip link show master bridge0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
    Copy to Clipboard
  2. 显示作为任意网桥设备的端口的以太网设备状态:

    # ansible managed-node-01.example.com -m command -a 'bridge link show'
    managed-node-01.example.com | CHANGED | rc=0 >>
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    Copy to Clipboard

18.10. 使用 network RHEL 系统角色在现有连接上设置默认网关

如果无法通过直接连接的网络或通过主机上配置的任何路由到达数据包的目的地,则主机会将网络数据包转发到其默认网关。要配置主机的默认网关,请在连接到与默认网关相同网络的接口的 NetworkManager 连接配置文件中设置它。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以在之前创建的连接上设置或更新默认网关设置。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色可确保连接配置文件与 playbook 中的设置完全匹配。如果存在同名的连接配置文件,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置成其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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",
    	    ...
    	}
    ...
    Copy to Clipboard

18.11. 使用 network RHEL 系统角色配置一个静态路由

静态路由确保您可以将流量发送到无法通过默认网关到达的目标。您可以在连接到与下一跳相同的网络的接口的 NetworkManager 连接配置文件中配置静态路由。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色可确保连接配置文件与 playbook 中的设置完全匹配。如果存在同名的连接配置文件,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置成其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 显示 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
    Copy to Clipboard
  2. 显示 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
    Copy to Clipboard

18.12. 使用 network RHEL 系统角色将特定子网的流量路由到不同的默认网关

您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到提供者 B。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置连接配置文件,包括路由表和规则。

此流程假设以下网络拓扑:

policy based routing

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 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 网络接口。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    table: <value>
    将与 table 变量相同的列表条目中的路由分配给指定的路由表。
    routing_rule: <list>
    定义指定路由规则的优先级,以及从连接配置文件到规则分配给哪个路由表的优先级。
    zone: <zone_name>
    将网络接口从一个连接配置文件分配给指定的 firewalld 区域。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard
    2. 使用 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
       ...
      Copy to Clipboard

      命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard
    2. 使用 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
       ...
      Copy to Clipboard

      命令的输出显示路由器通过 198.51.100.2 ,即供应商 A 的网络来发送数据包。

  3. 在使用 RHEL 系统角色配置的 RHEL 路由器上:

    1. 显示规则列表:

      # ip rule list
      0:      from all lookup local
      5:    from 10.0.0.0/24 lookup 5000
      32766:  from all lookup main
      32767:  from all lookup default
      Copy to Clipboard

      默认情况下,RHEL 包含表 localmaindefault 的规则。

    2. 显示表 5000 中的路由:

      # ip route list table 5000
      0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
      10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
      Copy to Clipboard
    3. 显示接口和防火墙区:

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
      Copy to Clipboard
    4. 验证 external 区是否启用了伪装:

      # firewall-cmd --info-zone=external
      external (active)
        target: default
        icmp-block-inversion: no
        interfaces: enp1s0 enp7s0
        sources:
        services: ssh
        ports:
        protocols:
        masquerade: yes
        ...
      Copy to Clipboard

18.13. 使用 network RHEL 系统角色配置 ethtool 卸载功能

网络接口控制器可以使用 TCP 卸载引擎(TOE)将某些操作卸载到网络接口控制器。这提高了网络吞吐量。您可以在网络接口的连接配置文件中配置卸载功能。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    gro: no
    禁用通用接收卸载(GRO)。
    gso: yes
    启用通用分段卸载(GSO)。
    tx_sctp_segmentation: no
    禁用 TX 流控制传输协议(SCTP)分段。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查询受管节点的 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",
    		...
                }
    ...
    Copy to Clipboard

18.14. 使用 network RHEL 系统角色配置 ethtool 合并设置

通过使用中断合并,系统收集网络数据包,并为多个数据包生成一个中断。这会增加使用一个硬件中断发送到内核的数据量,从而减少中断负载,并最大化吞吐量。您可以在网络接口的连接配置文件中配置合并设置。通过使用 Ansible 和 network RHEL 角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    rx_frames: <value>
    设置 RX 帧的数量。
    gso: <value>
    设置 TX 帧的数量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示网络设备的当前卸载功能:

    # ansible managed-node-01.example.com -m command -a 'ethtool -c enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    rx-frames:	128
    ...
    tx-frames:	128
    ...
    Copy to Clipboard

18.15. 使用 network RHEL 系统角色增加环缓冲的大小,以减少高数据包丢弃率

如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。

环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(TX)和接收(RX)环缓冲区。接收环缓冲区在设备驱动程序和网络接口控制器(NIC)之间共享。数据可以通过硬件中断或软件中断(也称为 SoftIRQ)从 NIC 移到内核。

内核使用 RX 环缓冲区存储传入的数据包,直到设备驱动程序可以处理它们。设备驱动程序排空 RX 环,通常是使用 SoftIRQ,其将传入的数据包放在名为 sk_buffskb 的内核数据结构中,以通过内核开始其过程,直到拥有相关套接字的应用程序。

内核使用 TX 环缓冲区来存放应发送到网络的传出数据包。这些环缓冲区位于堆栈的底部,是可能发生数据包丢弃的关键点,这反过来会对网络性能造成负面影响。

您可以在 NetworkManager 连接配置文件中配置环缓冲设置。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您知道设备支持的最大环缓冲区大小。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    rx: <value>
    设置接收的环缓冲区条目的最大数。
    tx: <value>
    设置传输的环缓冲区条目的最大数。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示最大环缓冲大小:

    # ansible managed-node-01.example.com -m command -a 'ethtool -g enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    Current hardware settings:
    RX:             4096
    RX Mini:        0
    RX Jumbo:       0
    TX:             4096
    Copy to Clipboard

18.16. 使用 network RHEL 系统角色配置 IPoIB 连接

您可以使用 IP over InfiniBand (IPoIB),通过 InfiniBand 接口发送 IP 数据包。要配置 IPoIB,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network 系统角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置 IPoIB,如果 InfiniBand 的父设备的连接配置文件不存在,角色也可以创建它。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 一个名为 mlx4_ib0 的 InfiniBand 设备被安装在受管节点上。
  • 受管节点使用 NetworkManager 配置网络。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 显示 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
    Copy to Clipboard
  2. 显示 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
    Copy to Clipboard
  3. 显示 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
    Copy to Clipboard

18.17. network RHEL 系统角色的网络状态

network RHEL 系统角色支持 playbook 中的状态配置,来配置设备。为此,请使用 network_state 变量,后面跟上状态配置。

在 playbook 中使用 network_state 变量的好处:

  • 通过与状态配置结合使用声明方法,您可以配置接口,NetworkManager 会在后台为这些接口创建一个配置集。
  • 使用 network_state 变量,您可以指定您需要更改的选项,所有其他选项将保持不变。但是,使用 network_connections 变量,您必须指定所有设置来更改网络连接配置集。
重要

您只能在 network_state 中设置 Nmstate YAML 指令。这些指令与您可以在 network_connections 中设置的变量有所不同。

例如,要使用动态 IP 地址设置创建以太网连接,请在 playbook 中使用以下 vars 块:

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
Copy to Clipboard
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: up
Copy to Clipboard

例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars 块:

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: down
Copy to Clipboard
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: down
Copy to Clipboard

第 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 文件中。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    run_as_userrun_as_group
    指定容器是无根的。
    kube_file_content

    包含一个定义名为 db 的第一个容器的 Kubernetes YAML 文件。您可以使用 podman kube generate 命令生成 Kubernetes YAML 文件。

    • db 容器是基于 quay.io/db/db:stable 容器镜像。
    • db 绑定挂载将主机上的 /var/lib/db 目录映射到容器中的 /var/lib/db 目录。Z 标志使用私有的 unshared 标签标记内容,因此只有 db 容器才能访问内容。
    kube_file_src: <path>
    定义第二个容器。控制器节点上 /path/to/webapp.yml 文件的内容将复制到受管节点上的 kube_file 字段中。
    volumes: <list>
    一个定义要在一个或多个容器中提供数据源的 YAML 列表。例如,主机上的本地磁盘(hostPath)或其他磁盘设备。
    volumeMounts: <list>
    一个定义目标的 YAML 列表,其中单个容器将挂载一个给定卷。
    podman_create_host_directories: true
    在主机上创建目录。这指示角色检查 hostPath 卷的 kube 规格,并在主机上创建这些目录。如果您需要对所有权和权限有更多的控制,请使用 podman_host_directories

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.podman/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

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 角色创建有根容器。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

19.3. 使用 podman RHEL 系统角色创建一个带有 secret 的 Quadlet 应用程序

您可以使用 podman RHEL 系统角色,通过运行 Ansible playbook 来创建一个带有 secret 的 Quadlet 应用程序。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 容器中的 web 服务器应使用的证书和相应的私钥存储在 ~/certificate.pem~/key.pem 文件中。

流程

  1. 显示证书和私钥文件的内容:

    $ cat ~/certificate.pem
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    
    $ cat ~/key.pem
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----
    Copy to Clipboard

    您在后续步骤中需要此信息。

  2. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      root_password: <root_password>
      certificate: |-
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      key: |-
        -----BEGIN PRIVATE KEY-----
        ...
        -----END PRIVATE KEY-----
      Copy to Clipboard

      确保 certificatekey 变量中的所有行都以两个空格开头。

    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个包含以下内容的 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
    Copy to Clipboard

    流程创建一个与 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.ymlfile_src: quadlet-demo.yml.请注意,.yml 不是一个有效的 Quadlet 单元类型,因此这些文件将只被复制,且不会作为 Quadlet 规范来处理。
    • Wordpress 和 envoy 代理容器和配置由 file_src: quadlet-demo.kube 字段定义。kube 单元将之前 [Kube] 部分中的 YAML 文件称为 Yaml=quadlet-demo.ymlConfigMap=envoy-proxy-configmap.yml
  4. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

第 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 服务器配置为空客户端,以便仅发送传出电子邮件。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 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

流程

  1. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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>

    定义受管节点上没有 .crtkey 后缀的证书和私钥的路径和基础名称。在 PostgreSQL 配置过程中,角色会在 /var/lib/pgsql/data/ 目录中创建引用这些文件的符号链接。

    证书和私钥必须存在于受管节点本地。您可以将任务与 ansible.builtin.copy 模块一起使用,来将文件从控制节点传输到受管节点,如 playbook 中所示。

    postgresql_server_conf: <list_of_settings>

    定义角色应设置的 postgresql.conf 设置。角色将这些设置添加到 /etc/postgresql/system-roles.conf 文件中,并在 /var/lib/pgsql/data/postgresql.conf 的末尾包含此文件。因此,postgresql_server_conf 变量中的设置会覆盖 /var/lib/pgsql/data/postgresql.conf 中的设置。

    使用 postgresql_server_conf 中的不同设置重新运行 playbook 会使用新设置覆盖 /etc/postgresql/system-roles.conf 文件。

    postgresql_pg_hba_conf: <list_of_authentication_entries>

    /var/lib/pgsql/data/pg_hba.conf 文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。

    示例允许以下到 PostgreSQL 的连接:

    • 使用本地 UNIX 域套接字的未加密的连接。
    • TLS 加密的到 IPv4 和 IPv6 localhost 地址的连接。
    • 来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在 postgresql_server_conf 变量中正确地配置了 listen_addresses 设置时,才能从远程地址访问。

    使用 postgresql_pg_hba_conf 中不同的设置重新运行 playbook 会使用新设置覆盖 /var/lib/pgsql/data/pg_hba.conf 文件。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.postgresql/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 使用 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)
    Copy to Clipboard

    如果输出显示 TLS 协议版本和密码详情,则连接正常工作,且 TLS 加密已启用。

21.2. 使用 postgresql RHEL 系统角色,配置带有从 IdM 中发布的 TLS 证书的 PostgreSQL

如果应用程序需要 PostgreSQL 数据库服务器,您可以配置带有 TLS 加密的 PostgreSQL 服务,来在应用和数据库之间启用安全通信。如果 PostgreSQL 主机是 Red Hat Enterprise Linux Identity Management (IdM)域的成员,则 certmonger 服务可以管理证书请求和将来的续订。

通过使用 postgresql RHEL 系统角色,您可以自动化此过程。您可以远程安装和配置带有 TLS 加密的 PostgreSQL,postgresql 角色使用 certificate RHEL 系统角色配置 certmonger ,并从 IdM 请求证书。

注意

postgresql 角色无法在 firewalld 服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在使用 firewall RHEL 系统角色的 playbook 中添加任务。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您在 IdM 域中注册了受管节点。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    postgresql_version: <version>

    设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。

    您无法通过更改 postgresql_version 变量并再次运行 playbook 来升级或降级 PostgreSQL。

    postgresql_password: <password>

    设置 postgres 数据库超级用户的密码。

    您无法通过更改 postgresql_password 变量并再次运行 playbook 来更改密码。

    postgresql_certificates: <certificate_role_settings>
    包含 certificate 角色设置的 YAML 字典的列表。
    postgresql_server_conf: <list_of_settings>

    定义您要角色设置的 postgresql.conf 设置。角色将这些设置添加到 /etc/postgresql/system-roles.conf 文件中,并在 /var/lib/pgsql/data/postgresql.conf 的末尾包含此文件。因此,postgresql_server_conf 变量中的设置会覆盖 /var/lib/pgsql/data/postgresql.conf 中的设置。

    使用 postgresql_server_conf 中的不同设置重新运行 playbook 会使用新设置覆盖 /etc/postgresql/system-roles.conf 文件。

    postgresql_pg_hba_conf: <list_of_authentication_entries>

    /var/lib/pgsql/data/pg_hba.conf 文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。

    示例允许以下到 PostgreSQL 的连接:

    • 使用本地 UNIX 域套接字的未加密的连接。
    • TLS 加密的到 IPv4 和 IPv6 localhost 地址的连接。
    • 来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在 postgresql_server_conf 变量中正确地配置了 listen_addresses 设置时,才能从远程地址访问。

    使用 postgresql_pg_hba_conf 中不同的设置重新运行 playbook 会使用新设置覆盖 /var/lib/pgsql/data/pg_hba.conf 文件。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.postgresql/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 使用 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)
    Copy to Clipboard

    如果输出显示 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。注册系统可启用可用于管理系统和报告数据的特性和功能。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      activationKey: <activation_key>
      organizationID: <organizationID>
      username: <username>
      password: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
      Copy to Clipboard

      示例 playbook 中指定的设置包括以下内容:

      rhc_auth: activation_keys
      key activation_keys 指定您要使用激活码进行注册。
    • 要使用用户名和密码注册,请使用以下 playbook:

      ---
      - name: Managing systems with the rhc RHEL system role
        hosts: managed-node-01.example.com
        vars_files:
          - ~/vault.yml
        tasks:
          - name: Registering system with username and password
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.rhc
            vars:
              rhc_auth:
                login:
                  username: "{{ username }}"
                  password: "{{ password }}"
      Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    rhc_auth: login
    密钥登录 指定您要使用用户名和密码进行注册。
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

22.2. 使用 rhc RHEL 系统角色,使用 Satellite 注册系统

当组织使用 Satellite 管理系统时,需要通过 Satellite 注册系统。您可以使用 rhc RHEL 系统角色,使用 Satellite 远程注册您的系统。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      activationKey: <activation_key>
      organizationID: <organizationID>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    主机名: example.com
    Satellite 服务器的完全限定域名(FQDN),用于系统注册和软件包管理。
    端口: 443
    定义用于与 Satellite 服务器通信的网络端口。
    prefix: /rhsm
    指定用于访问 Satellite 服务器上资源的 URL 路径前缀。
    rhc_baseurl: http://example.com/pulp/content
    定义内容 URL 的前缀。在 Satellite 环境中,baseurl 必须设置为注册系统的同一服务器。请参阅 hostname 值,以确保使用正确的服务器。
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

22.3. 使用 rhc RHEL 系统角色在注册后禁用到 Insights 的连接

当使用 rhc RHEL 系统角色注册系统时,角色默认启用到 Red Hat Insights 的连接。Red Hat Insights 是混合云控制台中的一个受管服务,它使用预测分析、修复功能和深度域专业知识来简化复杂的操作任务。如果不需要,您可以使用 rhc RHEL 系统角色禁用它。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    rhc_insights absent|present
    使用 Red Hat Insights 启用或禁用系统注册以主动分析和建议。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

22.4. 使用 rhc RHEL 系统角色管理存储库

在 RHEL 系统上启用软件仓库对于从验证的源访问、安装和更新软件包至关重要。您可以使用 rhc RHEL 系统角色远程启用或禁用受管节点上的存储库,以确保系统安全性、稳定性和兼容性。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您有要在受管节点上启用或禁用的存储库的详情。
  • 您已注册系统。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    名称 : RepositoryName
    应该启用的存储库的名称。
    state: enabled|disabled
    可选,启用或禁用存储库。默认启用
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

22.5. 使用 rhc RHEL 系统角色将系统锁定到特定版本

为确保系统稳定性和兼容性,有时需要将 RHEL 系统限制为只使用特定次版本的存储库,而不是自动升级到最新的可用版本。将系统锁定到特定的次版本有助于保持生产环境中的一致性,这样可防止出现兼容性问题的意外更新。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您知道要锁定系统的 RHEL 版本。请注意,您只能将系统锁定到受管节点当前运行的 RHEL 次版本或之后的次版本。
  • 您已注册系统。

流程

  1. 创建一个包含以下内容的 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"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    rhc_release: version
    要为系统设置的 RHEL 版本,因此可用内容将限制为该版本。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

22.6. 在使用 rhc RHEL 系统角色注册主机时使用代理服务器

如果您的安全限制只允许通过代理服务器访问互联网,您可以在使用 rhc 注册系统时指定 rhc 角色的代理设置。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      username: <username>
      password: <password>
      proxy_username: <proxyusernme>
      proxy_password: <proxypassword>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    主机名: proxy.example.com
    代理服务器的完全限定域名(FQDN)。
    端口: 3128
    定义用于与代理服务器通信的网络端口。
    用户名 : proxy_username
    指定用于身份验证的用户名。这只有在代理服务器需要身份验证时才需要。
    Password: proxy_password
    指定用于身份验证的密码。这只有在代理服务器需要身份验证时才需要。
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

22.7. 使用 rhc RHEL 系统角色管理 Insights 规则的自动更新

您可以使用 rhc RHEL 系统角色启用或禁用 Red Hat Insights 的自动集合规则更新。默认情况下,当您的系统连接到 Red Hat Insights 时,这个选项就启用了。您可以使用 rhc 禁用它。

警告

如果禁用了此功能,您就存在使用过时的规则定义文件,且没有获得最新验证更新的风险。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      username: <username>
      password: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    autoupdate: true|false
    为 Red Hat Insights 启用或禁用自动集合规则更新。
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

22.8. 使用 rhc RHEL 系统角色配置 Insights 修复

您可以使用 rhc RHEL 系统角色将系统配置为自动更新动态配置。当您将您的系统连接到 Red Hat Insights 时,它会被默认启用。如果需要,您可以禁用它。您可以使用 rhc 来确保您的系统已准备好在直接连接到红帽时进行补救。有关 Red Hat Insights 修复的更多信息,请参阅 Red Hat Insights 修复指南

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您已启用了 Insights 补救。
  • 您已注册系统。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

22.9. 使用 rhc RHEL 系统角色配置 Insights 标签

您可以使用 rhc RHEL 系统角色为系统过滤和分组配置 Red Hat Insights 标签。您还可以根据要求自定义标签。使用 Red Hat Insights 标签过滤和分组系统,可帮助管理员根据环境、位置或功能等属性有效地管理、监控和应用策略到特定的系统集合。这提高了可见性,简化了自动化,并增强了跨大型基础架构的安全性合规性。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      username: <username>
      password: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    组 : group -name-value
    指定用于组织和管理注册主机的系统组。
    location:location-name-value
    定义与注册系统关联的位置。
    description
    为注册的系统提供简短摘要或标识符。
    State:present|absent

    表示已注册系统的当前状态。

    注意

    标签 中的内容是一个 YAML 结构,代表管理员配置的系统所需的标签。此处给出的示例仅用于说明目的。管理员可以自定义 YAML 结构,根据需要包含任何其他键和值。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

22.10. 使用 rhc RHEL 系统角色取消系统注册

如果您不再想从特定系统上的注册服务器接收内容,例如系统停用、虚拟机删除或切换到本地内容镜像时,您可以使用 rhc RHEL 系统角色从红帽订阅服务取消注册系统。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    rhc_state: absent
    指定应该从注册服务器、RHSM 或 Satellite 中取消注册该系统。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

第 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.comname: server.example.com,则 managed-node-01.example.com 将通过使用 server.example.com 上的 IPMI 更改设置。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • ansible-collection-redhat-rhel_mgmt 软件包安装在控制节点上。
  • 您有凭证来访问 BMC,这些凭证有更改设置的权限。
  • 受管节点可以通过网络访问远程 BMC。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      ipmi_usr: <username>
      ipmi_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    name: <bmc_hostname_or_ip_address>
    定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
    port: <bmc_port_number>
    设置远程管理控制协议(RMCP)端口号。默认值为 623
    bootdev: <value>

    设置引导设备。您可以选择以下值之一:

    • hd: 从硬盘引导。
    • 网络 :从网络引导.
    • 学:从光驱(如 DVD-ROM)引导。
    • floppy :从软盘引导.
    • 安全 :在安全模式下从硬盘驱动器引导.
    • 设置 :引导到 BIOS 或 UEFI。
    • 默认 :删除任何 IPMI 直接引导设备请求。
    persistent: <true|false>
    配置远程主机是否对所有引导都使用定义的设置,还是只针对下一个配置。默认情况下,此变量设置为 false。请注意,并非所有 BMC 都支持永久设置引导设备。

    如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.ipmi_boot 命令来显示模块的文档。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

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.comname: server.example.com,则 managed-node-01.example.com 将通过使用 server.example.com 上的 IPMI 更改设置。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • ansible-collection-redhat-rhel_mgmt 软件包安装在控制节点上。
  • 您有凭证来访问 BMC,这些凭证有更改设置的权限。
  • 受管节点可以通过网络访问远程 BMC。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      ipmi_usr: <username>
      ipmi_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    name: <bmc_hostname_or_ip_address>
    定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
    port: <bmc_port_number>
    设置远程管理控制协议(RMCP)端口号。默认值为 623
    state: &lt ;value>

    设置设备应处于的状态。您可以选择以下值之一:

    • 在 上 :打开系统上的电源。
    • 关闭 :在不通知操作系统的情况下关闭系统。
    • 关闭 :从操作系统请求关闭。
    • reset :执行硬重置。
    • Boot : 关闭系统电源,如果关闭系统,则重置系统。

    如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.ipmi_power 命令来显示模块的文档。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

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.combaseuri: server.example.com,则 managed-node-01.example.comserver.example.com 执行操作。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • ansible-collection-redhat-rhel_mgmt 软件包安装在控制节点上。
  • 您有访问 OOB 控制器的凭证,这些凭证有更改设置的权限。
  • 受管节点可以通过网络访问远程 OOB 控制器。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    baseuri: <uri>
    定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
    category: &lt ;value>

    设置要执行的命令类别。可用的类别如下:

    • 帐户 :管理 OOB 控制器的用户帐户。
    • 机箱 :管理与机箱相关的设置。
    • Manager :提供对 Redfish 服务的访问。
    • 会话 :管理 Redfish 登录会话。
    • 系统 (默认):管理机器相关的设置。
    • 更新 :管理固件更新相关操作。
    command: <command>
    设置要执行的命令。根据命令,可能需要设置额外的变量。

    如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.redfish_command 命令来显示模块的文档。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

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.combaseuri: server.example.com,则 managed-node-01.example.comserver.example.com 执行操作。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • ansible-collection-redhat-rhel_mgmt 软件包安装在控制节点上。
  • 您有访问 OOB 控制器的凭证,这些凭证有查询设置的权限。
  • 受管节点可以通过网络访问远程 OOB 控制器。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    baseuri: <uri>
    定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
    category: &lt ;value>

    设置要查询的信息类别。可用的类别如下:

    • 帐户 :OOB 控制器的用户帐户
    • 机箱 :与机箱相关的设置
    • Manager: Redfish 服务
    • 会话 :Redfish 登录会话
    • 系统 (默认):与机器相关的设置
    • 更新 :与固件相关的设置
    • All: 来自所有类别的信息.

    如果使用列表,您还可以设置多个类别,如 ["Systems", "Accounts "]。

    command: <command>
    设置要执行的查询命令。

    如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.redfish_info 命令显示模块的文档。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

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.combaseuri: server.example.com,则 managed-node-01.example.comserver.example.com 执行操作。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • ansible-collection-redhat-rhel_mgmt 软件包已安装在控制节点上。
  • 您有访问 OOB 控制器的凭证,这些凭证有更改设置的权限。
  • 受管节点可以通过网络访问远程 OOB 控制器。

流程

  1. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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"
    Copy to Clipboard

    示例 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 命令显示模块的文档。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

第 24 章 使用 RHEL 系统角色配置 SELinux

您可以使用 selinux RHEL 系统角色远程配置和管理 SELinux 权限,例如:

  • 清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
  • 设置 SELinux 策略布尔值、文件上下文、端口和登录。
  • 在指定文件或目录中恢复文件上下文。
  • 管理 SELinux 模块。

24.1. 使用 selinux RHEL 系统角色恢复目录上的 SELinux 上下文

当文件有不正确的 SELinux 上下文时,可能会出现多种情况。例如,如果文件被复制或移到目录中,则它们的 SELinux 上下文可能与新位置的预期上下文不匹配。使用不正确的 SELinux 上下文时,应用程序可能无法访问文件。要在大量主机上的目录上远程重置 SELinux 上下文,您可以使用 selinux RHEL 系统角色。

先决条件

流程

  1. 创建一个包含以下内容的 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/
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    selinux_restore_dirs: <list>
    定义角色应重置 SELinux 上下文的目录的列表。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示您已重置了上下文的文件或目录的 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/
    Copy to Clipboard

24.2. 使用 selinux RHEL 系统角色管理 SELinux 网络端口标签

如果要在非标准端口上运行服务,您必须在此端口上设置相应的 SELinux 类型标签。这可防止在服务希望侦听非标准端口时,SELinux 拒绝对服务的访问权限。通过使用 selinux RHEL 系统角色,您可以自动化此任务,并在端口上远程分配一个类型标签。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    ports: <port_number>
    定义您要为其分配 SELinux 标签的端口号。使用逗号分隔多个值。
    setype: <type_label>
    定义 SELinux 类型标签。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示分配了 http_port_t 标签的端口号:

    # ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t'
    http_port_t      tcp     80, 81, 443, <port_number>, 488, 8008, 8009, 8443, 9000
    Copy to Clipboard

24.3. 使用 selinux RHEL 系统角色部署 SELinux 模块

如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
  • SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。

    如果使用 PP 模块,请确保受管节点上的 policydb 版本与用来构建 PP 模块的版本相同或更新。

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    path: <module_file>
    设置控制节点上模块文件的路径。
    priority: <value>
    设置 SELinux 模块优先级。400 是默认值。
    state: <value>

    定义模块的状态:

    • enabled :安装或启用模块。
    • disabled :禁用模块。
    • absent :删除模块。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.selinux/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表:

    # ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'
    Copy to Clipboard

    如果列出了模块,则其已安装且启用了。

第 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 文件。

在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

sshd_ListenAddress:
  - 0.0.0.0
  - '::'
Copy to Clipboard

呈现为:

ListenAddress 0.0.0.0
ListenAddress ::
Copy to Clipboard

25.2. 使用 sshd RHEL 系统角色配置 OpenSSH 服务器

您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:

  • 管理来自远程客户端的传入 SSH 连接
  • 凭证验证
  • 保护数据传输和命令执行
注意

您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9)。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: SSH server configuration
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure sshd to prevent root and password login except from particular subnet
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sshd
          vars:
            sshd_config:
              PermitRootLogin: no
              PasswordAuthentication: no
              Match:
                - Condition: "Address 192.0.2.0/24"
                  PermitRootLogin: yes
                  PasswordAuthentication: yes
    Copy to Clipboard

    示例 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) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 登录到 SSH 服务器:

    $ ssh <username>@<ssh_server>
    Copy to Clipboard
  2. 验证 SSH 服务器上 sshd_config 文件的内容:

    $ cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf
    #
    # Ansible managed
    #
    PasswordAuthentication no
    PermitRootLogin no
    Match Address 192.0.2.0/24
      PasswordAuthentication yes
      PermitRootLogin yes
    Copy to Clipboard
  3. 检查您是否可以以 root 用户身份从 192.0.2.0/24 子网连接到服务器:

    1. 确定您的 IP 地址:

      $ hostname -I
      192.0.2.1
      Copy to Clipboard

      如果 IP 地址在 192.0.2.1 - 192.0.2.254 范围内,您可以连接到服务器。

    2. root 用户身份连接到服务器:

      $ ssh root@<ssh_server>
      Copy to Clipboard

25.3. 对非独占配置使用 sshd RHEL 系统角色

默认情况下,应用 sshd RHEL 系统角色会覆盖整个配置。如果您之前调整了配置,例如使用不同的 RHEL 系统角色或 playbook,则这可能会出现问题。要只对所选配置选项应用 sshd RHEL 系统角色,同时保留其他选项,您可以使用非独占配置。

您可以应用非独占配置:

  • 在 RHEL 8 及更早版本中使用配置片段。
  • 在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为 /etc/ssh/sshd_config.d/00-ansible_system_role.conf

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    • 对于运行 RHEL 8 或更早版本的受管节点:

      ---
      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure SSHD to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_namespace: <my-application>
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
      Copy to Clipboard
    • 对于运行 RHEL 9 或更高版本的受管节点:

      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure sshd to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
      Copy to Clipboard

      示例 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) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证 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>
      Copy to Clipboard
    • 对于运行 RHEL 9 或更高版本的受管节点:

      # cat /etc/ssh/sshd_config.d/42-my-application.conf
      # Ansible managed
      #
      AcceptEnv LANG LS_COLORS EDITOR
      Copy to Clipboard

25.4. 使用 sshd RHEL 系统角色覆盖 SSH 服务器上的系统范围的加密策略

当默认加密设置没有满足某些安全或兼容性需求时,您可能需要使用 sshd RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围的加密策略。特别是在以下值得注意的情况:

  • 与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
  • 强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
  • 性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
  • 针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
警告

sshd RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    sshd_KexAlgorithms
    您可以选择密钥交换算法,例如 ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1diffie-hellman-group-exchange-sha256
    sshd_Ciphers
    您可以选择密码,例如 aes128-ctres192-ctraes256-ctr
    sshd_MACs
    您可以选择 MAC,例如 hmac-sha2-256hmac-sha2-512hmac-sha1
    sshd_HostKeyAlgorithms
    您可以选择一个公钥算法,如 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521ssh-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_policysshd_sysconfig 变量设置为 true 来启用覆盖。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 您可以通过使用详细的 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
    ...
    Copy to Clipboard

25.5. ssh RHEL 系统角色如何将 playbook 中的设置映射到配置文件

ssh RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config 文件。

在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

LocalForward:
  - 22 localhost:2222
  - 403 localhost:4003
Copy to Clipboard

呈现为:

LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
Copy to Clipboard
注意

配置选项区分大小写。

25.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端

您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:

  • 安全连接启动
  • 凭证置备
  • 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
  • 能够安全地向和从 OpenSSH 服务器发送文件
注意

您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 通过显示 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
    Copy to Clipboard

第 26 章 使用 RHEL 系统角色管理本地存储

要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 storage 角色,这是 RHEL 9 中提供的 RHEL 系统角色之一。

使用 存储 角色可让您自动管理多台机器上的磁盘和逻辑卷上的文件系统,以及从 RHEL 7.7 开始的所有 RHEL 版本。

26.1. 使用 storage RHEL 系统角色在块设备上创建 XFS 文件系统

示例 Ansible playbook 使用 storage 角色,使用默认参数在块设备上创建一个 XFS 文件系统。如果 /dev/sdb 设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。

注意

存储 角色只能在未分区、整个磁盘或逻辑卷(LV)上创建文件系统。它不能在分区中创建文件系统。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

26.2. 使用 storage RHEL 系统角色永久挂载文件系统

示例 Ansible playbook 使用 storage 角色来永久挂载现有的文件系统。它通过向 /etc/fstab 文件中添加合适的条目来确保文件系统立即可用并永久挂载。这允许文件系统在重启后保持挂载。如果 /dev/sdb 设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

26.3. 使用 storage RHEL 系统角色创建或者调整逻辑卷大小

使用 storage 角色执行以下任务:

  • 在由多个磁盘组成的卷组中创建 LVM 逻辑卷
  • 调整 LVM 上现有文件系统的大小
  • 以池总大小的百分比表示 LVM 卷大小

如果卷组不存在,角色会创建它。如果逻辑卷在卷组中存在,如果大小与 playbook 中指定的内容不匹配,则会调整大小。

如果您要缩小逻辑卷,为了避免数据丢失,您必须确保该逻辑卷上的文件系统没有使用正在缩小的逻辑卷中的空间。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括如下:

    size: <size>
    您必须使用单位(如 GiB)或百分比(例如 60%)来指定大小。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证指定的卷是否已创建或调整到请求的大小:

    # ansible managed-node-01.example.com -m command -a 'lvs myvg'
    Copy to Clipboard

26.4. 使用 storage RHEL 系统角色启用在线块丢弃

您可以使用在线块丢弃选项挂载 XFS 文件系统,来自动丢弃未使用的块。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证在线块丢弃选项是否已启用:

    # ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'
    Copy to Clipboard

26.5. 使用 storage RHEL 系统角色创建并挂载文件系统

示例 Ansible playbook 使用 storage 角色创建和挂载文件系统。它通过向 /etc/fstab 文件中添加合适的条目来确保文件系统立即可用并永久挂载。这允许文件系统在重启后保持挂载。如果 /dev/sdb 设备上的文件系统或者挂载点目录不存在,playbook 会创建它们。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    disks: <list_of_devices>
    角色在创建卷时使用的设备名称的 YAML 列表。
    fs_type: <file_system>
    指定角色应在卷上设置的文件系统。您可以选择 xfsext3ext4swapunformatted
    label-name: <file_system_label>
    可选:设置文件系统的标签。
    mount_point: <directory>
    可选:如果卷应自动挂载,请将 mount_point 变量设置为应挂载卷的目录。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

26.6. 使用 storage RHEL 系统角色配置 RAID 卷

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 和 Ansible-Core 在 RHEL 上配置一个 RAID 卷。使用参数创建一个 Ansible playbook,以配置 RAID 卷以满足您的要求。

警告

设备名称在某些情况下可能会改变,例如:当您在系统中添加新磁盘时。因此,为了避免数据丢失,请在 playbook 中使用持久性命名属性。有关持久性命名属性的更多信息,请参阅 持久性命名属性

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证阵列是否被正确创建:

    # ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'
    Copy to Clipboard

26.7. 使用 storage RHEL 系统角色配置带有 RAID 的 LVM 池

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置一个带有 RAID 的 LVM 池。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证您的池是否在 RAID 上:

    # ansible managed-node-01.example.com -m command -a 'lsblk'
    Copy to Clipboard

26.8. 使用 storage RHEL 系统角色为 RAID LVM 卷配置条带大小

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上为 RAID LVM 卷配置条带大小。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证条带大小是否被设置为所需的大小:

    # ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'
    Copy to Clipboard

26.9. 使用 storage RHEL 系统角色配置 LVM-VDO 卷

您可以使用 storage RHEL 系统角色,在启用了压缩和去重的 LVM (LVM-VDO)上创建一个 VDO 卷。

注意

由于 storage 系统角色使用 LVM-VDO,因此每个池只能创建一个卷。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    vdo_pool_size: <size>
    卷在设备上使用的实际大小。您可以以人类可读的格式指定大小,如 10 GiB。如果没有指定单位,则默认为字节。
    size: <size>
    VDO 卷的虚拟大小。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 查看压缩和去重的当前状态:

    $ ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state'
      LV       VG      Attr       LSize   Pool   Origin Data%  Meta%  Move Log Cpy%Sync Convert VDOCompression VDOCompressionState VDODeduplication VDOIndexState
      mylv1   myvg   vwi-a-v---   3.00t vpool0                                                         enabled              online          enabled        online
    Copy to Clipboard

26.10. 使用 storage RHEL 系统角色创建 LUKS2 加密的卷

您可以通过运行 Ansible playbook,使用 storage 角色来创建和配置使用 LUKS 加密的卷。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      luks_password: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  1. 查找 LUKS 加密的卷的 luksUUID 值:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb'
    
    4e4e7970-1822-470e-b55a-e91efe5d0f5c
    Copy to Clipboard
  2. 查看卷的加密状态:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup status luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c'
    
    /dev/mapper/luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c is active and is in use.
      type:    LUKS2
      cipher:  aes-xts-plain64
      keysize: 512 bits
      key location: keyring
      device:  /dev/sdb
    ...
    Copy to Clipboard
  3. 验证创建的 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]
    ...
    Copy to Clipboard

26.11. 使用 storage RHEL 系统角色创建共享的 LVM 设备

如果您希望多个系统同时访问同一个存储,则您可以使用 storage RHEL 系统角色创建共享的 LVM 设备。

这可带来以下显著优点:

  • 资源共享
  • 管理存储资源方面的灵活性
  • 存储管理任务的简化

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      become: true
      tasks:
        - name: Create shared LVM device
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.storage
          vars:
            storage_pools:
              - name: vg1
                disks: /dev/vdb
                type: lvm
                shared: true
                state: present
                volumes:
                  - name: lv1
                    size: 4g
                    mount_point: /opt/test1
            storage_safe_mode: false
            storage_use_partitions: true
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

26.12. 使用 storage RHEL 系统角色调整物理卷大小

使用 storage 系统角色,您可以在从主机外调整底层存储或磁盘大小后调整 LVM 物理卷大小。例如:您增加了虚拟磁盘的大小,并希望在现有 LVM 中使用额外的空间。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 底层块存储的大小已被更改。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      tasks:
        - name: Resize LVM PV size
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.storage
          vars:
            storage_pools:
               - name: myvg
                 disks: ["sdf"]
                 type: lvm
                 grow_to_fill: true
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示新物理卷大小:

    $ ansible managed-node-01.example.com -m command -a 'pvs'
    PV         VG   Fmt Attr PSize PFree
    /dev/sdf1 myvg lvm2 a-- 1,99g 1,99g
    Copy to Clipboard

26.13. 使用 storage RHEL 系统角色创建加密的 Stratis 池

要保护数据,您可以使用 storage RHEL 系统角色创建一个加密的 Stratis 池。除了密码短语外,您还可以使用 Clevis 和 Tang 或 TPM 保护作为加密方法。

重要

您只能对整个池配置 Stratis 加密。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      luks_password: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Create a new encrypted Stratis pool with Clevis and Tang
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.storage
          vars:
            storage_pools:
               - name: mypool
                 disks:
                   - sdd
                   - sde
                 type: stratis
                 encryption: true
                 encryption_password: "{{ luks_password }}"
                 encryption_clevis_pin: tang
                 encryption_tang_url: tang-server.example.com:7500
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    encryption_password
    用于解锁 LUKS 卷的密码或密码短语。
    encryption_clevis_pin
    可用来加密创建的池的 Clevis 方法。您可以使用 tangtpm2
    encryption_tang_url
    Tang 服务器的 URL。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 验证是否创建了池,并配置了 Clevis 和 Tang :

    $ ansible managed-node-01.example.com -m command -a 'sudo stratis report'
    ...
                            "clevis_config": {
                                "thp": "j-G4ddvdbVfxpnUbgxlpbe3KutSKmcHttILAtAkMTNA",
                                "url": "tang-server.example.com:7500"
                            },
                            "clevis_pin": "tang",
                            "in_use": true,
                            "key_description": "blivet-mypool",
    Copy to Clipboard

第 27 章 使用 sudo 系统角色

作为管理员,您可以使用 sudo RHEL 系统角色在多个系统上一致地配置 /etc/sudoers 文件。

27.1. 使用 RHEL 系统角色应用自定义 sudoers 配置

您可以使用 sudo RHEL 系统角色在受管节点上应用自定义 sudoers 配置。这样,您可以定义哪些用户可以在哪些主机上运行哪些命令,从而获得更好的配置效率和更精细的控制。

先决条件

步骤

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: "Configure sudo"
      hosts: managed-node-01.example.com
      tasks:
        - name: "Apply custom /etc/sudoers configuration"
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sudo
          vars:
            sudo_sudoers_files:
              - path: "/etc/sudoers"
                user_specifications:
                  - users:
                      - <user_name>
                    hosts:
                      - <host_name>
                    commands:
                      - <path_to_command_binary>
    Copy to Clipboard

    playbook 中指定的设置包括:

    users
    规则适用的用户的列表。
    hosts
    规则适用的主机的列表。对于所有主机,您可以使用 ALL
    commands

    规则适用的命令的列表。对于所有命令,您可以使用 ALL

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sudo/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 在受管节点上,验证 playbook 是否应用了新规则。

    # cat /etc/sudoers | tail -n1
    <user_name> <host_name>= <path_to_command_binary>
    Copy to Clipboard

第 28 章 使用 RHEL 系统角色管理 systemd 单元

通过使用 systemd RHEL 系统角色,您可以自动化某些与 systemd 相关的任务,并远程执行它们。您可以对以下操作使用角色:

  • 管理服务
  • 部署单元
  • 部署置入文件

28.1. 使用 systemd RHEL 系统角色管理服务

您可以使用 systemd RHEL 系统角色自动并远程管理 systemd 单元,如启动或启用服务。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.systemd/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

28.2. 使用 systemd RHEL 系统角色部署 systemd 置入文件

systemd 在从其他位置读取单元的设置之上应用置入文件。因此,您可以使用置入文件修改单元设置,而无需更改原始单元文件。通过使用 systemd RHEL 系统角色,您可以自动化部署置入文件的过程。

重要

角色使用硬编码的文件名 99-override.conf ,将置入文件存储在 /etc/systemd/system/<name>._<unit_type>/ 中。请注意,它会在目标目录中使用此名称覆盖现有文件。

先决条件

流程

  1. 使用 systemd 置入文件内容创建一个 Jinja2 模板。例如,使用以下内容创建 ~/sshd.service.conf.j2 文件:

    {{ ansible_managed | comment }}
    [Unit]
    After=
    After=network.target sshd-keygen.target network-online.target
    Copy to Clipboard

    此置入文件在 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 放在同一个目录中。

  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    systemd_dropins: <list_of_files>
    指定要以 YAML 列表格式部署的置入文件的名称。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.systemd/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证角色是否将置入文件放在了正确的位置:

    # ansible managed-node-01.example.com -m command -a 'ls /etc/systemd/system/sshd.service.d/'
    99-override.conf
    Copy to Clipboard

28.3. 使用 systemd RHEL 系统角色部署 systemd 系统单元

您可以为自定义应用程序创建单元文件,systemd 从 /etc/systemd/system/ 目录中读取这些文件。通过使用 systemd RHEL 系统角色,您可以自动部署自定义单元文件。

先决条件

流程

  1. 使用自定义 systemd 单元文件内容创建一个 Jinja2 模板。例如,使用服务的内容创建 ~/example.service.j2 文件:

    {{ ansible_managed | comment }}
    [Unit]
    Description=Example systemd service unit file
    
    [Service]
    ExecStart=/bin/true
    Copy to Clipboard

    对文件名使用 <name>.<unit_type>.j2 约定。例如,要创建 example.service 单元,您必须将文件命名为 example.service.j2。将文件与 playbook 放在同一个目录中。

  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.systemd/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证该服务是否已启用并启动:

    # ansible managed-node-01.example.com -m command -a 'systemctl status example.service'
    ...
    ● example.service - A service for demonstrating purposes
       Loaded: loaded (/etc/systemd/system/example.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2024-07-04 15:59:18 CEST; 10min ago
    ...
    Copy to Clipboard

28.4. 使用 systemd RHEL 系统角色部署 systemd 用户单元

您可以为自定义应用程序创建每个用户单元文件,systemd 从 /home/ <username> /.config/systemd/user/ 目录中读取 这些文件。通过使用 systemd RHEL 系统角色,您可以为单个用户自动部署自定义单元文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您在 playbook 中为 systemd 单元指定的用户已存在。

流程

  1. 使用自定义 systemd 单元文件内容创建一个 Jinja2 模板。例如,使用服务的内容创建 ~/example.service.j2 文件:

    {{ ansible_managed | comment }}
    [Unit]
    Description=Example systemd service unit file
    
    [Service]
    ExecStart=/bin/true
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    Copy to Clipboard

    对文件名使用 <name>.<unit_type>.j2 约定。例如,要创建 example.service 单元,您必须将文件命名为 example.service.j2。将文件与 playbook 放在同一个目录中。

  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Managing systemd services
      hosts: managed-node-01.example.com
      tasks:
        - name: Deploy, enable, and start a custom systemd service for a user
          ansible.builtin.include_role:
            name: rhel-system-roles.systemd
          vars:
            systemd_unit_file_templates:
              - item: example.service.j2
                user: <username>
            systemd_enabled_units:
              - item: example.service
                user: <username>
            systemd_started_units:
              - item: example.service
                user: <username>
    Copy to Clipboard
    重要

    systemd RHEL 系统角色不会创建新用户,如果您在 playbook 中指定不存在的用户,它会返回错误。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.systemd/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 验证该服务是否已启用并启动:

    # ansible managed-node-01.example.com -m command -a 'systemctl --user -M <username>@ status example.service'
    ...
    ● example.service - Example systemd service unit file
         Loaded: loaded (/home/<username>/.config/systemd/user/example.service; enabled; preset: disabled)
         Active: active (exited) since Wed 2025-03-05 13:33:36 CET; 45s ago
    ...
    Copy to Clipboard

第 29 章 使用 RHEL 系统角色配置时间同步

Network Time Protocol(NTP)和 Precision Time Protocol (PTP)是通过网络同步计算机时钟的标准。网络中准确的时间同步非常重要,因为某些服务依赖它。例如,Kerberos 只容许服务器和客户端之间很少的时间差异,以防止重播攻击。

您可以在 playbook 的 timesync_ntp_provider 变量中设置要配置的时间服务。如果没有设置此变量,角色会根据以下因素决定时间服务:

  • 在 RHEL 8 及更新版本上:chronyd
  • 在 RHEL 6 和 7 上: chronyd(默认)或者如果已安装了 ntpd

29.1. 使用 timesync RHEL 系统角色配置通过 NTP 的时间同步

Network Time Protocol(NTP)通过网络,将主机的时间与 NTP 服务器同步。在 IT 网络中,服务依赖于正确的系统时间,例如,出于安全和日志记录目的。通过使用 timesync RHEL 系统角色,您可以在网络中自动配置 Red Hat Enterprise Linux NTP 客户端,并保持时间同步。

警告

timesync RHEL 系统角色在受管主机上替换了指定的或检测到的提供商服务的配置。因此,如果没有在 playbook 中指定,所有设置都会丢失。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    pool: <yes|no>
    将源标记为 NTP 池,而不是单个主机。在这种情况下,服务预期名称解析为可能会随时间变化的多个 IP 地址。
    iburst: yes
    启用快速初始同步。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.timesync/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 显示时间源的详情:

    • 如果受管节点运行 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
      ...
      Copy to Clipboard
    • 如果受管节点运行 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
      ...
      Copy to Clipboard

29.2. 使用 timesync RHEL 系统角色,通过 NTP 配置与 NTS 的时间同步

Network Time Protocol(NTP)通过网络,将主机的时间与 NTP 服务器同步。通过使用 Network Time Security (NTS)机制,客户端建立到服务器的 TLS 加密连接,并验证 NTP 数据包。在 IT 网络中,服务依赖于正确的系统时间,例如,出于安全和日志记录目的。通过使用 timesync RHEL 系统角色,您可以在网络中自动配置 Red Hat Enterprise Linux NTP 客户端,并保持通过 NTS 的时间同步。

请注意,您不能将 NTS 服务器与非 NTS 服务器混合使用。在混合配置中,NTS 服务器是可信的,客户端不会回退到未经身份验证的 NTP 源,因为它们可能被中间人(MITM)攻击所利用。详情请查看您系统上 chrony.conf (5) 手册页中的 authselectmode 参数描述。

警告

timesync RHEL 系统角色在受管主机上替换了指定的或检测到的提供商服务的配置。因此,如果没有在 playbook 中指定,所有设置都会丢失。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    iburst: yes
    启用快速初始同步。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.timesync/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 如果受管节点运行 chronyd 服务:

    1. 显示时间源的详情:

      # ansible managed-node-01.example.com -m command -a 'chronyc sources'
      MS Name/IP address         Stratum Poll Reach LastRx Last sample
      ===============================================================================
      ^* ptbtime1.ptb.de               1   6    17    55    -13us[  -54us] +/-   12ms
      ^- ptbtime2.ptb.de               1   6    17    56   -257us[ -297us] +/-   12ms
      Copy to Clipboard
    2. 对于启用了 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
      Copy to Clipboard

      验证 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
    Copy to Clipboard

第 30 章 使用 RHEL 系统角色配置系统,以进行会话记录

使用 tlog RHEL 系统角色,以自动的方式记录和监控受管节点上终端会话活动。您可以使用 SSSD 服务将记录配置为为每个用户或用户组进行。

在 tlog RHEL 系统角色中记录解决方案的会话由以下组件组成:

  • tlog 工具
  • 系统安全性服务守护进程(SSSD)
  • 可选: Web 控制台界面

30.1. 使用 tlog RHEL 系统角色为单个用户配置会话记录

准备并应用一个 Ansible playbook 来配置 RHEL 系统,以便将记录数据的会话记录到 systemd 日志中。

因此,您可以在用户会话期间、登录到控制台中或通过 SSH 时,启用记录特定用户的终端输出和输入。

playbook 安装 tlog-rec-session,一个终端会话 I/O 日志记录程序,其充当用户的登录 shell。角色创建一个 SSSD 配置丢弃文件,此文件定义登录 shell 应用于哪些用户和组。另外,如果系统上安装了 cockpit 软件包,playbook 也会安装 cockpit-session-recording 软件包,它是一个 Cockpit 模块,供您在 web 控制台界面中查看和播放记录。

先决条件

流程

  1. 创建一个包含以下内容的 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>
    Copy to Clipboard
    tlog_scope_sssd: <value>
    一些 值指定只记录某些用户和组,而不是 allnone
    tlog_users_sssd: <list_of_users>
    您要记录会话的用户的 YAML 列表。请注意,如果不存在,角色不会添加用户。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 检查 SSSD 置入文件的内容:

    # cd /etc/sssd/conf.d/sssd-session-recording.conf
    Copy to Clipboard

    您可以看到该文件包含您在 playbook 中设置的参数。

  2. 以其会话将被记录的用户的身份登录,执行某些操作,然后退出登录。
  3. root 用户身份:

    1. 显示记录的会话的列表:

      # journalctl _COMM=tlog-rec-sessio
      Nov 12 09:17:30 managed-node-01.example.com -tlog-rec-session[1546]: {"ver":"2.3","host":"managed-node-01.example.com","rec":"07418f2b0f334c1696c10cbe6f6f31a6-60a-e4a2","user":"demo-user",...
      ...
      Copy to Clipboard

      在下一步中需要 rec (记录 ID)字段的值。

      请注意,由于 15 个字符的限制,_COMM 字段的值被缩短了。

    2. 回放会话:

      # tlog-play -r journal -M TLOG_REC=<recording_id>
      Copy to Clipboard

30.2. 使用 tlog RHEL 系统角色将某些用户和组从会话记录中排除

您可以使用 tlog RHEL 系统角色中的 tlog_exclude_users_sssdtlog_exclude_groups_sssd 角色变量将用户或组从记录的会话中排除,并记录在 systemd 日志中。

playbook 安装 tlog-rec-session,一个终端会话 I/O 日志记录程序,其充当用户的登录 shell。角色创建一个 SSSD 配置丢弃文件,此文件定义登录 shell 应用于哪些用户和组。另外,如果系统上安装了 cockpit 软件包,playbook 也会安装 cockpit-session-recording 软件包,它是一个 Cockpit 模块,供您在 web 控制台界面中查看和播放记录。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Deploy session recording excluding users and groups
      hosts: managed-node-01.example.com
      tasks:
        - name: Exclude users and groups
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.tlog
          vars:
            tlog_scope_sssd: all
            tlog_exclude_users_sssd:
              - jeff
              - james
            tlog_exclude_groups_sssd:
              - admins
    Copy to Clipboard
    tlog_scope_sssd: <value>
    all 指定您要记录所有用户和组。
    tlog_exclude_users_sssd: <user_list>
    您要从会话记录中排除的用户的 YAML 列表。
    tlog_exclude_groups_sssd: <group_list>
    您要从会话记录中排除的组的 YAML 列表。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  1. 检查 SSSD 置入文件的内容:

    # cat /etc/sssd/conf.d/sssd-session-recording.conf
    Copy to Clipboard

    您可以看到该文件包含您在 playbook 中设置的参数。

  2. 以其会话将被记录的用户的身份登录,执行某些操作,然后退出登录。
  3. root 用户身份:

    1. 显示记录的会话的列表:

      # journalctl _COMM=tlog-rec-sessio
      Nov 12 09:17:30 managed-node-01.example.com -tlog-rec-session[1546]: {"ver":"2.3","host":"managed-node-01.example.com","rec":"07418f2b0f334c1696c10cbe6f6f31a6-60a-e4a2","user":"demo-user",...
      ...
      Copy to Clipboard

      在下一步中需要 rec (记录 ID)字段的值。

      请注意,由于 15 个字符的限制,_COMM 字段的值被缩短了。

    2. 回放会话:

      # tlog-play -r journal -M TLOG_REC=<recording_id>
      Copy to Clipboard

第 31 章 使用 RHEL 系统角色配置 VPN 连接

VPN 是一个加密连接,用于通过不受信任的网络安全地传输流量。通过使用 vpn RHEL 系统角色,您可以自动执行创建 VPN 配置的过程。

注意

vpn RHEL 系统角色只支持 Libreswan (一个 IPsec 实现),作为 VPN 供应商。

31.1. 使用 vpn RHEL 系统角色使用 PSK 身份验证创建主机到主机的 IPsec VPN

您可以使用 IPsec 通过 VPN 直接连接主机。主机可以使用预共享密钥(PSK)来相互进行身份验证。通过使用 vpn RHEL 系统角色,您可以使用 PSK 身份验证自动创建 IPsec 主机到主机连接的过程。

默认情况下,该角色创建基于隧道的 VPN。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    hosts: <list>

    使用您要配置 VPN 的主机定义 YAML 字典。如果条目不是 Ansible 受管节点,您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard

    该角色在每个受管节点上配置 VPN 连接。连接名为 < host_A&gt;-to-<host_B >,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色不能在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。

    auth_method: psk
    启用主机间的 PSK 身份验证。该角色使用控制节点上的 openssl 创建 PSK。
    auto: <start-up_method>
    指定连接的启动方法。有效值包括 添加ondemandstartignore。详情请查看安装了 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 确认连接成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 启动 以外的值,您可能需要首先手动激活受管节点上的连接。

31.2. 使用 PSK 身份验证创建主机到主机的 IPsec VPN,并使用 vpn RHEL 系统角色分隔数据和 control plane

您可以使用 IPsec 通过 VPN 直接连接主机。例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn RHEL 系统角色,您可以使用单独的数据和 control plane 和 PSK 身份验证自动创建 IPsec 主机到主机连接的过程。

先决条件

流程

  1. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    hosts: <list>

    使用您要配置 VPN 的主机定义 YAML 字典。连接名为 < name>-<IP_address_A>-to- <IP_address_B >,如 control_plane_vpn-203.0.113.1-to-198.51.100.2

    该角色在每个受管节点上配置 VPN 连接。请注意,该角色不能在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。

    auth_method: psk
    启用主机间的 PSK 身份验证。该角色在控制节点上使用 openssl 创建预共享密钥。
    auto: <start-up_method>
    指定连接的启动方法。有效值包括 添加ondemandstartignore。详情请查看安装了 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

验证

  • 确认连接成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
    Copy to Clipboard

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 启动 以外的值,您可能需要首先手动激活受管节点上的连接。

31.3. 使用 vpn RHEL 系统角色在多个主机中使用基于证书的身份验证创建 IPsec mesh VPN

Libreswan 支持创建一个 opportunistic mesh,以便在每个主机上具有单个配置的大量主机之间建立 IPsec 连接。在网格中添加主机不需要更新现有主机上的配置。为提高安全性,请在 Libreswan 中使用基于证书的身份验证。

通过使用 vpn RHEL 系统角色,您可以使用受管节点中的基于证书的身份验证自动配置 VPN 网格。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您可以为每个受管节点准备一个 PKCSautomationhub 文件:

    • 每个文件包含:

      • 证书颁发机构(CA)证书
      • 节点的私钥
      • 节点的客户端证书
    • 这些文件名为 < managed_node_name_as_in_the_inventory>.p12
    • 文件存储在与 playbook 相同的目录中。

流程

  1. 编辑 ~/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
    Copy to Clipboard

    cert_name 变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。

  2. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pkcs12_pwd: <password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Remove IPsec NSS database files
          ansible.builtin.file:
            path: "{{ item.path }}"
            state: absent
          loop: "{{ db_files.files }}"
          when: db_files.matched > 0
    
        - name: Initialize IPsec NSS database
          ansible.builtin.command:
            cmd: ipsec initnss
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    opportunistic: true
    在多个主机间启用 opportunistic mesh。policies 变量定义哪些子网和主机流量必须或可以加密,哪些应该继续使用明文连接。
    auth_method: cert
    启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
    policies: & lt;list_of_policies>

    以 YAML 列表格式定义 Libreswan 策略。

    默认策略是 private-or-clear。要将它更改为 私有,上面的 playbook 包含默认 cidr 条目的 according 策略。

    如果 Ansible 控制节点与受管节点位于同一个 IP 子网中,则防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加 清晰 策略。例如,如果应该为 192.0.2.0/24 子网配置了网格,并且控制节点使用 IP 地址 192.0.2.1,则需要 明文策略用于 192.0.2.1/32,如 playbook 所示。

    有关策略的详情,请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。

    vpn_manage_firewall: true
    定义该角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义该角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  4. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  1. 在网格的一个节点中,ping 另一个节点激活连接:

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard
  2. 确认连接处于活跃状态:

    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
    Copy to Clipboard

第 32 章 使用 RHEL 系统角色配置 Microsoft SQL Server

您可以使用 microsoft.sql.server Ansible 系统角色自动化 Microsoft SQL Server 的安装和管理。此角色还通过应用 mssql TuneD 配置文件优化 Red Hat Enterprise Linux (RHEL),来提高 SQL Server 的性能和吞吐量。

注意

在安装过程中,角色将 SQL Server 的存储库及相关软件包添加到受管主机。这些存储库中的软件包由 Microsoft 提供、维护和托管。

32.1. 使用 microsoft.sql.server Ansible 系统角色,使用现有 TLS 证书安装和配置 SQL Server

如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。通过使用 microsoft.sql.server Ansible 系统角色,您可以自动化这个过程,并使用 TLS 加密远程安装和配置 SQL Server。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。

根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:

  • RHEL 7.9: SQL Server 2017 和 2019
  • RHEL 8: SQL Server 2017, 2019, 和 2022
  • RHEL 9.4 及更新版本:SQL Server 2022

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
  • 您将 sql_crt.pem 文件中的证书存储在与 playbook 相同的目录中。
  • 您将 sql_cert.key 文件中的私钥存储在与 playbook 相同的目录中。
  • SQL 客户端信任签发证书的 CA。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    mssql_tls_enable: true
    启用 TLS 加密。如果启用此设置,您还必须定义 mssql_tls_certmssql_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 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 在 SQL Server 主机上,使用带有 -N 参数的 sqlcmd 工具来建立到 SQL 服务器的加密连接,并运行查询,例如:

    $ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
    Copy to Clipboard

    如果命令成功,则到服务器的连接是 TLS 加密的。

32.2. 使用 microsoft.sql.server Ansible 系统角色,使用 IdM 发布的 TLS 证书安装和配置 SQL Server

如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。如果 SQL Server 主机是 Red Hat Enterprise Linux Identity Management (IdM)域中的成员,certmonger 服务可以管理证书请求和将来的续订。

通过使用 microsoft.sql.server Ansible 系统角色,您可以自动化此过程。您可以使用 TLS 加密远程安装和配置 SQL Server,microsoft.sql.server 角色使用 certificate Ansible 系统角色来配置 certmonger ,并从 IdM 请求证书。

根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:

  • RHEL 7.9: SQL Server 2017 和 2019
  • RHEL 8: SQL Server 2017, 2019, 和 2022
  • RHEL 9.4 及更新版本:SQL Server 2022

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
  • 您在 Red Hat Enterprise Linux Identity Management (IdM)域中注册了受管节点。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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
    Copy to Clipboard

    示例 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 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  • 在 SQL Server 主机上,使用带有 -N 参数的 sqlcmd 工具来建立到 SQL 服务器的加密连接,并运行查询,例如:

    $ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'
    Copy to Clipboard

    如果命令成功,则到服务器的连接是 TLS 加密的。

32.3. 使用 microsoft.sql.server Ansible 系统角色,使用自定义存储路径安装和配置 SQL Server,

当您使用 microsoft.sql.server Ansible 系统角色来安装和配置新的 SQL Server 时,您可以自定义数据的路径和模式,以及日志目录。例如,如果要将数据库和日志文件存储在具有多个存储的不同的目录中,请配置自定义路径。

重要

如果您更改了数据或日志路径,并重新运行 playbook,之前使用的目录及其所有内容都保持在原始路径。只有新的数据库和日志保存在新位置。

表 32.1. SQL Server 默认的数据和日志目录设置
类型目录模式所有者

data

/var/opt/mssql/data/

[a]

mssql

mssql

Logs

/var/opt/mssql/los/

[a]

mssql

mssql

[a] 如果目录存在,则角色保留模式。如果目录不存在,角色在创建目录时在受管节点上应用默认 umask

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 编辑一个现有的 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'
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    mssql_datadir_mode and mssql_logdir_mode
    设置权限模式。在单引号中指定值,以确保角色将值解析为字符串,而不是解析为八进制数。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/microsoft.sql-server/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

验证

  1. 显示数据目录的模式:

    $ ansible managed-node-01.example.com -m command -a 'ls -ld /var/lib/mssql/'
    drwx------. 12 mssql mssql 4096 Jul  3 13:53 /var/lib/mssql/
    Copy to Clipboard
  2. 显示日志目录的模式:

    $ ansible managed-node-01.example.com -m command -a 'ls -ld /var/log/mssql/'
    drwx------. 12 mssql mssql 4096 Jul  3 13:53 /var/log/mssql/
    Copy to Clipboard

32.4. 使用 microsoft.sql.server Ansible 系统角色安装和配置带有 AD 集成的 SQL Server

您可以将 Microsoft SQL Server 集成到活动目录(AD)中,以使 AD 用户能够认证到 SQL Server。通过使用 microsoft.sql.server Ansible 系统角色,您可以自动化此过程,并相应地远程安装和配置 SQL Server。请注意,在运行 playbook 后,您仍必须在 AD 和 SQL Server 中执行手动步骤。

根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:

  • RHEL 7.9: SQL Server 2017 和 2019
  • RHEL 8: SQL Server 2017, 2019, 和 2022
  • RHEL 9.4 及更新版本:SQL Server 2022

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
  • 网络中有一个 AD 域。
  • AD 中存在一个反向 DNS (RDNS)区域,其包含每个 AD 域控制器(DC)的指针(PTR)资源记录。
  • 受管主机的网络设置使用 AD DNS 服务器。
  • 受管主机可以解析以下 DNS 条目:

    • AD DC 的主机名和完全限定域名(FQDN)都解析到它们的 IP 地址。
    • AD DC 的 IP 地址解析到它们的 FQDN。

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
      sql_pwd: <SQL_AD_password>
      ad_admin_pwd: <AD_admin_password>
      Copy to Clipboard
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 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 }}"
    Copy to Clipboard

    示例 playbook 中指定的设置包括以下内容:

    mssql_ad_configure: true
    启用 AD 的身份验证。
    mssql_ad_join: true
    使用 ad_integration RHEL 系统角色将受管节点加入到 AD。角色使用 ad_integration_realmad_integration_userad_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 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard
  5. 授权应能够认证到 SQL Server 的 AD 用户。在 SQL Server 上,执行以下步骤:

    1. Administrator 用户获取一个 Kerberos 票据:

      $ kinit Administrator@ad.example.com
      Copy to Clipboard
    2. 授权 AD 用户:

      $ /opt/mssql-tools/bin/sqlcmd -S. -Q 'CREATE LOGIN [AD\<AD_user>] FROM WINDOWS;'
      Copy to Clipboard

      对应该能够访问 SQL Server 的每个 AD 用户重复此步骤。

验证

  • 在运行 SQL Server 的受管节点上:

    1. 为 AD 用户获取一个 Kerberos 票据:

      $ kinit <AD_user>@ad.example.com
      Copy to Clipboard
    2. 使用 sqlcmd 工具登录到 SQL Server ,并运行查询,例如:

      $ /opt/mssql-tools/bin/sqlcmd -S. -Q 'SELECT SYSTEM_USER'
      Copy to Clipboard

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat