第18章 インスタンスとコンテナーグループ
Automation Controller を使用すると、クラスターのメンバーで直接実行される Ansible Playbook を通じて、または必要なサービスアカウントがプロビジョニングされた OpenShift クラスターの namespace でジョブを実行できます。これをコンテナーグループと呼びます。コンテナーグループ内のジョブは、Playbook ごとに必要な場合にのみ実行できます。詳細は、コンテナーグループ を参照してください。
実行環境については、実行環境 を参照してください。
18.1. インスタンスグループ
インスタンスは 1 つ以上のインスタンスグループにグループ化できます。インスタンスグループは、以下にリストされているリソースの 1 つ以上に割り当てることができます。
- 組織
- インベントリー
- ジョブテンプレート
いずれかのリソースに関連付けられたジョブが実行されると、そのジョブは当該リソースに関連付けられたインスタンスグループに割り当てられます。実行プロセス中、ジョブテンプレートに関連付けられたインスタンスグループは、インベントリーに関連付けられたインスタンスグループよりも先にチェックされます。インベントリーに関連付けられたインスタンスグループは、組織に関連付けられたインスタンスグループよりも先にチェックされます。したがって、3 つのリソースに対するインスタンスグループの割り当てにより、以下の階層が形成されます。
Job Template > Inventory > Organization
インスタンスグループを使用する場合は、次の点を考慮してください。
-
これらのグループ内に、他のグループおよびグループインスタンスを定義できます。これらのグループには、
instance_group_
という接頭辞を付ける必要があります。インスタンスは、他のinstance_group_
グループと共に、automationcontroller
またはexecution_nodes
グループに存在する必要があります。クラスター化されたセットアップでは、automationcontroller
グループに少なくとも 1 つのインスタンスが存在する必要があります。これは、API インスタンスグループでcontrolplane
として表示されます。詳細とシナリオ例については、automationcontroller
のグループポリシー を参照してください。 controlplane
インスタンスグループを変更することはできません。変更しようとすると、すべてのユーザーに対してパーミッション拒否エラーが発生します。したがって、
controlplane
の Instances タブでは、Disassociate オプションを使用できません。-
default
API インスタンスグループは、ジョブを実行可能なすべてのノードで自動的に作成されます。これは他のインスタンスグループと同様ですが、特定のインスタンスグループが特定のリソースに関連付けられていない場合、ジョブの実行は常にデフォルトのインスタンスグループにフォールバックします。デフォルトのインスタンスグループは常に存在し、削除したり名前を変更したりすることはできません。 -
instance_group_default
という名前のグループは作成しないでください。 - インスタンスにグループ名と同じ名前を指定しないでください。
18.1.1. automationcontroller
のグループポリシー
ノードを定義する際には、以下の基準を使用します。
-
automationcontroller
グループ内のノードは、node_type
ホスト変数をhybrid
(デフォルト) またはcontrol
と定義できます。 -
execution_nodes
グループ内のノードは、node_type
ホスト変数をexecution
(デフォルト) またはhop
と定義できます。
インベントリーファイルでカスタムグループを定義するには、instance_group_*
を使用してグループに名前を付けます。*
は API のグループの名前になります。インストールの完了後に、API でカスタムインスタンスグループを作成することもできます。
現在の動作では、instance_group_*
のメンバーが automationcontroller
または execution_nodes
グループのメンバーであることを想定しています。
例
[automationcontroller] 126-addr.tatu.home ansible_host=192.168.111.126 node_type=control [automationcontroller:vars] peers=execution_nodes [execution_nodes] [instance_group_test] 110-addr.tatu.home ansible_host=192.168.111.110 receptor_listener_port=8928
インストールプログラムを実行すると、次のエラーが表示されます。
TASK [ansible.automation_platform_installer.check_config_static : Validate mesh topology] *** fatal: [126-addr.tatu.home -> localhost]: FAILED! => {"msg": "The host '110-addr.tatu.home' is not present in either [automationcontroller] or [execution_nodes]"}
これを修正するには、ボックス 110-addr.tatu.home
を execution_node
グループに移動します。
[automationcontroller] 126-addr.tatu.home ansible_host=192.168.111.126 node_type=control [automationcontroller:vars] peers=execution_nodes [execution_nodes] 110-addr.tatu.home ansible_host=192.168.111.110 receptor_listener_port=8928 [instance_group_test] 110-addr.tatu.home
その結果、以下のようになります。
TASK [ansible.automation_platform_installer.check_config_static : Validate mesh topology] *** ok: [126-addr.tatu.home -> localhost] => {"changed": false, "mesh": {"110-addr.tatu.home": {"node_type": "execution", "peers": [], "receptor_control_filename": "receptor.sock", "receptor_control_service_name": "control", "receptor_listener": true, "receptor_listener_port": 8928, "receptor_listener_protocol": "tcp", "receptor_log_level": "info"}, "126-addr.tatu.home": {"node_type": "control", "peers": ["110-addr.tatu.home"], "receptor_control_filename": "receptor.sock", "receptor_control_service_name": "control", "receptor_listener": false, "receptor_listener_port": 27199, "receptor_listener_protocol": "tcp", "receptor_log_level": "info"}}}
Automation Controller 4.0 以前のバージョンからアップグレードした後は、レガシーの instance_group_
メンバーに awx コードがインストールされている可能性があります。これにより、ノードが automationcontroller
グループに配置されます。
18.1.2. API からのインスタンスグループの設定
インスタンスグループは、システム管理者として /api/v2/instance_groups
に POST 要求を出すことで作成できます。
インスタンスグループを作成したら、以下を使用してインスタンスをインスタンスグループに関連付けることができます。
HTTP POST /api/v2/instance_groups/x/instances/ {'id': y}`
インスタンスグループに追加したインスタンスは、グループのワークキューをリッスンするように自動で再設定されます。詳細は、次の インスタンスグループのポリシー セクションを参照してください。
18.1.3. インスタンスグループのポリシー
ポリシーを定義することにより、オンラインになると自動的にインスタンスグループに参加するように Automation Controller インスタンスを設定できます。これらのポリシーは、新しいインスタンスがオンラインになるたびに評価されます。
インスタンスグループポリシーは、Instance Group
の次の 3 つの任意フィールドにより制御されます。
-
policy_instance_percentage
: これは、0 - 100 の間の数字で指定します。これにより、指定した割合のアクティブな Automation Controller インスタンスがこのインスタンスグループに確実に追加されます。新しいインスタンスがオンラインになると、インスタンスの総数に対してこのグループのインスタンス数が指定の割合より少ない場合には、指定の割合の条件を満たすまで、新しいインスタンスが追加されます。 -
policy_instance_minimum
: このポリシーは、インスタンスグループ内に保持するよう試行する最小インスタンス数を指定します。利用可能なインスタンスの数がこの最小数よりも少ない場合、すべてのインスタンスがこのインスタンスグループに配置されます。 -
policy_instance_list
: これは、このインスタンスグループに常に含めるインスタンス名の固定リストです。
Automation Controller ユーザーインターフェイス (UI) の Instance Groups リストビューには、インスタンスグループポリシーをもとにした各インスタンスグループのキャパシティーレベルの概要が表示されます。
関連情報
詳細は、インスタンスグループの管理 セクションを参照してください。
18.1.4. 主なポリシーの考慮事項
ポリシーに関して以下の点を考慮してください。
-
policy_instance_percentage
とpolicy_instance_minimum
は、どちらも最小割り当てレベルを設定します。グループに割り当てるインスタンスの数が多いルールが有効になります。たとえば、policy_instance_percentage
が 50%、policy_instance_minimum
が 2 の場合、6 つのインスタンスを起動すると、そのうち 3 つがインスタンスグループに割り当てられます。クラスター内のインスタンス総数を 2 に減らすと、policy_instance_minimum
を満たすように、2 つのインスタンスがいずれもインスタンスグループに割り当てられます。こうすることで、利用可能なリソースの制限に合わせて、低い値を設定できます。 - ポリシーは、インスタンスが複数のインスタンスグループに割り当てられないように自発的に規制するわけではありませんが、割合が合計で 100 になるように指定すると、複数のインスタンスグループに割り当てないようにできます。4 つのインスタンスグループがある場合、各インスタンスグループに割合の値として 25 を割り当てると、インスタンスはグループ間で重複することなく分散されます。
18.1.5. 特定グループへのインスタンスの手動ピニング
インスタンスが特別で、特定のインスタンスグループだけに割り当てる必要があり、"percentage" または "minimum" のポリシーで他のグループに自動的に参加させない場合には、以下を行います。
手順
-
インスタンスを 1 つ以上のインスタンスグループの
policy_instance_list
に追加します。 -
インスタンスの
manage_by_policy
プロパティーをFalse
に更新します。
これにより、インスタンスが percentage と minimum ポリシーに基づいて他のグループに自動的に追加されるのを防ぎます。当該インスタンスは、手動で割り当てたグループにのみ属します。
HTTP PATCH /api/v2/instance_groups/N/ { "policy_instance_list": ["special-instance"] } HTTP PATCH /api/v2/instances/X/ { "managed_by_policy": False }
18.1.6. ジョブランタイムの動作
インスタンスグループに関連付けられたジョブを実行する場合は、次の動作に注意してください。
- クラスターを個別のインスタンスグループに分割した場合、その動作はクラスター全体の動作と同様になります。2 つのインスタンスを 1 つのグループに割り当てた場合、いずれのインスタンスも同じグループ内の他のインスタンスと同様の確率でジョブを受け取ります。
- Automation Controller インスタンスがオンラインになると、システムの作業容量が実質的に拡張されます。これらのインスタンスをインスタンスグループに配置すると、そのグループの容量も拡張されます。複数のグループのメンバーであるインスタンスが作業を実行している場合、インスタンスがメンバーとなっているすべてのグループから容量が削減されます。インスタンスのプロビジョニングを解除すると、そのインスタンスが割り当てられていたクラスターから容量が削除されます。詳細は、インスタンスグループのプロビジョニング解除 セクションを参照してください。
すべてのインスタンスを同じ容量でプロビジョニングする必要はありません。
18.1.7. ジョブ実行場所の制御
インスタンスグループをジョブテンプレート、インベントリー、または組織に関連付けた場合、そのジョブテンプレートから実行したジョブはデフォルトの動作の対象になりません。つまり、これら 3 つのリソースに関連付けられたインスタンスグループ内のすべてのインスタンスが容量不足の場合、容量が利用可能になるまでジョブが保留状態になります。
ジョブ送信先のインスタンスグループを決定する際の優先順位は、以下のとおりです。
- ジョブテンプレート
- Inventory
- 組織 (プロジェクトの形式)
インスタンスグループをジョブテンプレートに関連付け、すべてのインスタンスグループが容量に達している場合、ジョブはインベントリーで指定したインスタンスグループに送信され、次に組織で指定したインスタンスグループに送信されます。リソースが利用可能な場合、優先順位の高いグループから順にジョブを実行する必要があります。
Playbook で定義されたカスタムインスタンスグループなどのリソースに、グローバルの default
グループを関連付けることもできます。これを使用して、ジョブテンプレートまたはインベントリーで優先インスタンスグループを指定できます。一方で、容量が不足している場合には任意のインスタンスにジョブを送信できます。
例
-
group_a
をジョブテンプレートに関連付け、default
グループをそのインベントリーに関連付けると、group_a
が容量不足の場合にdefault
グループをフォールバックとして使用できるようになります。 - さらに、インスタンスグループを 1 つのリソースに関連付けずに、別のリソースをフォールバックとして選択することもできます。たとえば、インスタンスグループをジョブテンプレートに関連付けず、インベントリーまたは組織のインスタンスグループにフォールバックさせます。
ここでは、次の 2 つの例を示します。
- インスタンスグループをインベントリーに関連付けた場合 (インスタンスグループへのジョブテンプレートの割り当てを省略)、特定のインベントリーに対して Playbook を実行すると、そのインベントリーに関連付けられたグループでのみ実行されます。これは、それらのインスタンスのみが管理対象ノードへの直接リンクを有する状況で役立ちます。
管理者はインスタンスグループを組織に割り当てることができます。これにより、管理者はインフラストラクチャー全体をセグメント化し、他の組織のジョブ実行能力を妨げることなくジョブを実行できる容量を、各組織が確保できるようになります。
管理者は、次のシナリオのように、各組織に複数のグループを割り当てることができます。
- A、B、および C の 3 つのインスタンスグループがあります。Org1 と Org2 の 2 つの組織があります。
- 管理者は、グループ A を Org1 に、グループ B を Org2 に割り当てます。次に、必要になる可能性がある追加容量のオーバーフローとして、グループ C を Org1 と Org2 の両方に割り当てます。
- 組織管理者は、必要なグループにインベントリーまたはジョブテンプレートを自由に割り当てたり、組織からデフォルトの順序を継承させたりすることができます。
このようにリソースを配置すると、柔軟性が得られます。また、インスタンスを 1 つだけ含むインスタンスグループを作成して、Automation Controller クラスター内の特定のホストに作業を割り振ることもできます。
18.1.8. インスタンスグループの容量制限
外部ビジネスロジックにより、インスタンスグループに送信したジョブの同時実行性や、消費するフォークの最大数を制限する必要性が高まる場合があります。
従来のインスタンスおよびインスタンスグループの場合、2 つの組織が同じ基盤インスタンス上でジョブを実行できるようにしながら、各組織の同時実行ジョブの総数を制限することが推奨されます。これは、組織ごとにインスタンスグループを作成し、max_concurrent_jobs
の値を割り当てることで実現できます。
Automation Controller グループの場合、Automation Controller は通常、OpenShift クラスターのリソース制限を認識しません。namespace の Pod 数に制限を設定することができます。自動スケーリングが設定されていない場合には、一度に特定の数の Pod をスケジュールするのに使用できるリソースのみに設定したりできます。この場合、max_concurrent_jobs
の値を調整できます。
使用可能なもう 1 つのパラメーターは max_forks
です。このパラメーターにより、インスタンスグループまたはコンテナーグループで消費される容量の上限をさらに柔軟に設定できます。このパラメーターは、さまざまなインベントリーサイズと "forks" 値を持つジョブが実行されている場合に使用できます。組織が同時に実行できるジョブの数を最大 10 個に制限し、一度に消費するフォークの数を最大 50 個に制限できます。
max_concurrent_jobs: 10 max_forks: 50
それぞれ 5 つのフォークを使用する 10 個のジョブを実行している場合、これらのジョブの 1 つがそのグループでの実行を終了する (または、容量のある別のグループでスケジュールされる) まで、11 番目のジョブは待機します。
それぞれ 20 個のフォークを使用する 2 つのジョブを実行している場合、これらのジョブの 1 つがそのグループでの実行を終了する (または、容量のある別のグループでスケジュールされる) まで、task_impact
が 11 以上の 3 番目のジョブは待機します。
コンテナーグループの場合、ジョブの "forks" 値に関係なく、すべてのジョブが同じリソース要求で同じ pod_spec
を使用して送信されるため、max_forks
値を使用すると便利です。デフォルトの pod_spec
は、制限ではなく要求を設定します。そのため、Pod はスロットリングが適用されたりリープされたりすることなく、要求した値を超えて「バースト」できます。max_forks
値を設定することで、フォーク値の大きい多数のジョブが同時にスケジュールされ、OpenShift ノードが、要求した値よりも多くのリソースを使用して複数の Pod でオーバーサブスクライブされるという状況を防ぐことができます。
インスタンスグループ内の同時ジョブとフォークの最大値を設定するには、インスタンスグループの作成 を参照してください。
18.1.9. インスタンスグループのプロビジョニング解除
設定用 Playbook を再実行しても、インスタンスのプロビジョニングは解除されません。これは現在、インスタンスが意図的にオフラインにされたのか、障害が原因でオフラインになったのかをクラスターが識別できないためです。代わりに、Automation Controller インスタンスの全サービスをシャットダウンした後に、他のインスタンスからプロビジョニング解除ツールを実行します。
手順
次のコマンドで、インスタンスをシャットダウンするか、サービスを停止します。
automation-controller-service stop
別のインスタンスから次のプロビジョニング解除コマンドを実行して、コントローラーのクラスターレジストリーからインスタンスを削除します。
awx-manage deprovision_instance --hostname=<name used in inventory file>
例
awx-manage deprovision_instance --hostname=hostB
Automation Controller でインスタンスグループのプロビジョニングを解除しても、インスタンスグループは自動的にプロビジョニング解除されたり削除されたりしません (再プロビジョニングによって当該インスタンスグループが使用されなくなることはしばしばあります)。インスタンスグループは、引き続き API エンドポイントや統計監視に表示される可能性があります。次のコマンドを使用すると、これらのグループを削除できます。
awx-manage unregister_queue --queuename=<name>
インベントリーファイルのインスタンスグループからインスタンスのメンバーシップを削除し、設定用 Playbook を再実行しても、インスタンスがグループに再度追加されなくなるわけではありません。インスタンスがグループに再度追加されないようにするには、API を介してインスタンスを削除し、インベントリーファイルからも削除します。インベントリーファイルでのインスタンスグループの定義をやめることもできます。Automation Controller UI を通じてインスタンスグループのトポロジーを管理できます。UI でインスタンスグループを管理する方法の詳細は、インスタンスグループの管理 を参照してください。
古いバージョンの Automation Controller (3.8.x 以前) で作成した分離インスタンスグループがあり、それらを実行ノードに移行して自動化メッシュアーキテクチャーで使用できるようにする場合は、Ansible Automation Platform Upgrade and Migration Guide の Migrate isolated instances to execution nodes を参照してください。