Configuring Postgres Enterprise Manager (PEM)
=============================================

TPAは、 ``--enable-pem``
コマンドラインオプションを使用して\ ``tpaexec configure``
コマンドが実行されると、PEMのインストールと構成を行います。

``--enable-pem``
のデフォルト動作は、クラスター内のすべての\ ``postgres``
インスタンスの\ ``pem-agent`` ロールを有効にすることです。 ``pem-agent``
ロールは、 ``--enable-pg-backup-api``
コマンドラインオプションが\ ``--enable-pem``
とともに使用される場合、バーマンノードにも追加されます。

``pemserver`` という名前の専用インスタンスもクラスターに追加されます。

PEMサーバーはpostgresバックエンドを使用するため。
pemserverインスタンスは、 ``postgres``
ロールを暗黙的に使用するため、pemserverがPEMバックエンドとして使用するように構成された有効なpostgresクラスターを取得します。通常のpostgresインスタンスで使用可能なすべての構成オプションは、PEMのバックエンドpostgresインスタンスでも有効です。詳細については、以下を参照してください。

- :ref:`pg_hba.conf <pg_hba.conf>` 

- :ref:`postgresql.conf <postgresql.conf>` 

PEMはEDBのパッケージリポジトリを介してのみ利用可能であるため、有効なサブスクリプションが必要であることに注意してください。

サポートされているアーキテクチャ
--------------------------------

PEMは、 ``--enable-pem``
構成コマンドラインオプションを介してすべてのアーキテクチャでサポートされています。ただし、
EDB Postgres Extendedで使用する場合のBDR
-Always-ONアーキテクチャを除きます。オプションで、生成されたクラスター構成config.ymlを編集し、クラスター内のpostgresインスタンスから\ ``pem-agent``
ロールを割り当てまたは削除して、そこでPEMを有効または無効にすることができます。

PEMコンポーネントパッケージバージョン
-------------------------------------

デフォルトでは、TPAはPEMエージェントとPEMサーバーの最新の利用可能なバージョンをインストールします。

``config.yml`` ファイルの\ ``cluster_vars``
セクションの下に\ ``pem_agent_package_version: xxx``
および\ ``pem_server_package_version: xxx``
を含めることにより、インストールされるPEMエージェントとPEMサーバーパッケージのバージョンを指定できます。

.. code:: yaml

   cluster_vars:
       …
       pem_agent_package_version: 9.7.0-1.el9
       pem_server_package_version: 9.7.0-1.el9
       …

aptまたはyumが受け入れるバージョン指定子を使用できます。

バージョンが一致しない場合は、 ``*``
ワイルドカードを追加してみてください。これは、パッケージバージョンに\ ``2:...``
のようなエポック修飾子がある場合に必要になることがよくあります。

PEM構成
-------

TPAは、適切なインスタンス固有の設定でpemエージェントとpemサーバーを構成し、残りの設定はそれぞれのデフォルト値に設定されます。構成オプションの一部は、将来のある時点でユーザー構成用に公開される可能性があります。

..  Note PEM components are upgraded independently.::
   `pem-server` を`--components` に渡すとPEMサーバーのみがアップグレードされますが、 `pem-agent` を渡すとPEMエージェントのみがアップグレードされます。個別にアップグレードする場合、サーバーの前にエージェントをアップグレードすることをお勧めします。両方が一緒にアップグレードされる場合、TPAはサーバーの前にエージェントをアップグレードします。

.. ::
   `tpaexec show-password $clusterdir $user` を実行して、Webインターフェイスのパスワードを取得します。

PEMエージェントの登録時に追加オプションを渡す
---------------------------------------------

TPAは、 ``pemworker`` ユーティリティの\ ``--register agent``
コマンドを使用して、クラスター内の各PEMエージェントを登録します。

クラスター構成に\ ``pemagent_registration_opts``
を含めることにより、追加登録オプションのリストを渡すことができます。

例

.. code:: yaml

     pemagent_registration_opts:
     - --enable-smtp true
     - --enable-heartbeat-connection
     - --allow-batch-probes true
     - -l DEBUG1

 
`PEM documentation <https://www.enterprisedb.com/docs/pem/latest/registering_agent/#registering-a-pem-agent-using-the-pemworker-utility>`_ 

に、登録オプションの詳細をリストします。

pemエージェントを使用するノードの便利な拡張機能
-----------------------------------------------

デフォルトでは、TPAは\ ``sql_profiler`` 、\ ``edb_wait_states``
、および\ ``query_advisor`` 拡張機能を\ ``pem-agent``
ロールを持つインスタンスに追加します。

pem-agentノードのデフォルトの拡張機能のこのリストは、config.ymlで\ ``pemagent_extensions``
を設定することによりオーバーライドできます。

このリストが空の場合、拡張機能は自動的に含まれません。

PEMサーバーSSL認証の外部証明書の提供
------------------------------------

デフォルトでは、PEMサーバーは自己署名証明書ペア\ ``server-pem.crt``
および\ ``server-pem.key``
を作成し、HTTPSアクセスにそれらを使用するようにウェブサーバーを構成します。

``server-pem.key`` のサイズは、変数\ ``pem_rsa_key_size``
を\ ``cluster_vars`` セクションに追加して変更できます。

.. code:: yaml

     (...)
     cluster_vars:
       pem_rsa_key_size: 4096

PEMデータベースによって促進されるCA証明書のサイズは、変数\ ``pem_db_ca_certificate_key_size``
を\ ``cluster_vars`` セクションに追加して変更することもできます。

.. code:: yaml

     (...)
     cluster_vars:
       pem_db_ca_certificate_key_size: 4096

デフォルトでは、自己署名TLS証明書の期間は10年です。期間は、
``cluster_vars`` セクションで\ ``openssl_certificate_validity``
を定義することにより調整できます。証明書を置き換える必要がある場合は、
``tpaexec deploy``
``tpaexec deploy (...) -e pem_web_server_renew_tls_certificates=true``
で\ ``pem_web_server_renew_tls_certificates`` 変数を使用します。

独自の証明書ペアを提供するには、 ``ssl/pemserver``
という名前のクラスターディレクトリのルートの下にディレクトリを作成し、その中に証明書ペアを配置します。

.. code:: yaml

   cluster directory
   ├── ssl
   │   └── pemserver
   │       ├── externally-provided.crt
   │       └── externally-provided.key

次に、 pemサーバーインスタンスの下の\ ``vars:``
またはクラスター構成ファイルの\ ``cluster_vars``
の値として、各ファイル名を使用して変数\ ``pem_server_ssl_certificate``
および\ ``pem_server_ssl_key`` を設定します。

TPAは、これらのファイルのpemサーバーインスタンスへのコピーを処理し、それに応じてウェブサーバーを構成します。

.. code:: yaml


   - Name: pemserver
     location: main
     node: 4
     role:
     - pem-server
     vars:
       pem_server_ssl_certificate: externally-provided.crt
       pem_server_ssl_key: externally-provided.key

PEMでのインスタンスの整理
-------------------------

PEMは、サーバーおよび/またはエージェントの **グループ** および
**クラスター**
への照合をサポートしています。次のインスタンス変数を設定することにより、TPAからこのグループ化を指定できます。

``pem-agent`` ロールはあるが、\ ``pem-server`` ロールがないインスタンス

- ``monitoring_group``
  は、このインスタンスのPostgresサーバーが割り当てられるグループの名前を指定します。指定しない場合、デフォルトの\ ``pem_server_group``
  の値が使用されます。

- ``monitoring_agent_group``
  は、このインスタンスのPEMエージェントを割り当てるグループの名前を指定します。指定しない場合、デフォルトの\ ``pem_agent_group``
  の値が使用されます。

- ``monitoring_cluster``
  は、このインスタンスのPostgresサーバーが割り当てられるクラスターの名前を指定します。指定しない場合、クラスターは割り当て/作成されません。

- ``monitoring_agent_cluster``
  は、このインスタンスのPEMエージェントを割り当てるクラスターの名前を指定します。指定しない場合、クラスターは割り当て/作成されません。

..  Note::
   PEMは、特定のクラスター名が単一のグループに存在することのみを許可するため、これらの値の一部の組み合わせは実行できません。たとえば、同じ`monitoring_cluster` と`monitoring_agent_cluster` を指定したが、異なる`monitoring_group` と`monitoring_agent_group` を指定した場合、これは同じクラスター名が2つの異なるグループに表示されることを意味します。 TPAを使用すると、PEMはこのような不一致を防止するのではなく、処理できます。これは、一般に`deploy` は成功するが、予想したサーバーとエージェントの構成を正確に取得できない場合があることを意味します。

.. ::
   `pem-server` ロールを持つインスタンスの場合

- ``pem_server_group``
  は、このPEMサーバーに登録されているPostgresサーバーが割り当てられるデフォルトグループの名前を指定します。指定しない場合、デフォルトの\ ``PEM Server Directory``
  が使用されます。

- ``pem_agent_group``
  は、このPEMサーバーに登録されたPEMエージェントが割り当てられるデフォルトグループの名前を指定します。指定しない場合、デフォルトの\ ``PEM Agents``
  になります

``pem-server``
ロールを持つインスタンスのPostgresサーバーとPEMエージェントは、常にそれぞれ\ ``pem_server_group``
および\ ``pem_agent_group`` に割り当てられることに注意してください。
TPAは、このサーバーまたはエージェントのクラスターへの追加をサポートしていません。

共有PEMサーバー
---------------

一部の展開では、組織内の複数のクラスターの監視と管理に単一のPEMサーバーを使用する場合があります。
tpaexec内の共有pemサーバーの展開は、既存のpemサーバーを使用する予定がある特定のクラスター構成のpemサーバーインスタンスの下で\ ``vars:``
を介して設定できる\ ``pem_shared`` 変数を介してサポートされています。
``pem_shared``
はブール変数であるため、可能な値はtrueおよびfalseデフォルトです。
pemserverインスタンスを共有として宣言する場合、pemserverインスタンスが実際には、最初にpemサーバーをプロビジョニングおよび展開した別のクラスター構成によって管理されていることを指定されたクラスター構成に伝えます。したがって、
pemのpostgresバックエンドを含むpemサーバーインスタンスに加えたい変更は、
pemserverインスタンスが共有pemインスタンスとして宣言されていないクラスターによって管理されます。

複数のクラスターで共有pemサーバーを使用するための一般的なワークフローは次のとおりです。

1. ``pem-server``
   ロールを持つ単一のインスタンスを使用してtpaexecクラスターを作成しますこの例では、’pem-cluster’と呼びます。
   pemサーバーとして実行される単一のインスタンスではなく、大規模なクラスターの一部としてプロビジョニングされるシナリオでも、同じワークフローを簡単に使用できますが、例として使用する方が簡単であるため、おそらくシングルノードクラスターを使用しますメンテナンスも簡単です。

2. 他のクラスターたとえばpg-clusterでは、共有pemサーバーインスタンスとして$clusters/pem-clusterからこの特定のpemサーバーを参照し、プラットフォームとして\ ``bare``
   を使用するため、新しいpemserverインスタンスを作成しようとはしていません。また、このクラスターがpemserverインスタンスにアクセスするために使用できるpemserverのIPアドレスを指定します。

.. code:: yml

       - Name: pemserver
         node: 5
         role:
         - pem-server
         platform: bare
         public_ip: 13.213.53.205
         private_ip: 10.33.15.102
         vars:
           pem_shared: true

3. postgresクラスターでdeployを実行する前に、pg-clusterがsshを介してpemサーバーインスタンスにアクセスできることを確認してください。
   ``ssh-copy-id``
   を介してpg-clusterの公開キーをpemサーバーインスタンスにコピーすることにより、このアクセスを許可でき、sshを実行して、パスワードを指定せずにログインできることを確認します。

.. code:: bash

       # add pem-clusters key to the ssh-agent (handy for `aws` platform)
       $ cd $clusters/pem-cluster
       $ ssh-add id_pem-clutser
       $ cd $clusters/pg-cluster
       $ ssh-keyscan -4 $pem-server-ip >> known_hosts
       $ ssh-copy-id -i id_pg-cluster.pub -o UserKnownHostsFile=tpa_known_hosts $user@$pem-server-ip
       $ ssh -F ssh_config pemserver

4. pemサーバーノードのpostgresql構成を更新して、新しいpg-clusterからの接続を許可します。
   pem-clusterのconfig.ymlの\ ``vars:``
   の下の\ ``pem_postgres_extra_hba_settings``
   に新しいエントリを追加することにより、pemサーバー上の既存のpg_hba.confを変更できます。例

.. code:: yml

       instances:
       - Name: pemserver
         location: main
         node: 1
         role:
         - pem-server
         vars:
           pem_postgres_extra_hba_settings:
             - "# Allow pem connections from pg-cluster1.quire"
             - hostssl pem +pem_agent 10.33.15.108/32 cert
             - "# Allow pem connections from pg-cluster1.upside"
             - hostssl pem +pem_agent 10.33.15.104/32 cert
             - "# Allow pem connections from pg-cluster2.zippy"
             - hostssl pem +pem_agent 10.33.15.110/32 cert
             - "# Allow pem connections from pg-cluster2.utopic"
             - hostssl pem +pem_agent 10.33.15.109/32 cert

次に、 ``tpaexec provision $clusters/pem-cluster``
に続いて\ ``tpaexec deploy $clusters/pem-cluster``
を実行します。完了すると、新しいpg-クラスターのノードはpemサーバーバックエンドと通信できるようになります。

5. pg-cluster内のノードのpemエージェントがpemサーバーバックエンドに接続して登録できることを確認するには、\ ``tpaexec deploy``
   を実行する前に最初に\ ``export EDB_PEM_CREDENTIALS_FILE=/path/to/pem/credentials/file``
   を行う必要があります。資格情報ファイルは、pemサーバーのバックエンドpostgresインスタンスへのアクセス資格情報を\ ``username:password``
   形式で含むテキストファイルです。

.. code:: shell

       cat pem_creds

.. code:: output

       postgres:f1I%fw!QmWevdzw#EL#$Ulu1cWhg7&RT

バックエンドパスワードがわからない場合は、 ``show-password``
tpaexecコマンドを使用して取得できます。

.. code:: shell

       tpaexec show-password $pem-clusterdir $user

6. ``tpaexec deploy $clusters/pg-cluster``
   を実行して、共有pemサーバーインスタンスを使用しながらpemが新しいpgクラスターに展開されます。

..  Note Mixed-platform clusters::
   共有PEMインスタンスを`platform: bare` として宣言することにより、クラスターを混合プラットフォームクラスターに変更した可能性があります。これには、この変更に対応するように`config.yml` の他の部分を調整する必要がある場合があります。具体的には、 `instance_defaults` セクションには、クラスター内のすべてのインスタンスに適用される設定のみを含める必要があります。たとえば、`instance_defaults` に、`platform: aws` でのみ有効な`type` などの設定が含まれている場合、その設定を`instance_defaults` からAWSプラットフォームを使用するインスタンスにのみ移動する必要があります。

.. ::
   ## PEM UIへの接続

PEM
UIはhttpsインターフェイスで実行されるため、https://$pem-server-ip/pemを介してPEMサーバーの実行中のインスタンスに接続できます。
PEM UIのログイン資格情報は、\ ``postgresql`` および\ ``epas``
フレーバーのそれぞれに\ ``postgres`` または\ ``enterprisedb``
を使用するpostgresバックエンドユーザーに設定されます。
tpaexecのshow-passwordコマンドは、バックエンドユーザーのパスワードを表示します。例

.. code:: shell

   tpaexec show-password $clusterdir $user

 
`PEM documentation <https://www.enterprisedb.com/docs/pem/latest/>`_ を参照

PEMの構成と使用法の詳細については、こちらをご覧ください。

``tpaexec upgrade`` を使用したPEMのマイナー更新
-----------------------------------------------

..  Note PEM major version upgrades from version 9 to version 10.::
  

::

   The PEM server package includes an SQL upgrade script which handles upgrading the database according to the PEM schema version.
   Upgrading from PEM `v9.8.0` to PEM `10.1.1` using `tpaexec upgrade` has been tested and works, but is a major version upgrade.

.. ::
   .. ::
   `pem-server` から`--components` に渡すとPEMサーバーのみがアップグレードされますが、 `pem-agent` を渡すとPEMエージェントのみがアップグレードされます。個別にアップグレードする場合、サーバーの前にエージェントをアップグレードすることをお勧めします。両方が一緒にアップグレードされる場合、TPAはサーバーの前にエージェントをアップグレードします。

.. ::
   PEMエージェントを特定のパッケージバージョンにアップグレードしようとする場合、 `config.yml` の`pem_agent_package_version` が更新されて、目的のバージョンを反映していることを確認します。

PEMサーバーを特定のパッケージバージョンにアップグレードしようとする場合、\ ``config.yml``
の\ ``pem_server_package_version``
が更新されて、目的のバージョンを反映していることを確認します。

目的のバージョンを追加の引数として\ ``tpaexec upgrade``
コマンドに渡すこともできます。

.. code:: shell

   tpaexec upgrade <cluster_dir> \
     -e pem_agent_package_version="<desired version>" \
     -e pem_server_package_version="<desired version>" \
     --components=pem-agent,pem-server

詳細については、 :ref:`package version selection and upgrade <Upgrading your cluster>` のセクションを参照してください。

アップグレードするPEMエージェントを選択するには、 ``tpaexec upgrade``
コマンドに渡される\ ``--components`` フラグに\ ``pem-agent``
または\ ``all`` が含まれていることを確認します

アップグレードするPEMサーバーを選択するには、 ``tpaexec upgrade``
コマンドに渡される\ ``--components`` フラグに ``pem-server``
または\ ``all`` が含まれていることを確認します

:ref:`component selection for upgrade <Upgrading your cluster>` のセクションを参照してください

詳細については、
