Cluster configuration
=====================

TPAでは、クラスターの構成を変更する方法は、config.ymlを編集し、プロビジョニング/展開/テストサイクルを実行することです。このプロセスは、べき等であるように、構成の変更またはインスタンスの変更に応じてのみ変更を行うように注意深く設計されています。

:ref:`クラスター構成 <クラスター構成>` コマンドは、賢明なconfig.ymlファイルを生成しますが、最も一般的なトポロジと構成オプションのみをカバーしています。デフォルト以外のものが必要な場合、またはクラスターをプロビジョニングした後に変更を行う必要がある場合は、とにかくconfig.ymlを編集する必要があります。

このページは、使用可能な構成メカニズムの概要を示しています。特定の
:ref:`Instance configuration <Instance configuration>` の詳細を含む別のページがあります。

config.yml
----------

``config.yml``
ファイルは、目的のクラスター構成のすべての側面を表す `YAML format <https://yaml.org>`_ テキストファイルです。次に、2つのインスタンスを持つクラスターの最小限の例を示します。

.. code:: yaml

   cluster_name: speedy

   cluster_vars:
     postgres_version: 14

   instances:

   - node: 1
     Name: one
     role: primary
     platform: docker
     vars:
       ansible_user: root
       x: 42


   - node: 2
     Name: two
     role: replica
     platform: docker
     upstream: one
     vars:
       ansible_user: root
       x: 53

これら3つの定義は、クラスター構成の中心となります。ファイルには、他の多くの定義プラットフォーム固有の詳細を含む場合がありますが、1つのインスタンスまたはクラスター全体に設定された\ ``instances``
と\ ``vars`` のリストは、すべてのTPA構成の基本ビルディングブロックです。

すべて :ref:`クラスター構成 <クラスター構成>` 

オプションは、何らかの方法でconfig.yml変数に変換されます。
1つのオプションは複数の変数に影響を与える場合がありますたとえば、
``--bdr-version`` は\ ``postgres_version`` 、\ ``edb_repositories``
、\ ``extra_postgres_extensions``
などを設定できますが、コマンドを実行してできることはエディターでいつでも実行できます。

YAML構文の観点では、config.yml全体が\ ``cluster_vars`` や\ ``instances``
などのキーを含むハッシュを表します。
**各キーが1度だけ定義されていることを確認する必要があります。**
誤って\ ``cluster_vars``
を繰り返した場合、2番目の定義が前者を完全にオーバーライドし、次の展開はシャドウされた変数が欠落しているために意図しない変更を行う可能性があります。

TPAは、クラスタートポロジ全体の一貫性をチェックしますたとえば、ロール「レプリカ」でインスタンスを宣言する場合、その上流インスタンスの名前も宣言し、そのインスタンスが存在する必要があります。ただし、それは妨げるものではありませんインスタンスに好きな変数を設定します。十分な注意を払い、変更を運用環境にロールアウトする前にテスト環境で変更を試す必要があります。

変数
----

Ansibleの用語では、ほとんどの構成設定は「インベントリー変数」です。TPAは、プロビジョニング中にインベントリーで\ ``cluster_vars``
を\ ``group_vars`` クラスター全体に適用し、各インスタンスの\ ``vars``
を\ ``host_vars``
に変換し、デプロイメントはインベントリー値を使用します。
config.ymlを変更した後、 **``tpaexec deploy`` の前に**
``tpaexec provision`` を実行することを忘れないでください。

クラスター全体、個々のホスト、またはその両方に変数を設定できます。ホスト変数はグループ変数をオーバーライドします。実際には、
``cluster_vars`` で\ ``x: 42``
を設定することは、すべてのホストの\ ``vars``
で設定することと同じです。デプロイメント中に\ ``x``
を必要とするホストには、いずれの場合も値42が表示されます。ホストは常に最も具体的な値を参照するため、グループにいくつかのデフォルト値を設定し、必要に応じて特定のインスタンスにオーバーライドすると便利です。

可能な限り、 ``cluster_vars``
で変数を定義し、特定のインスタンスでそれらをオーバーライドすると、確認と変更が簡単な簡潔な構成が得られます。繰り返しが少なくなります。それを超えて、特定の設定がグループ変数またはホスト変数としてより意味があるかどうかは、あなたが決定する必要があります。

クラスター変数
--------------

``cluster_vars``
の下のキーは、有効なYAMLタイプにマップでき、Ansibleインベントリのグループ変数に直接変換されます。

.. code:: yaml

   cluster_vars:
     postgres_version: 14
     edb_repositories:
     - enterprise
     - postgres_distributed
     postgres_conf_settings:
       bdr.trace_replay: true

!!!警告

テンプレートで使用される変数は、 ``config.yml`` のトップレベル
``cluster_name`` 変数と同じレベルで定義する必要があります

以下の例を参照してください。

.. ::
   edb_notranlate_2

この場合、\ ``tpaexec provision``
は3つの変数文字列、リスト、およびハッシュを\ ``group_vars/tag_Cluster_name/01-cluster_name.yml``
のインベントリに書き込みます。

インスタンス変数
----------------

このドキュメントでは、config.ymlの特定のインスタンスに対して定義された変数を参照するために「インスタンス変数」という用語を使用しています。例、これは一般的なインスタンス定義です。

.. code:: yaml

   instances:

   - Name: unwind
     node: 1
     backup: unkempt
     location: a
     role:
     - primary
     - bdr
     volumes:
     - device_name: root
       encrypted: true
       volume_size: 16
       volume_type: gp2
     - device_name: /dev/xvdf
       encrypted: true
       vars:
         volume_for: postgres_data
       volume_size: 64
       volume_type: gp2
     platform: aws
     type: t3.micro
     vars:
       ansible_user: ec2-user
       postgres_conf_directory: /opt/postgres/conf

このインスタンスの\ ``vars``
で定義された変数はすべてインベントリーのホスト変数になりますが、インベントリー内のすべてのホスト変数は\ ``vars``
のみから取得されるわけではありません。 ``platform`` 、\ ``location``
、\ ``volumes`` 、\ ``role``
などの他の一部のインスタンス設定もホスト変数としてインベントリにコピーされますが、代わりに\ ``vars``
または\ ``cluster_vars`` でこれらの設定を定義することはできません。

``vars`` の外部の設定は、インスタンスのプロパティたとえば\ ``Name``
および\ ``node``
またはクラスターのトポロジ内のその場所たとえば\ ``role`` 、\ ``backup``
またはそれらはプラットフォーム固有の属性たとえばインスタンス\ ``type``
および\ ``volumes`` などを記述する場合があります。 。 ``vars``
では定義できないことを除き、これらのインスタンスの「設定」とインスタンス「変数」を区別する必要があることはほとんどありません。

この場合、\ ``tpaexec provision``
は多くのホスト変数を\ ``host_vars/unwind/01-instance_vars.yml``
のインベントリに書き込みます。

instance_defaults
-----------------

これは、config.ymlの繰り返しをさらに削減するメカニズムです。
``cluster_vars``
として定義できないインスタンス設定に最も役立ちます。例、次のように書くことができます。

.. code:: yaml

   instance_defaults:
     platform: aws
     type: t3.micro
     tags:
       AWS_ENVIRONMENT_SPECIFIC_TAG_KEY: some_mandated_value

   instances:

   - node: 1
     Name: one

   - node: 2
     Name: two

   - …

``instance_defaults`` の下で指定したものは、 ``instances``
のすべてのエントリーのデフォルトとして機能します。この例では、各インスタンスの\ ``platform``
および\ ``type``
のスペルアウトを保存し、すべてのインスタンスを別のタイプに変更するのが簡単になります。インスタンスが別の値を指定している場合、もちろんデフォルトより優先されます。

``instance_defaults`` は、\ ``instances``
を定義する際に使用するマクロ機能であると考えると役立つでしょう。最終的にインベントリに書き込まれるものは、\ ``instances``
の展開された定義のみから来ます。 ``cluster_vars``
または\ ``instance_defaults``
に何かを入れるかどうかを決定しようとしている場合、それはおそらく前者に属します変数たとえば、\ ``platform``
または\ ``type``
などとして定義できません。これは、多くのプラットフォーム固有のプロパティに当てはまりますAWSリソースタグなど)は、プロビジョニングでのみ使用され、展開中は使用されません。

``instance_defaults`` メカニズムは、インスタンスの\ ``vars``
を埋めるために使用することを妨げるものではありません。デフォルトのハッシュ値は、\ ``instances``
エントリーで指定されたハッシュとマージされます。ただし、
``cluster_vars``
で同じデフォルトを設定し、必要に応じてインスタンスにオーバーライドするよりもこれを行うことに特に利点はありません。よくわからない場合は、
``cluster_vars`` を使用してください。

ロケーション
------------

config.ymlで\ ``locations`` のリストを指定することもできます。

.. code:: yaml

   locations:

   - Name: first
     az: eu-west-1a
     region: eu-west-1
     subnet: 10.33.110.128/28


   - Name: second
     az: us-east-1b
     region: us-east-1
     subnet: 10.33.75.0/24

   instances:

   - node: 1
     Name: one
     location: first
   …

インスタンスが\ ``location: first`` または\ ``location: 0``
を指定する場合、その場所の設定はそのインスタンスのデフォルトとして機能します。ここでも、
``instance_defaults``
と同様に、インスタンスはその場所から継承するデフォルトをオーバーライドできます。また、この機能を使用して、インスタンスの\ ``vars``
を入力できます。これは、インスタンスの半分にのみ適用されるデフォルトと、残りの半分に異なる値がある場合に役立ちます。上記の例のプラットフォーム固有の設定の場合。

ロケーションは、インスタンスが「オプトイン」できる設定のコレクションを表します。それらを使用して、さまざまなデータセンター、AWSリージョン、Dockerホスト、または完全に他のものを表すことができます。
TPAは、特定の解釈を想定または強制しません。
