第21章 RHEL システムロールを使用した PostgreSQL データベースサーバーのインストールおよび設定
postgresql
RHEL システムロールを使用すると、PostgreSQL データベースサーバーのインストールと管理を自動化できます。デフォルトでは、このロールは、PostgreSQL サービス設定ファイルでパフォーマンス関連の設定を自動的に指定することで、PostgreSQL を最適化します。
21.1. postgresql
RHEL システムロールを使用した、既存の TLS 証明書による PostgreSQL の設定
アプリケーションに PostgreSQL データベースサーバーが必要な場合は、TLS 暗号化を使用して PostgreSQL サービスを設定し、アプリケーションとデータベース間のセキュアな通信を有効にできます。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
-
秘密鍵:
手順
機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
ansible-vault create
コマンドでエディターが開いたら、機密データを<key>: <value>
形式で入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow pwd: <password>
pwd: <password>
- 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow --- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create directory for TLS certificate and key ansible.builtin.file: path: /etc/postgresql/ state: directory mode: 755 - name: Copy CA certificate ansible.builtin.copy: src: "~/{{ inventory_hostname }}.crt" dest: "/etc/postgresql/server.crt" - name: Copy private key ansible.builtin.copy: src: "~/{{ inventory_hostname }}.key" dest: "/etc/postgresql/server.key" mode: 0600 - name: PostgreSQL with an existing private key and certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_cert_name: "/etc/postgresql/server" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Create directory for TLS certificate and key ansible.builtin.file: path: /etc/postgresql/ state: directory mode: 755 - name: Copy CA certificate ansible.builtin.copy: src: "~/{{ inventory_hostname }}.crt" dest: "/etc/postgresql/server.crt" - name: Copy private key ansible.builtin.copy: src: "~/{{ inventory_hostname }}.key" dest: "/etc/postgresql/server.key" mode: 0600 - name: PostgreSQL with an existing private key and certificate ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_cert_name: "/etc/postgresql/server" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabled
サンプル Playbook で指定されている設定は次のとおりです。
postgresql_version: <version>
インストールする PostgreSQL のバージョンを設定します。設定できるバージョンは、管理対象ノードで実行されている Red Hat Enterprise Linux で使用可能な PostgreSQL バージョンによって異なります。
postgresql_version
変数を変更して Playbook を再度実行しても、PostgreSQL をアップグレードまたはダウングレードすることはできません。postgresql_password: <password>
postgres
データベーススーパーユーザーのパスワードを設定します。POSTGRESQL_PASSWORD
変数を変更して Playbook を再度実行しても、パスワードを変更することはできません。postgresql_cert_name: <private_key_and_certificate_file>
管理対象ノード上の証明書と秘密鍵の両方のパスとベース名を、
.crt
およびkey
接尾辞なしで定義します。PostgreSQL の設定中に、ロールが/var/lib/pgsql/data/
ディレクトリーにこれらのファイルを参照するシンボリックリンクを作成します。証明書と秘密鍵は管理対象ノード上にローカルに存在している必要があります。Playbook に示されているように、
ansible.builtin.copy
モジュールのタスクを使用して、コントロールノードから管理対象ノードにファイルを転送できます。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 ローカルホストアドレスへの TLS 暗号化接続。
-
192.0.2.0/24 サブネットからの TLS 暗号化接続。リモートアドレスからのアクセスは、
postgresql_server_conf
変数のlisten_addresses
設定も適切に設定した場合にのみ可能であることに注意してください。
postgresql_pg_hba_conf
で異なる設定を使用して Playbook を再実行すると、/var/lib/pgsql/data/pg_hba.conf
ファイルが新しい設定で上書きされます。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
ファイルを参照してください。Playbook の構文を検証します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
検証
postgres
スーパーユーザーを使用して PostgreSQL サーバーに接続し、\conninfo
メタコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
出力に TLS プロトコルのバージョンと暗号の詳細が表示される場合、接続は機能し、TLS 暗号化が有効になっています。
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
ファイル -
/usr/share/doc/rhel-system-roles/postgresql/
ディレクトリー - Ansible vault