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


Red Hat Enterprise Linux 8

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

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

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

  • ad_integration :活动目录集成
  • bootloader :GRUB 引导装载程序管理
  • certificate :证书颁发和续订
  • cockpit :Web 控制台安装和配置
  • crypto_policies: 系统范围的加密策略
  • fapolicy: 文件访问策略守护进程配置
  • firewall: Firewalld 管理
  • ha_cluster: HA 集群管理
  • journald: Systemd journald 管理
  • kdump: 内核转储管理
  • kernel_settings: 内核设置管理
  • logging :配置日志记录
  • metrics :性能监控和指标
  • nbde_client: 网络绑定磁盘加密客户端
  • nbde_server: 网络绑定磁盘加密服务器
  • network:网络配置
  • podman: Podman 容器管理
  • postfix :Postfix 配置
  • postgresql: PostgreSQL 配置
  • rhc :订阅 RHEL 和配置 Insights 客户端
  • selinux: SELinux 管理
  • ssh :SSH 客户端配置
  • sshd :SSH 服务器配置
  • storage :存储管理
  • systemd: 管理 systemd 单元
  • timesync: 时间同步
  • tlog: 终端会话记录
  • vpn :配置 IPsec VPN

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

  • Microsoft.sql.server: Microsoft SQL Server

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

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

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

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

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

先决条件

  • RHEL 8.6 或更高版本已安装。有关安装 RHEL 的更多信息,请参阅 从安装介质交互安装 RHEL

    注意

    在 RHEL 8.5 及更早版本中,Ansible 软件包通过 Ansible Engine 提供,而不是通过 Ansible Core ,并具有不同的支持级别。不要使用 Ansible Engine,因为软件包可能与 RHEL 8.6 及之后版本中的 Ansible 自动化内容不兼容。如需更多信息,请参阅 RHEL 9 和 RHEL 8.6 以及后期的 AppStream 存储库中包含的 Ansible Core 软件包的支持范围

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

步骤

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

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

    [root@control-node]# su - ansible

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

  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>
    ...

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

  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
    注意

    ~/.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

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

  7. 安装 RHEL 系统角色:

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

      [root@control-node]# yum install rhel-system-roles

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

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

      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

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

后续步骤

2.2. 准备受管节点

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

先决条件

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

    重要

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

流程

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

    [root@managed-node-01]# useradd ansible

    控制节点稍后使用这个用户建立与这个主机的 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.

    当 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.
    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
    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.
    4. 通过在控制节点上远程执行命令来验证 SSH 连接:

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

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

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

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

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

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

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

        ansible   ALL=(ALL) NOPASSWD: ALL

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

验证

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

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

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

  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
    ...

    如果命令返回 root,则您在受管节点上正确地配置了 sudo

第 3 章 Ansible vault

有时,您的 playbook 需要使用敏感数据,如密码、API 密钥和其他 secret 来配置受管主机。将此信息以纯文本形式存储在变量或其他与 Ansible 兼容的文件中存在安全风险,因为有权访问这些文件的任何用户都可以读取敏感数据。

使用 Ansible vault,您可以加密、解密、查看和编辑敏感信息。它们可以包括:

  • 在 Ansible Playbook 中插入的变量文件
  • 主机和组变量
  • 执行 playbook 时作为参数传递的变量文件
  • Ansible 角色中定义的变量

您可以使用 Ansible vault 安全地管理单个变量、整个文件,甚至像 YAML 文件这样的结构化数据。然后,这些数据可以安全地存储在版本控制系统中,或者与团队成员共享,而无需公开敏感信息。

重要

文件使用高级加密标准(AES256)的对称加密进行了保护,其中单个密码或密码短语用于加密和解密数据。请注意,这一操作方式尚未被第三方正式审核。

要简化管理,设置您的 Ansible 项目,以便敏感变量和所有其他变量都保存在单独的文件或目录中是有意义的。然后,您可以使用 ansible-vault 命令保护包含敏感变量的文件。

创建一个加密的文件

以下命令提示您输入新的 vault 密码。然后,它使用默认编辑器打开一个文件以存储敏感变量。

# ansible-vault create vault.yml
New Vault password: <vault_password>
Confirm New Vault password: <vault_password>

查看一个加密的文件

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

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

编辑一个加密的文件

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

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

加密一个现有文件

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

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

解密一个现有文件

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

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

更改加密文件的密码

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

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

playbook 中 Ansible vault 变量的基本应用

---
- name: Create user accounts for all servers
  hosts: managed-node-01.example.com
  vars_files:
    - ~/vault.yml
  tasks:
    - name: Create user from vault.yml file
      user:
        name: "{{ username }}"
        password: "{{ pwhash }}"

您在 Ansible Playbook 的 vars_files 部分中使用变量(vault.yml)读取文件,并使用与使用普通变量相同的方式使用花括号。然后,您可以使用 ansible-playbook --ask-vault-pass 命令运行 playbook,并手动输入密码。或者,您可以将密码保存到单独的文件中,并使用 ansible-playbook --vault-password-file /path/to/my/vault-password-file 命令运行 playbook。

如果您的机构使用 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 角色。

您可以使用 ad_integration RHEL 系统角色自动化将 RHEL 加入到活动目录(AD)域的过程。

先决条件

流程

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

    1. 创建 vault :

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

      usr: administrator
      pwd: <password>
    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"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 检查 AD 用户(如 administrator )是否在受管节点上本地可用:

    $ ansible managed-node-01.example.com -m command -a 'getent passwd administrator@ad.example.com'
    administrator@ad.example.com:*:1450400500:1450400513:Administrator:/home/administrator@ad.example.com:/bin/bash

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

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

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

您可以使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

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

先决条件

流程

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

    1. 创建 vault :

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

      pwd: <password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

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

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

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

    GRUB2 引导装载程序条目详情

您可以使用 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

    示例 playbook 中指定的设置包括如下:

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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 远程重启受管节点:

    # ansible managed-node-01.example.com -m ansible.builtin.reboot
    managed-node-01.example.com | CHANGED => {
        "changed": true,
        "elapsed": 21,
        "rebooted": true
    }
  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

您可以使用 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 在控制节点上运行前面的 playbook 后,您会看到类似的命令行输出,如下例中所示:

    ...
        "bootloader_facts": [
            {
                "args": "ro crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap $tuned_params quiet",
                "default": true,
                "id": "2c9ec787230141a9b087f774955795ab-5.14.0-362.24.1.el9_3.aarch64",
                "index": "1",
                "initrd": "/boot/initramfs-5.14.0-362.24.1.el9_3.aarch64.img $tuned_initrd",
                "kernel": "/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64",
                "root": "/dev/mapper/rhel-root",
                "title": "Red Hat Enterprise Linux (5.14.0-362.24.1.el9_3.aarch64) 9.4 (Plow)"
            }
        ]
    ...

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

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

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

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

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

如果 Red Hat Enterprise Linux 主机是 RHEL 身份管理(IdM)环境的成员,则您可以从 IdM 证书颁发机构(CA)请求 TLS 证书,并在此主机上运行的服务中使用它们。通过使用 certificate 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 列出 certmonger 服务管理的证书:

    # ansible managed-node-01.example.com -m command -a 'getcert list'
    ...
    Number of certificates and requests being tracked: 1.
    Request ID '20240918142211':
            status: MONITORING
            stuck: no
            key pair storage: type=FILE,location='/etc/pki/tls/private/web-server.key'
            certificate: type=FILE,location='/etc/pki/tls/certs/web-server.crt'
            CA: IPA
            issuer: CN=Certificate Authority,O=EXAMPLE.COM
            subject: CN=www.example.com
            issued: 2024-09-18 16:22:11 CEST
            expires: 2025-09-18 16:22:10 CEST
            dns: www.example.com
            key usage: digitalSignature,keyEncipherment
            eku: id-kp-serverAuth,id-kp-clientAuth
            pre-save command: systemctl stop httpd.service
            post-save command: systemctl start httpd.service
            track: yes
            auto-renew: yes

如果需要用于测试环境的 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 列出 certmonger 服务管理的证书:

    # ansible managed-node-01.example.com -m command -a 'getcert list'
    ...
    Number of certificates and requests being tracked: 1.
    Request ID '20240918133610':
    	status: MONITORING
    	stuck: no
    	key pair storage: type=FILE,location='/etc/pki/tls/private/web-server.key'
    	certificate: type=FILE,location='/etc/pki/tls/certs/web-server.crt'
    	CA: local
    	issuer: CN=c32b16d7-5b1a4c5a-a953a711-c3ca58fb,CN=Local Signing Authority
    	subject: CN=test.example.com
    	issued: 2024-09-18 15:36:10 CEST
    	expires: 2025-09-18 15:36:09 CEST
    	dns: test.example.com
    	key usage: digitalSignature,keyEncipherment
    	eku: id-kp-serverAuth,id-kp-clientAuth
    	pre-save command:
    	post-save command:
    	track: yes
    	auto-renew: yes

使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

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

您可以使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
警告

因为 FIPS:OSPP 系统范围的子策略包含对通用标准(CC)认证所需的加密算法的进一步限制,所以在设置后,系统的互操作性较差。例如,您无法使用少于 3072 位的 RSA 和 DH 密钥、额外的 SSH 算法和几个 TLS 组。设置 FIPS:OSPP 也会阻止连接到 Red Hat Content Delivery Network (CDN)结构。另外,您无法将活动目录(AD)集成到使用 FIPS:OSPP 的 IdM 部署,使用 FIPS:OSPP 的 RHEL 主机和 AD 域之间的通信可能无法工作,或者某些 AD 帐户可能无法进行身份验证。

请注意,在设置了 FIPS:OSPP 加密子策略后,您的系统不符合 CC 。使 RHEL 系统符合 CC 标准的唯一正确方法是遵循 cc-config 软件包中提供的指导。有关认证的 RHEL 版本的列表、验证报告以及到 国家信息保障合作伙伴(NIAP) 网站上托管的 CC 的链接,请参阅 产品合规 红帽客户门户网页上的 通用标准 部分。

验证

  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

    示例 playbook 中指定的设置包括如下:

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

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

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

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

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

重要

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

您可以使用 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>

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

第 10 章 使用 RHEL 系统角色配置 firewalld

RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供一个一致的配置接口,来一次远程管理多个系统。

rhel-system-roles 软件包包含 rhel-system-roles.firewall RHEL 系统角色。此角色是为了自动化 firewalld 服务的配置而引入的。

使用 firewall RHEL 系统角色,您可以配置许多不同的 firewalld 参数,例如:

  • 区域
  • 应允许哪些数据包的服务
  • 授予、拒绝或丢弃到端口的流量访问
  • 区域的端口或端口范围的转发

随着时间的推移,对防火墙配置的更新可能会积累到一定程度,从而造成意外的安全风险。使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

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

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

先决条件

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

作为系统管理员,您可以使用 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 在控制节点上,运行以下命令来远程检查有关受管节点上 dmz 区域的信息:

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all'
    managed-node-01.example.com | CHANGED | rc=0 >>
    dmz (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0
      sources:
      services: https ssh
      ports:
      protocols:
      forward: no
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:

通过 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 High Availability Add-On 的订阅,否则系统角色将失败。
ha_cluster_enable_repos_resilient_storage
(RHEL 8.10 及更高版本)一个布尔值标志,其启用包含弹性存储软件包(如 dlmgfs2)的存储库。要使此选项生效,ha_cluster_enable_repos 必须设置为 true。此变量的默认值为 false
ha_cluster_manage_firewall

(RHEL 8.8 及更高版本)一个布尔值标志,其决定 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 8.8 及更高版本中,防火墙不再被默认配置,因为它仅在 ha_cluster_manage_firewall 被设置为 true 时才被配置。

ha_cluster_manage_selinux

(RHEL 8.8 及更高版本)一个布尔值标志,其决定 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
ha_cluster_start_on_boot
确定是否将集群服务配置为在引导时启动的布尔值标志。此变量的默认值为 true
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 8.9 及更高版本)为仲裁设备指定 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 8.8 及更高版本)使用 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 RHEL 系统角色中指定的变量 certificate_requests 的值。有关 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
ha_cluster_cluster_name
集群的名称。这是一个字符串值,默认值为 my-cluster
ha_cluster_transport

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

  • 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) man page 的 cluster 部分中的 setup 描述。有关更详细的描述,请查看 corosync.conf(5) man page。

ha_cluster_transport 变量的结构如下:

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

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

ha_cluster_totem

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

ha_cluster_totem 变量的结构如下:

ha_cluster_totem:
  options:
    - name: option1_name
      value: option1_value
    - name: option2_name
      value: option2_value

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

ha_cluster_quorum

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

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

    • 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

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

ha_cluster_sbd_enabled

(RHEL 8.7 和更高版本) 一个布尔值标记,它决定集群是否可以使用 SBD 节点隔离机制。此变量的默认值为 false

有关启用 SBD 的 ha_cluster 系统角色 playbook 的示例,请参阅 配置带有 SBD 节点隔离的高可用性集群

ha_cluster_sbd_options

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

支持的选项包括:

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

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

使用 SBD 时,您可以选择性地为清单中的每个节点配置 watchdog 和 SBD 设备。有关在清单文件中配置 watchdog 和 SBD 设备的详情,请参考 为 ha_cluster 系统角色指定清单

ha_cluster_cluster_properties

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

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

ha_cluster_cluster_properties:
  - attrs:
      - name: property1_name
        value: property1_value
      - name: property2_name
        value: property2_value

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

以下示例 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
ha_cluster_node_options

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

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

  • node_name(必需)- 为其定义 Pacemaker 节点属性的节点的名称。它必须匹配为节点定义的名称。
  • attributes(可选)- 节点的 Pacemaker 节点属性集合的列表。目前,只支持一个集合。使用第一个集合,其余的忽略。

ha_cluster_node_options 变量的结构如下:

ha_cluster_node_options:
  - node_name: node1
    attributes:
      - attrs:
          - name: attribute1
            value: value1_node1
          - name: attribute2
            value: value2_node1
  - node_name: node2
    attributes:
      - attrs:
          - name: attribute1
            value: value1_node2
          - name: attribute2
            value: value2_node2

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

有关包含节点选项配置的 ha_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 8.9 及更新版本)资源代理通常为资源操作定义默认设置,如 intervaltimeout,为特定代理进行了优化。如果此变量被设为 true,则这些设置将被复制到资源配置中。否则,集群范围的默认值应用到资源。如果您使用 ha_cluster_resource_operation_defaults 角色变量为资源定义资源操作默认值,则您可以将其设置为 false。此变量的默认值为 true
  • operations (可选) - 资源操作列表。

    • action(必需)- pacemaker 以及资源或隔离代理定义的操作措施。
    • attrs(必需)- 操作选项,必须至少指定一个选项。

使用 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

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

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

ha_cluster_resource_groups

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

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

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

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

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

有关包含资源组配置的 ha_cluster 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

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

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

ha_cluster_resource_defaults

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

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

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

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

ha_cluster_resource_defaults 变量的结构如下:

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

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

ha_cluster_resource_operation_defaults

(RHEL 8.9 及更新版本)此变量定义资源操作默认值的集合。您可以定义多个默认值集合,并使用规则将它们应用到特定代理的资源和特定的资源操作。使用 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 8.10 及更高版本)此变量定义 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

有关配置隔离默认值的 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

您为资源位置约束配置的项目,用于指定资源模式是为资源位置约束配置的相同项目,用于指定资源 ID,但资源规格本身除外。您为资源规格指定的项目如下:

  • pattern (必需)- POSIX 扩展正则表达式资源 ID 与.

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

ha_cluster_constraints_location:
  - resource:
      pattern: resource-pattern
    node: node-name
    id: constraint-id
    options:
      - name: score
        value: score-value
      - name: resource-discovery
        value: resource-discovery-value

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

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

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

为资源位置约束配置的项目,用于指定资源模式,规则是用于资源位置约束的相同项目,用于指定资源 ID 和规则,但资源规格本身除外。您为资源规格指定的项目如下:

  • pattern (必需)- POSIX 扩展正则表达式资源 ID 与.

指定资源模式和规则的资源位置约束结构如下:

ha_cluster_constraints_location:
  - resource:
      pattern: resource-pattern
      role: resource-role
    rule: rule-string
    id: constraint-id
    options:
      - name: score
        value: score-value
      - name: resource-discovery
        value: resource-discovery-value

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

ha_cluster_constraints_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

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

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

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

资源集托管约束的结构如下:

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

有关创建具有资源约束的集群的 ha_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

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

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

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

资源集顺序约束的结构如下:

ha_cluster_constraints_order:
  - resource_sets:
      - resource_ids:
          - resource-id1
          - resource-id2
        options:
          - name: option-name
            value: option-value
    id: constraint-id
    options:
      - name: score
        value: score-value
      - name: option-name
        value: option-value

有关创建具有资源约束的集群的 ha_cluster 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

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

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

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

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

ha_cluster_constraints_ticket:
  - resource_sets:
      - resource_ids:
          - resource-id1
          - resource-id2
        options:
          - name: option-name
            value: option-value
    ticket: ticket-name
    id: constraint-id
    options:
      - name: option-name
        value: option-value

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

ha_cluster_qnetd

(RHEL 8.8 及更高版本)此变量配置 qnetd 主机,然后其可以作为集群的外部仲裁设备。

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

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

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

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

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

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

11.2.1. 在清单中配置节点名称和地址

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

  • 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

11.2.2. 在清单中配置 watchdog 和 SBD 设备

(RHEL 8.7 及更高版本)使用 SBD 时,您可以有选择地为清单中的每个节点配置 watchdog 和 SBD 设备。虽然所有 SBD 设备都必须与所有节点共享并可从所有节点访问,但每个节点可以为设备使用不同的名称。每个节点的 watchdog 设备也可以不同。有关您可以在系统角色 playbook 中设置的 SBD 变量的详情,请查看 ha_cluster RHEL 系统角色变量 中的 ha_cluster_sbd_enabledha_cluster_sbd_options 条目。

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

  • sbd_watchdog_modules (可选)- (RHEL 8.9 及更新版本)要载入的 Watchdog 内核模块,其创建 /dev/watchdog* 设备。如果没有设置,则默认为空列表。
  • sbd_watchdog_modules_blocklist (可选)- (RHEL 8.9 及更新版本)要卸载和阻止的 Watchdog 内核模块。如果没有设置,则默认为空列表。
  • sbd_watchdog - SBD 使用的 Watchdog 设备。如果没有设置,则默认为 /dev/watchdog
  • sbd_devices - 用于交换 SBD 信息和监控的设备。如果没有设置,则默认为空列表。始终引用使用长而稳定的设备名称(/dev/disk/by-id/)的设备。

以下示例显示了为目标 node1node2 配置 watchdog 和 SBD 设备的清单。

all:
  hosts:
    node1:
      ha_cluster:
        sbd_watchdog_modules:
          - module1
          - module2
        sbd_watchdog: /dev/watchdog2
        sbd_devices:
          - /dev/disk/by-id/000001
          - /dev/disk/by-id/000001
          - /dev/disk/by-id/000003
    node2:
      ha_cluster:
        sbd_watchdog_modules:
          - module1
        sbd_watchdog_modules_blocklist:
          - module2
        sbd_watchdog: /dev/watchdog1
        sbd_devices:
          - /dev/disk/by-id/000001
          - /dev/disk/by-id/000002
          - /dev/disk/by-id/000003

有关创建使用 SBD 隔离的高可用性集群的流程示例,请参阅 配置带有 SBD 节点隔离的高可用性集群

(RHEL 8.8 及更高版本)集群节点之间的连接是使用传输层安全(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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

(RHEL 8.9 及更高版本)在集群配置中,您可以更改所有资源的资源选项的 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

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

(RHEL 8.10 及更高版本)当您为节点配置多个隔离设备时,您需要为这些设备定义隔离级别,以决定 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
      fence1_password: <fence1_password>
      fence2_password: <fence2_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

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

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

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

警告

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

先决条件

流程

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

    1. 创建 vault :

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

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

11.10. 使用 SBD 节点隔离配置高可用性集群

(RHEL 8.7 及更高版本)以下流程使用 ha_cluster RHEL 系统角色创建一个使用 SBD 节点隔离的高可用性集群。

警告

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

此 playbook 使用一个加载 watchdog 模块的清单文件(在 RHEL 8.9 及更新版本中支持),如 在清单中配置 watchdog 和 SBD 设备 中所述。

先决条件

流程

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

    ---
    - name: Create a high availability cluster that uses SBD node fencing
      hosts: node1 node2
      roles:
        - rhel-system-roles.ha_cluster
      vars:
        ha_cluster_cluster_name: my-new-cluster
        ha_cluster_hacluster_password: <password>
        ha_cluster_manage_firewall: true
        ha_cluster_manage_selinux: true
        ha_cluster_sbd_enabled: yes
        ha_cluster_sbd_options:
          - name: delay-start
            value: 'no'
          - name: startmode
            value: always
          - name: timeout-action
            value: 'flush,reboot'
          - name: watchdog-timeout
            value: 30
        # Suggested optimal values for SBD timeouts:
        # watchdog-timeout * 2 = msgwait-timeout (set automatically)
        # msgwait-timeout * 1.2 = stonith-timeout
        ha_cluster_cluster_properties:
          - attrs:
              - name: stonith-timeout
                value: 72
        ha_cluster_resource_primitives:
          - id: fence_sbd
            agent: 'stonith:fence_sbd'
            instance_attrs:
              - attrs:
                  # taken from host_vars
                  - name: devices
                    value: "{{ ha_cluster.sbd_devices | join(',') }}"
                  - name: pcmk_delay_base
                    value: 30

    这个 playbook 示例文件配置一个运行 firewalldselinux 服务的集群,其使用 SBD 隔离并创建 SBD Stonith 资源。

    为生产环境创建 playbook 文件时,vault 会加密密码,如在 使用 Ansible Vault 加密内容 中所述。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

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

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

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

11.11.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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

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

11.11.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

    示例 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

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

  3. 运行 playbook:

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

11.12. 配置带有节点属性的高可用性集群

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

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

以下流程示例使用 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      cluster_password: <cluster_password>
    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
    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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

    其他资源

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

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

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

警告

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

先决条件

流程

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

    1. 创建 vault :

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

      cluster_password: <cluster_password>
    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

    示例 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

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

  4. 运行 playbook:

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

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

    # /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    • 对于 RHEL 8.6 及之后的版本,将您删除的行替换为以下三行,将 /var/run/httpd-website.pid 指定为 PID 文件路径,其中 website 是 Apache 资源的名称。在本例中,Apache 资源名称是 Website

      /usr/bin/test -f /var/run/httpd-Website.pid >/dev/null 2>/dev/null &&
      /usr/bin/ps -q $(/usr/bin/cat /var/run/httpd-Website.pid) >/dev/null 2>/dev/null &&
      /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd-Website.pid" -k graceful > /dev/null 2>/dev/null || true
    • 对于 RHEL 8.5 及更早版本,将您删除的行替换为以下三行:

      /usr/bin/test -f /run/httpd.pid >/dev/null 2>/dev/null &&
      /usr/bin/ps -q $(/usr/bin/cat /run/httpd.pid) >/dev/null 2>/dev/null &&
      /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true

验证

  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
  2. 集群启动并运行后,您可以将浏览器指向定义为 IPaddr2 资源的 IP 地址,来查看示例显示,包含简单的单词"Hello"。

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

    [root@z1 ~]# pcs node standby z1.example.com
  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

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

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

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

    待机 模式中删除节点本身不会导致资源切换到该节点。这将依赖于资源的 resource-stickiness 值。有关 resource-stickiness 元属性的详情,请参考 配置资源以首选其当前节点

第 12 章 使用 RHEL 系统角色配置 systemd 日志

使用 journald RHEL 系统角色,您可以自动化 systemd 日志,并使用 Red Hat Ansible Automation Platform 配置持久性日志记录。

默认情况下,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>

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

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

内核崩溃转储是诊断和故障排除系统问题的一个重要特性。当您的系统遇到内核 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

您可以使用 kernel_settings RHEL 系统角色在多个客户端上同时配置内核参数。同时配置有以下优点:

  • 提供带有有效输入设置的友好接口。
  • 保留所有预期的内核参数。

从控制计算机运行 kernel_settings 角色后,内核参数将立即应用于受管系统,并在重新启动后保留。

重要

请注意,通过 RHEL 渠道提供的 RHEL 系统角色在默认的 AppStream 存储库中作为 RPM 软件包提供给 RHEL 客户。RHEL 系统角色也可作为集合提供给具有通过 Ansible Automation Hub 的 Ansible 订阅的客户。

您可以使用 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

    示例 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

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

  2. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

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

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

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

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

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

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

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

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

您可以使用 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]

    示例 playbook 中指定的设置包括如下:

    logging_inputs
    定义一个记录输入字典的列表。type: basics 选项涵盖了来自 systemd 日志或 Unix 套接字的输入。
    logging_outputs
    定义一个记录输出字典的列表。type: files 选项支持将日志存储在本地文件中,通常存储在 /var/log/ 目录中。property: msg; property: containsproperty_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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

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

    1. 发送测试信息:

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

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

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

您可以使用 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]

    示例 playbook 的第一个 play 中指定的设置包括以下:

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

    示例 playbook 的第二个 play 中指定的设置包括以下:

    logging_inputs
    定义一个记录输入字典的列表。type: basics 选项涵盖了来自 systemd 日志或 Unix 套接字的输入。
    logging_outputs
    定义一个记录输出字典的列表。type: forwards 选项支持通过网络将日志发送到远程日志服务器。severity: info 选项是指具有信息重要性的日志消息。facility: mail 选项是指正在生成日志消息的系统程序的类型。target: <host1.example.com> 选项指定远程日志记录服务器的主机名。udp_port: 601/tcp_port: 601 选项定义远程日志记录服务器侦听的 UDP/TCP 端口。
    logging_flows
    定义一个记录流字典的列表,以指定 logging_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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  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.
  2. 验证客户端系统向服务器发送信息:

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

      # logger test
    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

      其中 <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 域中注册。

流程

  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]

    示例 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_srcprivate_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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

其他资源

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

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

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

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

注意

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

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

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 受管节点已在 IdM 域中注册。

流程

  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]

    示例 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_srcprivate_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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

15.4. 使用带有 RELP 的 logging RHEL 系统角色

可靠的事件日志协议(RELP)是一种通过 TCP 网络记录数据和消息的网络协议。它确保了事件消息的可靠传递,您可以在不容许任何消息丢失的环境中使用它。

RELP 发送者以命令的形式传输日志条目,接收器会在处理后确认它们。为确保一致性,RELP 将事务数保存到传输的命令中,以便进行任何类型的消息恢复。

您可以考虑在 RELP 客户端和 RELP Server 间的远程日志系统。RELP 客户端将日志传送给远程日志系统,RELP 服务器接收由远程日志系统发送的所有日志。要实现这种用例,您可以使用 logging RHEL 系统角色配置日志记录系统,来可靠地发送和接收日志条目。

15.4.1. 使用 RELP 配置客户端日志

您可以使用 logging RHEL 系统角色配置将保存在本地的日志消息传输到带有 RELP 的远程日志系统。

此流程对 Ansible 清单中 客户端 组中的所有主机配置 RELP。RELP 配置使用传输层安全(TLS)来加密消息传输,保证日志在网络上安全传输。

先决条件

流程

  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]

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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]

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

Performance Co-Pilot (PCP)是一个系统性能分析工具包。您可以使用它来记录和分析 Red Hat Enterprise Linux 系统上许多组件的性能数据。

您可以使用 metrics RHEL 系统角色自动化 PCP 的安装和配置,角色可以配置 Grafana 来视觉化 PCP 指标。

您可以使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询一个指标,例如:

    # ansible managed-node-01.example.com -m command -a 'pminfo -f kernel.all.load'

您可以在 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      metrics_usr: <username>
      metrics_pwd: <password>
    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 }}"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 在安装了 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

      如果命令成功,它会返回 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

如果您已在多个主机上配置了 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      grafana_admin_pwd: <password>
    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 }}"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  1. 在浏览器中打开 http://<grafana_server_IP_or_hostname>:3000,并以 admin 用户身份,使用您在流程中设置的密码登录。
  2. 显示监控数据:

    • 要显示实时数据:

      1. 单击左侧导航栏中的 Performance Co-Pilot 图标,然后选择 PCP Vector Checklist
      2. 默认情况下,图形显示运行 Grafana 的主机中的指标。要切换到其他主机,请在 hostspec 字段中输入主机名,然后按 Enter 键。
    • 要显示存储在 Redis 数据库中的历史数据:创建一个带有 PCP Redis 数据源的面板。这要求您在 playbook 中设置 metrics_query_service: true

第 17 章 使用 RHEL 系统角色配置 NBDE

您可以使用 nbde_clientnbde_server RHEL 系统角色自动部署使用 Clevis 和 Tang 的基于策略的解密(PBD)解决方案。rhel-system-roles 包中包含了这些系统角色、相关的例子以及参考文档。

通过使用 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

    此示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。命令必须返回与您为加密和解密传递的相同的消息:

    # ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt'
    test

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

    这个示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  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/>"}'
  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
    …

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
  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"

    此 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

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

第 18 章 使用 RHEL 系统角色配置网络设置

通过使用 network RHEL 系统角色,您可以自动化与网络相关的配置和管理任务。

要将 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
  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

    此 playbook 从清单文件中动态读取每个主机的某些值,并在 playbook 中对所有主机相同的设置使用静态值。

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

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...

要将 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。使用此角色,您可以将连接配置文件分配给指定的接口名称。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。角色可以根据其路径而不是接口名称将连接配置文件分配给设备。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管主机使用 NetworkManager 配置网络。
  • 您知道设备的路径。您可以使用 udevadm info /sys/class/net/<device_name> | grep ID_PATH= 命令显示设备路径。

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...

网络访问控制(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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 访问需要网络身份验证的网络上的资源。

18.6. 使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 从其中一个网络设备临时拔掉网线,并检查绑定中的其他设备是否在处理流量。

    请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如 nmcli ),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。

18.7. 使用 network RHEL 系统角色配置 VLAN 标记

如果您的网络使用 Virtual Local Area Networks (VLAN)将网络流量分隔到逻辑网络中,请创建一个 NetworkManager 连接配置文件来配置 VLAN 标记。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置 VLAN 标记,如果 VLAN 的父设备的连接配置文件不存在,则角色也可以创建它。

注意

如果 VLAN 设备需要一个 IP 地址、默认网关和 DNS 设置,请在 VLAN 设备上,而不是在父设备上配置它们。

先决条件

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证 VLAN 设置:

    # ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10'
    managed-node-01.example.com | CHANGED | rc=0 >>
    4: vlan10@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        ...

18.8. 使用 network RHEL 系统角色配置网桥

您可以通过创建网桥,在 Open Systems Interconnection (OSI)模型的第 2 层上连接多个网络。要配置网桥,请在 NetworkManager 中创建一个连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置网桥,如果网桥的父设备的连接配置文件不存在,则角色也可以创建它。

注意

如果要为网桥分配 IP 地址、网关和 DNS 设置,请在网桥上,而不是在其端口上配置它们。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  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
  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

如果数据包的目的地无法通过直接连接的网络或主机上配置的任何路由到达,则主机会将网络数据包转发到其默认网关。要配置主机的默认网关,请在作为默认网关连接到与相同网络的 接口的 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
    	    ...
                "gateway": "198.51.100.254",
                "interface": "enp1s0",
    	    ...
            },
            "ansible_default_ipv6": {
    	    ...
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
    	    ...
    	}
    ...

18.10. 使用 network RHEL 系统角色配置静态路由

静态路由确保您可以将流量发送到无法通过默认网关到达的目标。您可以在作为下一跳连接到相同网络的接口的 NetworkManager 连接配置文件中配置静态路由。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  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
  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

您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    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
       ...

      命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    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
       ...

      命令的输出显示路由器通过 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

      默认情况下,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
    3. 显示接口和防火墙区:

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
    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
        ...

网络接口控制器可以使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 Ansible 事实,并验证卸载设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_enp1s0": {
                "active": true,
                "device": "enp1s0",
    	    "features": {
    	        ...
    		"rx_gro_hw": "off,
    	        ...
    		"tx_gso_list": "on,
    	        ...
    		"tx_sctp_segmentation": "off",
    		...
                }
    ...

通过使用中断合并,系统收集网络数据包,并为多个数据包生成一个中断。这会增加使用一个硬件中断发送到内核的数据量,从而减少中断负载,并最大化吞吐量。您可以在网络接口的连接配置文件中配置合并设置。通过使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 显示网络设备的当前卸载功能:

    # ansible managed-node-01.example.com -m command -a 'ethtool -c enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    rx-frames:	128
    ...
    tx-frames:	128
    ...

如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。

环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(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

    示例 playbook 中指定的设置包括如下:

    rx: <value>
    设置接收的环缓冲区条目的最大数。
    tx: <value>
    设置传输的环缓冲区条目的最大数。

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 显示最大环缓冲大小:

    # ansible managed-node-01.example.com -m command -a 'ethtool -g enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    Current hardware settings:
    RX:             4096
    RX Mini:        0
    RX Jumbo:       0
    TX:             4096

18.15. 使用 network RHEL 系统角色配置 IPoIB 连接

您可以使用 IP over InfiniBand (IPoIB),通过 InfiniBand 接口发送 IP 数据包。要配置 IPoIB,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network 系统角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。

您可以使用 network RHEL 系统角色配置 IPoIB,如果 InfiniBand 的父设备的连接配置文件不存在,角色也可以创建它。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 一个名为 mlx4_ib0 的 InfiniBand 设备被安装在受管节点上。
  • 受管节点使用 NetworkManager 配置网络。

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  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
  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
  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

18.16. network RHEL 系统角色的网络状态

network RHEL 系统角色支持 playbook 中的状态配置,来配置设备。为此,请使用 network_state 变量,后面跟上状态配置。

在 playbook 中使用 network_state 变量的好处:

  • 通过与状态配置结合使用声明方法,您可以配置接口,NetworkManager 会在后台为这些接口创建一个配置集。
  • 使用 network_state 变量,您可以指定您需要更改的选项,所有其他选项将保持不变。但是,使用 network_connections 变量,您必须指定所有设置来更改网络连接配置集。
重要

您只能在 network_state 中设置 Nmstate YAML 指令。这些指令与您可以在 network_connections 中设置的变量有所不同。

例如,要使用动态 IP 地址设置创建以太网连接,请在 playbook 中使用以下 vars 块:

Expand

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: up

例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars 块:

Expand

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: down
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: down

第 19 章 使用 RHEL 系统角色管理容器

使用 podman RHEL 系统角色,您可以管理 Podman 配置、容器以及运行 Podman 容器的 systemd 服务。

您可以使用 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

    示例 playbook 中指定的设置包括如下:

    run_as_userrun_as_group
    指定容器是无根的。
    kube_file_content

    包含一个 Kubernetes YAML 文件,定义名为 db 的第一个容器。您可以使用 podman kube generate 命令生成 Kubernetes YAML 文件。

    • db 容器是基于 quay.io/db/db:stable 容器镜像。
    • db 绑定挂载将主机上的 /var/lib/db 目录映射到容器中的 /var/lib/db 目录。Z 标志使用私有的 unshared 标签标记内容,因此只有 db 容器才能访问内容。
    kube_file_src: <path>
    定义第二个容器。控制器节点上 /path/to/webapp.yml 文件的内容将复制到受管节点上的 kube_file 字段中。
    volumes: <list>
    定义要在一个或多个容器中提供的数据源的 YAML 列表。例如,主机上的本地磁盘(hostPath)或其他磁盘设备。
    volumeMounts: <list>
    一个定义目标的 YAML 列表,其中单个容器将挂载一个给定卷。
    podman_create_host_directories: true
    在主机上创建目录。这指示角色检查 hostPath 卷的 kube 规格,并在主机上创建这些目录。如果您需要对所有权和权限有更多的控制,请使用 podman_host_directories

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

  2. 验证 playbook 语法:

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

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

  3. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

您可以使用 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-----

    您在后续步骤中需要此信息。

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

    1. 创建 vault :

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

      root_password: <root_password>
      certificate: |-
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      key: |-
        -----BEGIN PRIVATE KEY-----
        ...
        -----END PRIVATE KEY-----

      确保 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

    流程创建一个与 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

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

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

第 20 章 使用 RHEL 系统角色配置 Postfix MTA

您可以使用 postfix RHEL 系统角色,以自动的方式一致地管理 Postfix 邮件传输代理(MTA)的配置。当您需要时,部署这样的配置很有用,例如:

  • 稳定的邮件服务器:使系统管理员能够配置快速且可扩展的服务器,以发送和接收电子邮件。
  • 保护通信:支持 TLS 加密、身份验证、域黑名单等功能,以确保安全的电子邮件传输。
  • 改进了电子邮件管理和路由:实施过滤器和规则,以便您控制电子邮件流量。
重要

postfix_conf 字典保存支持的 Postfix 配置参数的键值对。Postfix 无法识别为支持的密钥将被忽略。postfix RHEL 系统角色直接将您提供的键值对传递给 postfix_conf 字典,而不验证其语法或限制它们。因此,角色对于熟悉 Postfix 的以及知道如何配置它的人特别有用。

空客户端是一种特殊配置,其中设置 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

您可以使用 postgresql RHEL 系统角色自动化 PostgreSQL 数据库服务器的安装和管理。默认情况下,此角色还通过自动在 PostgreSQL 服务配置文件中配置与性能相关的设置来优化 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
    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

    示例 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 域套接字的未加密的连接。
    • 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
    • 来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在 postgresql_server_conf 变量中适当配置了 listen_addresses 设置,才能从远程地址进行访问。

    使用 postgresql_pg_hba_conf 中的不同设置重新运行 playbook 会使用新设置覆盖 /var/lib/pgsql/data/pg_hba.conf 文件。

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 使用 postgres 超级用户连接到 PostgreSQL 服务器,并执行 \conninfo 元命令:

    # psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
    Password for user postgres:
    You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432".
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)

    如果输出显示 TLS 协议版本和密码详情,则连接可以正常工作,且 TLS 加密已启用。

如果应用程序需要 PostgreSQL 数据库服务器,则您可以配置带有 TLS 加密的 PostgreSQL 服务,以在应用和数据库之间启用安全通信。如果 PostgreSQL 主机是 Red Hat Enterprise Linux Identity Management (IdM)域的成员,则 certmonger 服务可以管理证书请求和将来的续订。

通过使用 postgresql RHEL 系统角色,您可以自动化此过程。您可以远程安装和配置带有 TLS 加密的 PostgreSQL,postgresql 角色使用 certificate RHEL 系统角色配置 certmonger ,并从 IdM 请求证书。

注意

postgresql 角色无法在 firewalld 服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在使用 firewall RHEL 系统角色的 playbook 中添加一个任务。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您在 IdM 域中注册了受管节点。

流程

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

    1. 创建 vault :

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

      pwd: <password>
    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

    示例 playbook 中指定的设置包括如下:

    postgresql_version: <version>

    设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于在受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。

    您无法通过更改 postgresql_version 变量并再次运行 playbook 来升级或降级 PostgreSQL。

    postgresql_password: <password>

    设置 postgres 数据库超级用户的密码。

    您无法通过更改 postgresql_password 变量并再次运行 playbook 来更改密码。

    postgresql_certificates: <certificate_role_settings>
    包含 certificate 角色设置的 YAML 字典的列表。
    postgresql_server_conf: <list_of_settings>

    定义您要角色设置的 postgresql.conf 设置。角色将这些设置添加到 /etc/postgresql/system-roles.conf 文件中,并在 /var/lib/pgsql/data/postgresql.conf 的末尾包含此文件。因此,postgresql_server_conf 变量中的设置会覆盖 /var/lib/pgsql/data/postgresql.conf 中的设置。

    使用 postgresql_server_conf 中的不同设置重新运行 playbook 会使用新设置覆盖 /etc/postgresql/system-roles.conf 文件。

    postgresql_pg_hba_conf: <list_of_authentication_entries>

    /var/lib/pgsql/data/pg_hba.conf 文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。

    示例允许以下到 PostgreSQL 的连接:

    • 使用本地 UNIX 域套接字的未加密的连接。
    • 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
    • 来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在 postgresql_server_conf 变量中适当配置了 listen_addresses 设置,才能从远程地址进行访问。

    使用 postgresql_pg_hba_conf 中的不同设置重新运行 playbook 会使用新设置覆盖 /var/lib/pgsql/data/pg_hba.conf 文件。

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 使用 postgres 超级用户连接到 PostgreSQL 服务器,并执行 \conninfo 元命令:

    # psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
    Password for user postgres:
    You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432".
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)

    如果输出显示 TLS 协议版本和密码详情,则连接可以正常工作,且 TLS 加密已启用。

第 22 章 使用 RHEL 系统角色注册系统

rhc RHEL 系统角色使管理员能够使用红帽订阅管理(RHSM)和 Satellite 服务器自动注册多个系统。该角色还支持使用 Ansible ,进行与 Insights 相关配置和管理任务。默认情况下,当使用 rhc 注册系统时,系统已连接到 Red Hat Insights。另外,使用 rhc,您可以:

  • 配置到 Red Hat Insights 的连接
  • 启用和禁用存储库
  • 配置用于连接的代理
  • 配置 Insights 补救和自动更新
  • 设置系统发行版本
  • 配置 Insights 标签

22.1. 使用 rhc RHEL 系统角色注册系统

您可以使用 rhc RHEL 系统角色通过红帽订阅管理(RHSM)大规模注册多个系统。默认情况下,在注册时 rhc 将系统连接到 Red Hat Insights。注册系统可启用用于管理系统和报告数据的特性和能力。

先决条件

流程

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

    1. 创建 vault :

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

      activationKey: <activation_key>
      organizationID: <organizationID>
      username: <username>
      password: <password>
    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 }}"

      示例 playbook 中指定的设置包括如下:

      rhc_auth: activation_keys
      activation_keys 指定您要使用激活码进行注册。
    • 要使用用户名和密码注册,请使用以下 playbook:

      ---
      - name: Managing systems with the rhc RHEL system role
        hosts: managed-node-01.example.com
        vars_files:
          - ~/vault.yml
        tasks:
          - name: Registering system with username and password
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.rhc
            vars:
              rhc_auth:
                login:
                  username: "{{ username }}"
                  password: "{{ password }}"

    示例 playbook 中指定的设置包括如下:

    rhc_auth: login
    login 指定您要使用用户名和密码进行注册。
  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

当组织使用 Satellite 管理系统时,需要通过 Satellite 注册系统。您可以使用 rhc RHEL 系统角色,使用 Satellite 远程注册您的系统。

先决条件

流程

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

    1. 创建 vault :

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

      activationKey: <activation_key>
      organizationID: <organizationID>
    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

    示例 playbook 中指定的设置包括如下:

    hostname: example.com
    用于系统注册和软件包管理的 Satellite 服务器的完全限定域名(FQDN)。
    port: 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

当使用 rhc RHEL 系统角色注册系统时,角色默认启用到 Red Hat Insights 的连接。Red Hat Insights 是混合云控制台中的一个受管服务,它使用预测分析、修复功能和深度域专业知识来简化复杂的操作任务。如果不需要,您可以使用 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: Disable Insights connection
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.rhc
          vars:
            rhc_insights:
              state: absent

    示例 playbook 中指定的设置包括如下:

    rhc_insights absent|present
    启用或禁用 Red Hat Insights 的系统注册,以进行主动分析和建议。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

    示例 playbook 中指定的设置包括如下:

    name: RepositoryName
    应该启用的存储库的名称。
    state: enabled|disabled
    可选,启用或禁用存储库。默认为 enabled
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

要确保系统稳定性和兼容性,有时需要将 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"

    示例 playbook 中指定的设置包括如下:

    rhc_release: version
    要为系统设置的 RHEL 版本,因此可用内容将仅限于此版本。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

如果您的安全限制只允许通过代理服务器访问互联网,您可以在使用 rhc 注册系统时指定 rhc 角色的代理设置。

先决条件

流程

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

    1. 创建 vault :

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

      username: <username>
      password: <password>
      proxy_username: <proxyusernme>
      proxy_password: <proxypassword>
    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 }}"

    示例 playbook 中指定的设置包括如下:

    hostname: proxy.example.com
    代理服务器的完全限定域名(FQDN)。
    port: 3128
    定义用于与代理服务器进行通信的网络端口。
    username: proxy_username
    指定用于身份验证的用户名。这只有在代理服务器需要身份验证时才需要。
    password: proxy_password
    指定用于身份验证的密码。这只有在代理服务器需要身份验证时才需要。
  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 rhc RHEL 系统角色启用或禁用 Red Hat Insights 的自动集合规则更新。默认情况下,当您的系统连接到 Red Hat Insights 时,这个选项就启用了。您可以使用 rhc 禁用它。

警告

如果禁用了此功能,您就存在使用过时的规则定义文件,且没有获得最新验证更新的风险。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您已注册系统。

流程

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

    1. 创建 vault :

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

      username: <username>
      password: <password>
    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

    示例 playbook 中指定的设置包括如下:

    autoupdate: true|false
    启用或禁用 Red Hat Insights 的自动集合规则更新。
  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

22.8. 使用 rhc RHEL 系统角色配置 Insights 修复

您可以使用 rhc RHEL 系统角色将您的系统配置为自动更新动态配置。当将您的系统连接到 Red Hat Insights 时,它默认被启用。如果需要,您可以禁用它。您可以使用 rhc 确保您的系统在直接连接到红帽时已准备好进行修复。有关 Red Hat Insights 修复的更多信息,请参阅 Red Hat Insights 修复指南

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您已启用了 Insights 补救。
  • 您已注册系统。

流程

  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
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      username: <username>
      password: <password>
    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

    示例 playbook 中指定的设置包括如下:

    group: group-name-value
    指定用于组织和管理注册主机的系统组。
    location:location-name-value
    定义与已注册的系统关联的位置。
    description
    为已注册的系统提供一个简短摘要或标识符。
    state: present|absent

    表示已注册系统的当前状态。

    注意

    tags 中的内容是一个 YAML 结构,代表管理员所需的用于已配置的系统的标签。这里给出的示例仅用于说明目的,并不详尽。管理员可以自定义 YAML 结构,来根据需要包含任何其他键和值。

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

22.10. 使用 rhc 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: Unregister the system
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.rhc
          vars:
            rhc_state: absent

    示例 playbook 中指定的设置包括如下:

    rhc_state: absent
    指定应该从注册服务器、RHSM 或 Satellite 中取消注册的系统。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

使用智能平台管理接口(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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      ipmi_usr: <username>
      ipmi_pwd: <password>
    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

    示例 playbook 中指定的设置包括如下:

    name: <bmc_hostname_or_ip_address>
    定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
    port: <bmc_port_number>
    设置远程管理控制协议(RMCP)端口号。默认值为 623
    bootdev: <value>

    设置引导设备。您可以选择以下值之一:

    • hd: 从硬盘引导。
    • network :从网络引导。
    • optical :从光驱(如 DVD-ROM)引导。
    • floppy :从软盘引导。
    • safe :在安全模式下从硬盘驱动器引导。
    • setup :引导到 BIOS 或 UEFI。
    • default :删除任何 IPMI 定向的引导设备请求。
    persistent: <true|false>
    配置远程主机是否对所有以后的引导都使用定义的设置,或只对下一次引导使用定义的设置。默认情况下,此变量被设置为 false。请注意,并非所有 BMC 都支持永久设置引导设备。

    如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.ipmi_boot 命令来显示模块的文档。

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      ipmi_usr: <username>
      ipmi_pwd: <password>
    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

    示例 playbook 中指定的设置包括如下:

    name: <bmc_hostname_or_ip_address>
    定义 BMC 的主机名或 IP 地址。这是受管节点在其上执行操作的主机的 BMC。
    port: <bmc_port_number>
    设置远程管理控制协议(RMCP)端口号。默认值为 623
    state: <value>

    设置设备应处于的状态。您可以选择以下值之一:

    • on :打开系统的电源。
    • ff :在不通知操作系统的情况下关闭系统。
    • shutdown :从操作系统请求关闭。
    • reset :执行硬重置。
    • boot : 如果系统已关闭,打开系统电源,或如果系统已关闭,重置系统。

    如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.ipmi_power 命令显示模块的文档。

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
    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

    示例 playbook 中指定的设置包括如下:

    baseURI: &lt ;uri>
    定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
    category: <value>

    设置要执行的命令的类别。可用的类别如下:

    • Accounts :管理 OOB 控制器的用户帐户。
    • Chassis :管理与机箱相关的设置。
    • Manager :提供对 Redfish 服务的访问。
    • Session :管理 Redfish 登录会话。
    • Systems (默认):管理与机器相关的设置。
    • Update :管理与固件更新相关的操作。
    command: <command>
    设置要执行的命令。根据命令,可能需要设置额外的变量。

    如需关于 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.redfish_command 命令来显示模块的文档。

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
    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 }}"

    示例 playbook 中指定的设置包括如下:

    baseuri: <uri>
    定义 OOB 控制器的 URI。这是受管节点在其上执行操作的主机的 OOB 控制器。
    category: <value>

    设置要查询的信息的类别。可用的类别如下:

    • Accounts :OOB 控制器的用户帐户
    • Chassis :与机箱相关的设置
    • Manager: Redfish 服务
    • Session :Redfish 登录会话
    • Systems (默认):与机器相关的设置
    • Update :与固件相关的设置
    • All: 来自所有类别的信息。

    如果使用列表,您还可以设置多个类别,如 ["Systems", "Accounts "]。

    command: <command>
    设置要执行的查询命令。

    如需有关 playbook 中使用的所有变量的详细信息,请在控制节点上使用 ansible-doc redhat.rhel_mgmt.redfish_info 命令显示模块的文档。

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

您可以使用 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      redfish_usr: <username>
      redfish_pwd: <password>
    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"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

第 24 章 使用 RHEL 系统角色配置 SELinux

您可以使用 selinux RHEL 系统角色远程配置和管理 SELinux 权限,例如:

  • 清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
  • 设置 SELinux 策略布尔值、文件上下文、端口和登录。
  • 在指定文件或目录中恢复文件上下文。
  • 管理 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/

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 显示您已重置了上下文的文件或目录的 SELinux 上下文。例如,要显示 /var/www/ 目录上的上下文,请输入:

    # ansible rhel9.example.com -m command -a 'ls -ldZ /var/www/'
    drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 28 13:20 /var/www/

如果要在非标准端口上运行服务,您必须在此端口上设置相应的 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 显示分配了 http_port_t 标签的端口号:

    # ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t'
    http_port_t      tcp     80, 81, 443, <port_number>, 488, 8008, 8009, 8443, 9000

24.3. 使用 selinux RHEL 系统角色部署 SELinux 模块

如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
  • SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。

    如果使用 PP 模块,请确保受管节点上的 policydb 版本与用来构建 PP 模块的版本相同或更新。

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 远程显示您在 playbook 中使用的 SELinux 模块和过滤器的列表:

    # ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'

    如果列出了模块,则其已安装且启用了。

您可以使用 sshd RHEL 系统角色配置 OpenSSH 服务器,使用 ssh RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。对于需要安全远程交互的任何系统,此类配置是必需的,例如:

  • 远程系统管理:使用 SSH 客户端从一台计算机安全地连接到您的机器。
  • 安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP)可让您在本地机器和远程系统之间安全地传输文件。
  • 自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
  • 隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
  • 基于密钥的身份验证:对基于密码登录的更加安全的替代。
  • 基于证书的验证:集中信任管理和更好的可扩展性。
  • 增强了安全性:禁用 root 登录、限制用户访问、强制强加密和其他此类强化,确保更强的系统安全性。

sshd RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config 文件。

在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

sshd_ListenAddress:
  - 0.0.0.0
  - '::'

呈现为:

ListenAddress 0.0.0.0
ListenAddress ::

25.2. 使用 sshd RHEL 系统角色配置 OpenSSH 服务器

您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:

  • 管理来自远程客户端的传入 SSH 连接
  • 凭证验证
  • 保护数据传输和命令执行
注意

您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9)。

先决条件

流程

  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:
              PermitRootLogin: no
              PasswordAuthentication: no
              Match:
                - Condition: "Address 192.0.2.0/24"
                  PermitRootLogin: yes
                  PasswordAuthentication: yes

    示例 playbook 中指定的设置包括如下:

    PasswordAuthentication: yes|no
    控制 OpenSSH 服务器(sshd)是否接受来自使用用户名和密码组合的客户端的身份验证。
    Match:
    匹配块只允许使用来自子网 192.0.2.0/24 的使用密码的 root 用户登录。

    有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 登录到 SSH 服务器:

    $ ssh <username>@<ssh_server>
  2. 验证 SSH 服务器上 sshd_config 文件的内容:

    $ cat /etc/ssh/sshd_config
    ...
    PasswordAuthentication no
    PermitRootLogin no
    ...
    Match Address 192.0.2.0/24
      PasswordAuthentication yes
      PermitRootLogin yes
    ...
  3. 检查您是否可以以 root 用户身份从 192.0.2.0/24 子网连接到服务器:

    1. 确定您的 IP 地址:

      $ hostname -I
      192.0.2.1

      如果 IP 地址在 192.0.2.1 - 192.0.2.254 范围内,您可以连接到服务器。

    2. root 用户身份连接到服务器:

      $ ssh root@<ssh_server>

25.3. 对非独占配置使用 sshd RHEL 系统角色

默认情况下,应用 sshd RHEL 系统角色会覆盖整个配置。如果您之前调整了配置,例如使用不同的 RHEL 系统角色或 playbook,则这可能会出现问题。要只对所选配置选项应用 sshd RHEL 系统角色,同时保留其他选项,您可以使用非独占配置。

您可以应用非独占配置:

  • 在 RHEL 8 及更早版本中使用配置片段。
  • 在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为 /etc/ssh/sshd_config.d/00-ansible_system_role.conf

先决条件

流程

  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:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
    • 对于运行 RHEL 9 或更高版本的受管节点:

      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure sshd to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf
              sshd:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR

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

      sshd_config_namespace: <my-application>
      角色将您在 playbook 中指定的配置放在给定命名空间下的现有配置文件中的配置片段中。当从不同上下文运行角色时,您需要选择一个不同的命名空间。
      sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf
      sshd_config_file 变量中,定义 sshd 系统角色将配置选项写入其中的 .conf 文件。使用两位前缀,例如 42- 来指定应用配置文件的顺序。
      AcceptEnv:

      控制 OpenSSH 服务器(sshd)将接受来自客户端的哪些环境变量:

      • LANG :定义语言和区域设置。
      • LS_COLORS :定义终端中 ls 命令的显示颜色方案。
      • EDITOR: 指定需要打开编辑器的命令行程序的默认文本编辑器。

      有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证 SSH 服务器上的配置:

    • 对于运行 RHEL 8 或更早版本的受管节点:

      # cat /etc/ssh/sshd_config
      ...
      # BEGIN sshd system role managed block: namespace <my-application>
      Match all
        AcceptEnv LANG LS_COLORS EDITOR
      # END sshd system role managed block: namespace <my-application>
    • 对于运行 RHEL 9 或更高版本的受管节点:

      # cat /etc/ssh/sshd_config.d/42-my-application.conf
      # Ansible managed
      #
      AcceptEnv LANG LS_COLORS EDITOR

当默认加密设置没有满足某些安全或兼容性需求时,您可能需要使用 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:

    $ ssh -vvv <ssh_server>
    ...
    debug2: peer server KEXINIT proposal
    debug2: KEX algorithms: ecdh-sha2-nistp521
    debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256
    debug2: ciphers ctos: aes256-ctr
    debug2: ciphers stoc: aes256-ctr
    debug2: MACs ctos: hmac-sha2-512-etm@openssh.com
    debug2: MACs stoc: hmac-sha2-512-etm@openssh.com
    ...

ssh RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config 文件。

在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

LocalForward:
  - 22 localhost:2222
  - 403 localhost:4003

呈现为:

LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
注意

配置选项区分大小写。

25.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端

您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:

  • 安全连接启动
  • 凭证置备
  • 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
  • 能够安全地向和从 OpenSSH 服务器发送文件
注意

您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。

先决条件

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 通过显示 SSH 配置文件来验证受管节点是否有正确的配置:

    # cat ~/root/.ssh/config
    # Ansible managed
    Compression yes
    ControlMaster auto
    ControlPath ~/.ssh/.cm%C
    ForwardX11 no
    GSSAPIAuthentication no
    Host example
      Hostname example.com
      User user1

第 26 章 使用 RHEL 系统角色管理本地存储

要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 存储 角色,这是 RHEL 8 中可用的 RHEL 系统角色之一。

使用 存储 角色可让您自动管理多台机器上的磁盘和逻辑卷上的文件系统,以及从 RHEL 7.7 开始的所有 RHEL 版本。

示例 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

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

    name: barefs
    卷名称(示例中为 barefs )目前是任意的。storage 角色根据 disks 属性下列出的磁盘设备来识别卷。
    fs_type: &lt ;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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

示例 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

使用 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

    示例 playbook 中指定的设置包括如下:

    size: <size>
    您必须使用单位(如 GiB)或百分比(例如 60%)来指定大小。

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证指定的卷是否已创建或调整到请求的大小:

    # ansible managed-node-01.example.com -m command -a 'lvs myvg'

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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证在线块丢弃选项是否已启用:

    # ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'

示例 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

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

    disks: <list_of_devices>
    角色在创建卷时使用的设备名称的 YAML 列表。
    fs_type: &lt ;file_system>
    指定角色应在卷上设置的文件系统。您可以选择 xfsext3ext4swapunformatted
    label-name: &lt ;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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证阵列是否被正确创建:

    # ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'

使用 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证您的池是否在 RAID 上:

    # ansible managed-node-01.example.com -m command -a 'lsblk'

使用 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证条带大小是否被设置为所需的大小:

    # ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'

26.9. 使用 storage RHEL 系统角色配置 LVM-VDO 卷

您可以使用 storage RHEL 系统角色在 LVM (LVM-VDO)上创建一个启用了压缩和去重的 VDO 卷。

注意

由于 storage 系统角色使用 LVM-VDO,因此每个池只能创建一个卷。

先决条件

流程

  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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查看压缩和去重的当前状态:

    $ ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state'
      LV       VG      Attr       LSize   Pool   Origin Data%  Meta%  Move Log Cpy%Sync Convert VDOCompression VDOCompressionState VDODeduplication VDOIndexState
      mylv1   myvg   vwi-a-v---   3.00t vpool0                                                         enabled              online          enabled        online

您可以通过运行 Ansible playbook,使用 storage 角色来创建和配置使用 LUKS 加密的卷。

先决条件

流程

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

    1. 创建 vault :

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

      luks_password: <password>
    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 }}"

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  1. 查找 LUKS 加密卷的 luksUUID 值:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb'
    
    4e4e7970-1822-470e-b55a-e91efe5d0f5c
  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
    ...
  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]
    ...

如果您希望多个系统同时访问同一个存储,则您可以使用 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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

第 27 章 使用 RHEL 系统角色管理 systemd 单元

通过使用 systemd RHEL 系统角色,您可以自动化某些与 systemd 相关的任务,并远程执行它们。您可以对以下操作使用角色:

  • 管理服务
  • 部署单元
  • 部署置入文件

27.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

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

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

    此置入文件在 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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证角色是否将置入文件放在了正确的位置:

    # ansible managed-node-01.example.com -m command -a 'ls /etc/systemd/system/sshd.service.d/'
    99-override.conf

您可以为自定义应用程序创建单元文件,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

    对文件名使用 <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

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

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证该服务是否已启用并启动:

    # ansible managed-node-01.example.com -m command -a 'systemctl status example.service'
    ...
    ● example.service - A service for demonstrating purposes
       Loaded: loaded (/etc/systemd/system/example.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2024-07-04 15:59:18 CEST; 10min ago
    ...

第 28 章 使用 RHEL 系统角色配置时间同步

Network Time Protocol(NTP)和 Precision Time Protocol (PTP)是通过网络同步计算机时钟的标准。网络中准确的时间同步非常重要,因为某些服务依赖它。例如,Kerberos 只容许服务器和客户端之间很少的时间差异,以防止重播攻击。

您可以在 playbook 的 timesync_ntp_provider 变量中设置要配置的时间服务。如果没有设置此变量,角色会根据以下因素决定时间服务:

  • 在 RHEL 8 及更新版本上:chronyd
  • 在 RHEL 6 和 7 上: chronyd(默认)或者如果已安装了 ntpd

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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 显示时间源的详情:

    • 如果受管节点运行 chronyd 服务,请输入:

      # ansible managed-node-01.example.com -m command -a 'chronyc sources'
      MS Name/IP address         Stratum Poll Reach LastRx Last sample
      ===============================================================================
      ^* time.example.com              1  10   377   210   +159us[  +55us] +/-   12ms
      ^? ntp.example.org               2   9   377   409  +1120us[+1021us] +/-   42ms
      ^? time.us.example.net           2   9   377   992   -329us[ -386us] +/-   15ms
      ...
    • 如果受管节点运行 ntpd 服务,请输入:

      # ansible managed-node-01.example.com -m command -a 'ntpq -p'
           remote           refid      st t when poll reach   delay   offset  jitter
      ==============================================================================
      *time.example.com .PTB.           1 u    2   64   77   23.585  967.902   0.684
      - ntp.example.or 192.0.2.17       2 u    -   64   77   27.090  966.755   0.468
      +time.us.example 198.51.100.19    2 u   65   64   37   18.497  968.463   1.588
      ...

Network Time Protocol(NTP)通过网络,将主机的时间与 NTP 服务器同步。通过使用 Network Time Security (NTS)机制,客户端建立到服务器的 TLS 加密连接,并验证 NTP 数据包。在 IT 网络中,服务依赖于正确的系统时间,例如,出于安全和日志记录目的。通过使用 timesync RHEL 系统角色,您可以在网络中自动配置 Red Hat Enterprise Linux NTP 客户端,并保持通过 NTS 的时间同步。

请注意,您不能将 NTS 服务器与非 NTS 服务器混合使用。在混合配置中,NTS 服务器是可信的,客户端不会回退到未经身份验证的 NTP 源,因为它们可能被中间人(MITM)攻击所利用。详情请查看您系统上 chrony.conf (5) 手册页中的 authselectmode 参数描述。

警告

timesync RHEL 系统角色在受管主机上替换了指定的或检测到的提供商服务的配置。因此,如果没有在 playbook 中指定,所有设置都会丢失。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 受管节点使用 chronyd

流程

  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

    示例 playbook 中指定的设置包括如下:

    iburst: yes
    启用快速初始同步。

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 如果受管节点运行 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
    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

      验证 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

使用 tlog RHEL 系统角色,以自动的方式记录和监控受管节点上终端会话活动。您可以使用 SSSD 服务将记录配置为为每个用户或用户组进行。

在 tlog RHEL 系统角色中记录解决方案的会话由以下组件组成:

  • tlog 工具
  • 系统安全性服务守护进程(SSSD)
  • 可选: Web 控制台界面

准备并应用一个 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>
    tlog_scope_sssd: < value>
    一些 值指定只记录某些用户和组,而不是 allnone
    tlog_users_sssd: &lt ;list_of_users>
    您要记录会话的用户的 YAML 列表。请注意,如果不存在,角色不会添加用户。
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 检查 SSSD 置入文件的内容:

    # cd /etc/sssd/conf.d/sssd-session-recording.conf

    您可以看到该文件包含您在 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",...
      ...

      下一步需要 rec (记录 ID)字段的值。

      请注意,由于 15 个字符的限制,_COMM 字段的值被缩短了。

    2. 回放会话:

      # tlog-play -r journal -M TLOG_REC=<recording_id>

您可以使用 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
    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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 检查 SSSD 置入文件的内容:

    # cat /etc/sssd/conf.d/sssd-session-recording.conf

    您可以看到该文件包含您在 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",...
      ...

      下一步需要 rec (记录 ID)字段的值。

      请注意,由于 15 个字符的限制,_COMM 字段的值被缩短了。

    2. 回放会话:

      # tlog-play -r journal -M TLOG_REC=<recording_id>

您可以使用虚拟专用网络(VPN)通过不可信网络(如互联网)建立安全加密的隧道。此类隧道可确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部。

通过使用 vpn RHEL 系统角色,您可以自动创建 Libreswan IPsec VPN 配置的过程。

注意

vpn RHEL 系统角色只能创建使用预共享密钥(PSK)或证书的 VPN 配置来相互验证对等点。

主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

通过使用 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

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    使用您要配置 VPN 的对等点定义 YAML 字典。如果条目不是一个 Ansible 管理的节点,则您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1

    角色在每个受管节点上配置 VPN 连接。连接名为 < peer_A&gt;-to-<peer_B >,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    auth_method: psk
    启用对等点之间的 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 PSK 身份验证的 IPsec 主机到主机连接的过程。

先决条件

流程

  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

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为 <name>-<IP_address_A>-to-<IP_address_B>,例如 control_plane_vpn-203.0.113.1-to-198.51.100.2

    角色在每个受管节点上配置 VPN 连接。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。

    auth_method: psk
    在主机之间启用 PSK 身份验证。角色在控制节点上使用 openssl 来创建预共享密钥。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

站点到站点的 VPN 在两个不同的网络之间建立一个安全、加密的隧道,在不安全的公共网络(如互联网)中无缝链接。例如,这可让分支机构中的设备访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

通过使用 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:
                    subnets:
                      - 192.0.2.0/24
                  managed-node-02.example.com:
                    subnets:
                      - 198.51.100.0/24
                      - 203.0.113.0/24
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    使用您要配置 VPN 的网关定义 YAML 字典。如果条目不是 Ansible 管理的节点,您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1

    角色在每个受管节点上配置 VPN 连接。连接名为 -to-,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    subnets: <yaml_list_of_subnets>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
    auth_method: psk
    启用对等点之间的 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

IPsec 网格会创建一个完全互连的网络,每个服务器都可以与所有其他服务器安全通信。这是涵盖多个数据中心或云供应商的分布式数据库集群或高可用性环境的理想选择。在每对服务器之间建立直接的加密隧道可确保安全通信,而无需中央瓶颈。

为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。网格中的每个主机都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您可以为每个受管节点准备一个 PKCS #12 文件:

    • 每个文件包含:

      • 服务器的私钥
      • 服务器证书
      • CA 证书
      • 如果需要,则中间证书
    • 文件被命名为 <managed_node_name_as_in_the_inventory>.p12
    • 文件存储在与 playbook 相同的目录中。
    • 服务器证书包含以下字段:

      • 扩展的密钥使用(EKU)设置为 TLS Web 服务器身份验证
      • 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
      • X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。

流程

  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

    cert_name 变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。

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

    1. 创建 vault :

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

      pkcs12_pwd: <password>
    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: Initialize IPsec NSS database if not initialized
          ansible.builtin.command:
            cmd: ipsec initnss
          when: db_files.matched == 0
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true

    示例 playbook 中指定的设置包括如下:

    opportunistic: true
    在多个主机之间启用机会网格。policies 变量定义必须或可以加密哪些子网和主机流量,并且哪些应该继续使用纯文本连接。
    auth_method: cert
    启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
    policies: <list_of_policies>

    以 YAML 列表格式定义 Libreswan 策略。

    默认策略是 private-or-clear。要将它改为 private,上面的 playbook 包含默认 cidr 条目的一个相应策略。

    如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个 clear 策略。例如,如果应该为 192.0.2.0/24 子网配置网格,并且控制节点使用 IP 地址 192.0.2.1,则您需要一个用于192.0.2.1/32clear 策略,如 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

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

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  1. 在网格的一个节点上,ping 另一个节点来激活连接:

    [root@managed-node-01]# ping managed-node-02.example.com
  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'

您可以使用 microsoft.sql.server Ansible 系统角色自动化 Microsoft SQL Server 的安装和管理。此角色还通过应用 mssql TuneD 配置文件优化 Red Hat Enterprise Linux (RHEL),来提高 SQL Server 的性能和吞吐量。

注意

在安装过程中,角色将 SQL Server 的存储库及相关软件包添加到受管主机。这些存储库中的软件包由 Microsoft 提供、维护和托管。

如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。通过使用 microsoft.sql.server Ansible 系统角色,您可以自动化这个过程,并使用 TLS 加密远程安装和配置 SQL Server。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。

根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:

  • RHEL 7.9: SQL Server 2017 和 2019
  • RHEL 8: SQL Server 2017, 2019 和 2022
  • RHEL 9.4 及更新版本:SQL Server 2022

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
  • 您将 sql_crt.pem 文件中的证书存储在与 playbook 相同的目录中。
  • 您将 sql_cert.key 文件中的私钥存储在与 playbook 相同的目录中。
  • SQL 客户端信任签发证书的 CA。

流程

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

    1. 创建 vault :

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

      sa_pwd: <sa_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 在 SQL Server 主机上,使用带有 -N 参数的 sqlcmd 工具来建立到 SQL server 的加密连接,并运行查询,例如:

    $ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'

    如果命令成功,则到服务器的连接是 TLS 加密的。

如果应用程序需要 Microsoft SQL Server 数据库,您可以使用 TLS 加密配置 SQL Server,以在应用程序和数据库之间启用安全通信。如果 SQL Server 主机是 Red Hat Enterprise Linux Identity Management (IdM)域中的成员,则 certmonger 服务可以管理证书请求和将来的续订。

通过使用 microsoft.sql.server Ansible 系统角色,您可以自动化此过程。您可以使用 TLS 加密远程安装和配置 SQL Server,microsoft.sql.server 角色使用 certificate Ansible 系统角色来配置 certmonger ,并从 IdM 请求证书。

根据受管主机上的 RHEL 版本,您可以安装的 SQL Server 版本会有所不同:

  • RHEL 7.9: SQL Server 2017 和 2019
  • RHEL 8: SQL Server 2017, 2019 和 2022
  • RHEL 9.4 及更新版本:SQL Server 2022

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您已在控制节点上安装了 ansible-collection-microsoft-sql 软件包或 microsoft.sql 集合。
  • 受管节点安装了 2 GB 或更多 RAM。
  • 受管节点使用以下版本之一: RHEL 7.9、RHEL 8、RHEL 9.4 或更高版本。
  • 您在 Red Hat Enterprise Linux Identity Management (IdM)域中注册了受管节点。

流程

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

    1. 创建 vault :

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

      sa_pwd: <sa_password>
    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

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  • 在 SQL Server 主机上,使用带有 -N 参数的 sqlcmd 工具来建立到 SQL server 的加密连接,并运行查询,例如:

    $ /opt/mssql-tools/bin/sqlcmd -N -S server.example.com -U "sa" -P <sa_password> -Q 'SELECT SYSTEM_USER'

    如果命令成功,则到服务器的连接是 TLS 加密的。

当您使用 microsoft.sql.server Ansible 系统角色来安装和配置新的 SQL Server 时,您可以自定义数据的路径和模式,以及日志目录。例如,如果要将数据库和日志文件存储在具有多个存储的不同的目录中,请配置自定义路径。

重要

如果您更改了数据或日志路径,并重新运行 playbook,之前使用的目录及其所有内容都保持在原始路径。只有新的数据库和日志保存在新位置。

Expand
表 31.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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
    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'

    示例 playbook 中指定的设置包括如下:

    mssql_datadir_modemssql_logdir_mode
    设置权限模式。在单引号中指定值,以确保角色将值解析为字符串,而不是解析为八进制数。

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  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/
  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/

您可以将 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      sa_pwd: <sa_password>
      sql_pwd: <SQL_AD_password>
      ad_admin_pwd: <AD_admin_password>
    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 }}"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
  5. 授权应能够向 SQL Server 进行身份验证的 AD 用户。在 SQL Server 上,执行以下步骤:

    1. 获取 Administrator 用户的 Kerberos 票据:

      $ kinit Administrator@ad.example.com
    2. 授权一个 AD 用户:

      $ /opt/mssql-tools/bin/sqlcmd -S. -Q 'CREATE LOGIN [AD\<AD_user>] FROM WINDOWS;'

      对应该能够访问 SQL Server 的每个 AD 用户重复此步骤。

验证

  • 在运行 SQL Server 的受管节点上:

    1. 获取 AD 用户的 Kerberos 票据:

      $ kinit <AD_user>@ad.example.com
    2. 使用 sqlcmd 工具登录到 SQL Server ,并运行一个查询,例如:

      $ /opt/mssql-tools/bin/sqlcmd -S. -Q 'SELECT SYSTEM_USER'

法律通告

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

© 2026 Red Hat
返回顶部