4.8. 使用 RHEL 系统角色安装和配置 PostgreSQL 数据库服务器


您可以使用 postgresql RHEL 系统角色自动化 PostgreSQL 数据库服务器的安装和管理。默认情况下,此角色还通过在 PostgreSQL 服务配置文件中自动配置与性能相关的设置来优化 PostgreSQL。

如果应用程序需要 PostgreSQL 数据库服务器,您可以配置具有 TLS 加密的此服务,来在应用程序和数据库之间启用安全通信。通过使用 postgresql RHEL 系统角色,您可以自动化此过程,并远程安装和配置具有 TLS 加密的 PostgreSQL。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。

注意

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

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户具有 sudo 权限。
  • 受管节点的私钥和证书都存储在控制节点上的以下文件中:

    • 私钥:~/<FQDN_of_the_managed_node>.key
    • 证书: ~/<FQDN_of_the_managed_node>.crt

流程

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

    1. 创建 vault :

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

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

    ---
    - name: Installing and configuring PostgreSQL
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Create directory for TLS certificate and key
          ansible.builtin.file:
            path: /etc/postgresql/
            state: directory
            mode: 755
    
        - name: Copy CA certificate
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.crt"
            dest: "/etc/postgresql/server.crt"
    
        - name: Copy private key
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.key"
            dest: "/etc/postgresql/server.key"
            mode: 0600
    
        - name: PostgreSQL with an existing private key and certificate
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.postgresql
          vars:
            postgresql_version: "16"
            postgresql_password: "{{ pwd }}"
            postgresql_ssl_enable: true
            postgresql_cert_name: "/etc/postgresql/server"
            postgresql_server_conf:
              listen_addresses: "'*'"
              password_encryption: scram-sha-256
            postgresql_pg_hba_conf:
              - type: local
                database: all
                user: all
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '127.0.0.1/32'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '::1/128'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '192.0.2.0/24'
                auth_method: scram-sha-256
    
    
        - name: Open the PostgresQL port in firewalld
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - service: postgresql
                state: enabled
    Copy to Clipboard Toggle word wrap

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

    postgresql_version: <version>

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

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

    postgresql_password: <password>

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

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

    postgresql_cert_name: <private_key_and_certificate_file>

    定义受管节点上没有 .crtkey 后缀的证书和私钥的路径和基础名称。在 PostgreSQL 配置过程中,角色会在 /var/lib/pgsql/data/ 目录中创建引用这些文件的符号链接。

    证书和私钥必须存在于受管节点本地。您可以将任务与 ansible.builtin.copy 模块一起使用,来将文件从控制节点传输到受管节点,如 playbook 中所示。

    postgresql_server_conf: <list_of_settings>

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

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

    postgresql_pg_hba_conf: <list_of_authentication_entries>

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

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

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

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

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

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

验证

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

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

    如果输出显示 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>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

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

    ---
    - name: Installing and configuring PostgreSQL
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: PostgreSQL with certificates issued by IdM
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.postgresql
          vars:
            postgresql_version: "16"
            postgresql_password: "{{ pwd }}"
            postgresql_ssl_enable: true
            postgresql_certificates:
              - name: postgresql_cert
                dns: "{{ inventory_hostname }}"
                ca: ipa
                principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM"
            postgresql_server_conf:
              listen_addresses: "'*'"
              password_encryption: scram-sha-256
            postgresql_pg_hba_conf:
              - type: local
                database: all
                user: all
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '127.0.0.1/32'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '::1/128'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '192.0.2.0/24'
                auth_method: scram-sha-256
    
    
        - name: Open the PostgresQL port in firewalld
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - service: postgresql
                state: enabled
    Copy to Clipboard Toggle word wrap

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

    postgresql_version: <version>

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

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

    postgresql_password: <password>

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

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

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

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

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

    postgresql_pg_hba_conf: <list_of_authentication_entries>

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

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

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

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

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

  3. 验证 playbook 语法:

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

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

  4. 运行 playbook:

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

验证

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

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

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat