第8章 インスタンスとコンテナーグループ
Automation Controller を使用すると、クラスターのメンバーで直接実行される Ansible Playbook を通じて、または必要なサービスアカウントがプロビジョニングされた OpenShift クラスターの namespace で実行される Ansible Playbook を通じてジョブを実行できます。これをコンテナーグループと呼びます。
コンテナーグループ内のジョブは、Playbook ごとに必要な場合にのみ実行できます。詳細は、コンテナー グループ を参照し てください。
実行環境については、Automation Controller ユーザーガイド の 実行環境の 項を参照してください。
8.1. インスタンスグループ リンクのコピーリンクがクリップボードにコピーされました!
インスタンスは 1 つ以上のインスタンスグループにグループ化できます。インスタンスグループは、以下にリストされているリソースの 1 つ以上に割り当てることができます。
- 組織
- インベントリー
- ジョブテンプレート
いずれかのリソースに関連付けられたジョブが実行されると、そのジョブは当該リソースに関連付けられたインスタンスグループに割り当てられます。実行プロセス中、ジョブテンプレートに関連付けられたインスタンスグループは、インベントリーに関連付けられたインスタンスグループよりも先にチェックされます。インベントリーに関連付けられたインスタンスグループは、組織に関連付けられたインスタンスグループよりも先にチェックされます。したがって、3 つのリソースに対するインスタンスグループの割り当てにより、以下の階層が形成されます。
ジョブテンプレート > インベントリー > 組織
インスタンスグループを使用する場合は、次の点を考慮してください。
-
これらのグループ内に、他のグループおよびグループインスタンスを定義できます。これらのグループには、
instance_group_という接頭辞を付ける必要があります。インスタンスは、他のインスタンスグループとともに、automationcontrollerまたはexecution_nodesグループに属している必要があります。クラスター設定の場合、少なくとも 1 つのインスタンスがautomationcontrollerグループに存在する必要があり、これは API インスタンスグループではcontrolplaneとして表示されます。詳細情報と例となるシナリオについては、automationcontrollerのグループポリシー を参照してください。 コントロールプレーンインスタンスグループを変更することはできません。変更しようとすると、どのユーザーであっても権限拒否エラーが発生します。そのため、
コントロールプレーンの インスタンス タブには 関連付け解除 オプションは表示されません。-
ジョブを実行可能なすべてのノードを含む、
デフォルトのAPI インスタンスグループが自動的に作成されます。これは他のインスタンスグループと同様ですが、特定のインスタンスグループが特定のリソースに関連付けられていない場合、ジョブの実行は常にデフォルトのインスタンスグループにフォールバックします。デフォルトのインスタンスグループは常に存在し、削除したり名前を変更したりすることはできません。 -
instance_group_defaultという名前のグループを作成しないでください。 - インスタンスにグループ名と同じ名前を指定しないでください。
8.1.1. オートメーションコントローラー のグループポリシー リンクのコピーリンクがクリップボードにコピーされました!
ノードを定義する際には、以下の基準を使用します。
-
automationcontrollerグループのノードは、node_typehostvar をhybrid(default) またはcontrolに定義できます。 -
execution_nodes グループのノードは、node_typehostvar を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 Controller4.0 以前のバージョンからアップグレードすると、レガシーな instance_group_ メンバーに awx コードがインストールされている可能性があります。これにより、そのノードが オートメーションコントローラー グループに配置されます。
8.1.2. API からのインスタンスグループの設定 リンクのコピーリンクがクリップボードにコピーされました!
システム管理者として /api/v2/instance_groups に POST リクエストを送信することで、インスタンスグループを作成できます。
インスタンスグループを作成したら、以下を使用してインスタンスをインスタンスグループに関連付けることができます。
HTTP POST /api/v2/instance_groups/x/instances/ {'id': y}`
インスタンスグループに追加したインスタンスは、グループのワークキューをリッスンするように自動で再設定されます。詳細は、次のセクション インスタンスグループポリシー を参照してください。
8.1.3. インスタンスグループのポリシー リンクのコピーリンクがクリップボードにコピーされました!
ポリシーを定義することにより、オンラインになると自動的にインスタンスグループに参加するように Automation Controller インスタンスを設定できます。これらのポリシーは、新しいインスタンスがオンラインになるたびに評価されます。
インスタンスグループのポリシーは、インスタンスグループ 上の以下の 3 つのオプションフィールドによって制御されます。
-
policy_instance_percentage:0-100 の間の数値です。これにより、指定した割合のアクティブな Automation Controller インスタンスがこのインスタンスグループに確実に追加されます。新しいインスタンスがオンラインになると、インスタンスの総数に対してこのグループのインスタンス数が指定の割合より少ない場合には、指定の割合の条件を満たすまで、新しいインスタンスが追加されます。 -
policy_instance_minimum: このポリシーは、インスタンスグループ内に少なくともこの数のインスタンスを維持しようとします。利用可能なインスタンスの数がこの最小数よりも少ない場合、すべてのインスタンスがこのインスタンスグループに配置されます。 -
policy_instance_list: これは、このインスタンスグループに常に含めるべきインスタンス名の固定リストです。
Automation Controller ユーザーインターフェイス (UI) の インスタンスグループ リストビューには、インスタンスグループポリシーに基づいた各インスタンスグループの容量レベルの概要が表示されます。
関連情報
詳細は、Automation Controller ユーザーガイド の インスタンスグループの管理 セクションを参照してください。
8.1.4. 主なポリシーの考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
ポリシーに関して以下の点を考慮してください。
-
policy_instance_percentageとpolicy_instance_minimum はどちらも最小割り当て量を設定します。グループに割り当てるインスタンスの数が多いルールが有効になります。たとえば、policy_instance_percentageが 50%、policy_instance_minimumが 2 で、6 つのインスタンスを起動した場合、そのうち 3 つがインスタンスグループに割り当てられます。クラスター内のインスタンスの総数を 2 に減らすと、その両方ともpolicy_instance_minimum を満たすインスタンスグループに割り当てられます。こうすることで、利用可能なリソースの制限に合わせて、低い値を設定できます。 - ポリシーは、インスタンスが複数のインスタンスグループに割り当てられないように自発的に規制するわけではありませんが、割合が合計で 100 になるように指定すると、複数のインスタンスグループに割り当てないようにできます。4 つのインスタンスグループがある場合、各インスタンスグループに割合の値として 25 を割り当てると、インスタンスはグループ間で重複することなく分散されます。
8.1.5. 特定グループへのインスタンスの手動ピニング リンクのコピーリンクがクリップボードにコピーされました!
インスタンスが特別で、特定のインスタンスグループだけに割り当てる必要があり、"percentage" または "minimum" のポリシーで他のグループに自動的に参加させない場合には、以下を行います。
手順
-
インスタンスを 1 つ以上のインスタンスグループの
policy_instance_listに追加します。 -
インスタンスの
managed_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
}
8.1.6. ジョブランタイムの動作 リンクのコピーリンクがクリップボードにコピーされました!
インスタンスグループに関連付けられたジョブを実行する場合は、次の動作に注意してください。
- クラスターを個別のインスタンスグループに分割した場合、その動作はクラスター全体の動作と同様になります。2 つのインスタンスを 1 つのグループに割り当てた場合、いずれのインスタンスも同じグループ内の他のインスタンスと同様の確率でジョブを受け取ります。
- Automation Controller インスタンスがオンラインになると、システムの作業容量が実質的に拡張されます。これらのインスタンスをインスタンスグループに配置すると、そのグループの容量も拡張されます。複数のグループのメンバーであるインスタンスが作業を実行している場合、インスタンスがメンバーとなっているすべてのグループから容量が削減されます。インスタンスのプロビジョニングを解除すると、そのインスタンスが割り当てられていたクラスターから容量が削除されます。詳細は、インスタンスグループのプロビジョニング解除 セクションを参照してください。
すべてのインスタンスを同じ容量でプロビジョニングする必要はありません。
8.1.7. ジョブ実行場所の制御 リンクのコピーリンクがクリップボードにコピーされました!
インスタンスグループをジョブテンプレート、インベントリー、または組織に関連付けた場合、そのジョブテンプレートから実行したジョブはデフォルトの動作の対象になりません。つまり、これら 3 つのリソースに関連付けられたインスタンスグループ内のすべてのインスタンスが容量不足の場合、容量が利用可能になるまでジョブが保留状態になります。
ジョブ送信先のインスタンスグループを決定する際の優先順位は、以下のとおりです。
- ジョブテンプレート
- Inventory
- 組織 (プロジェクトの形式)
インスタンスグループをジョブテンプレートに関連付け、すべてのインスタンスグループが容量に達している場合、ジョブはインベントリーで指定したインスタンスグループに送信され、次に組織で指定したインスタンスグループに送信されます。リソースが利用可能な場合、優先順位の高いグループから順にジョブを実行する必要があります。
Playbook で定義されているカスタムインスタンスグループなど、リソースにグローバル デフォルト グループを関連付けることも可能です。これを使用して、ジョブテンプレートまたはインベントリーで優先インスタンスグループを指定できます。一方で、容量が不足している場合には任意のインスタンスにジョブを送信できます。
例
-
ジョブテンプレートに
group_a を関連付け、さらにそのインベントリーにデフォルトグループを関連付けると、group_a の容量が不足した場合の代替手段としてデフォルトグループを使用できるようになります。 - さらに、インスタンスグループを 1 つのリソースに関連付けずに、別のリソースをフォールバックとして指定することもできます。たとえば、インスタンスグループをジョブテンプレートに関連付けず、インベントリーまたは組織のインスタンスグループにフォールバックさせます。
ここでは、次の 2 つの例を示します。
- インスタンスグループをインベントリーに関連付けた場合 (インスタンスグループへのジョブテンプレートの割り当てを省略)、特定のインベントリーに対して Playbook を実行すると、そのインベントリーに関連付けられたグループでのみ実行されます。これは、それらのインスタンスのみが管理対象ノードへの直接リンクを有する状況で役立ちます。
管理者はインスタンスグループを組織に割り当てることができます。これにより、管理者はインフラストラクチャー全体をセグメント化し、他の組織のジョブ実行能力を妨げることなくジョブを実行できる容量を、各組織が確保できるようになります。
管理者は、次のシナリオのように、各組織に複数のグループを割り当てることができます。
- インスタンスグループは A、B、C の 3 つです。組織は 2 つあります 。Org1 と Org2 です。
- 管理者は、グループ A を Org1 に、グループ B を Org2 に割り当て、さらにグループ C を Org1 と Org2 の両方に割り当てて、必要に応じて追加容量を確保できるようにします。
- 組織管理者は、必要なグループにインベントリーまたはジョブテンプレートを自由に割り当てたり、組織からデフォルトの順序を継承させたりすることができます。
このようにリソースを配置すると、柔軟性が得られます。また、インスタンスを 1 つだけ含むインスタンスグループを作成して、Automation Controller クラスター内の特定のホストに作業を割り振ることもできます。
8.1.8. インスタンスグループの容量制限 リンクのコピーリンクがクリップボードにコピーされました!
外部ビジネスロジックにより、インスタンスグループに送信したジョブの同時実行性や、消費するフォークの最大数を制限する必要性が高まる場合があります。
従来のインスタンスおよびインスタンスグループの場合、2 つの組織が同じ基盤インスタンス上でジョブを実行できるようにしながら、各組織の同時実行ジョブの総数を制限することが推奨されます。これは、組織ごとにインスタンスグループを作成し、max_concurrent_jobs の値を割り当てることで実現できます。
Automation Controller グループの場合、Automation Controller は通常、OpenShift クラスターのリソース制限を認識しません。namespace の Pod 数に制限を設定することができます。自動スケーリングが設定されていない場合には、一度に特定の数の Pod をスケジュールするのに使用できるリソースのみに設定したりできます。この場合は、max_concurrent_jobs の値を調整できます。
利用可能な別のパラメーターは max_forks です。このパラメーターにより、インスタンスグループまたはコンテナーグループで消費される容量の上限をさらに柔軟に設定できます。このパラメーターは、さまざまなインベントリーサイズと "forks" 値を持つジョブが実行されている場合に使用できます。これにより、組織が同時に実行できるジョブの数を最大 10 個に制限し、一度に消費するフォークの数を最大 50 個に制限できます。
max_concurrent_jobs: 10
max_forks: 50
それぞれ 5 つのフォークを使用する 10 個のジョブを実行している場合、これらのジョブの 1 つがそのグループでの実行を終了する (または、容量のある別のグループでスケジュールされる) まで、11 番目のジョブは待機します。
2 つのジョブがそれぞれ 20 個のフォークで実行されている場合、task_impact が 11 以上の 3 番目のジョブは、これらのジョブのいずれかが終了するまで待機し、そのグループで実行されるか (または、容量のある別のグループにスケジュールされる) ことになります。
コンテナーグループの場合、すべてのジョブはジョブの forks 値に関係なく、同じリソース要求を持つ同じ pod_spec を使用して送信されるため、max_forks 値を使用することが有用です。デフォルトの pod_spec は 制限ではなく要求を設定するため、Pod はスロットリングや削除を受けることなく、要求された値を超えてバーストすることができます。max_forks の値 を設定することで、フォーク数が大きいジョブが多数同時にスケジュールされ、要求された値よりも多くのリソースを使用する複数の Pod によって OpenShift ノードが過剰にリソースを消費してしまうという状況を防ぐことができます。
インスタンスグループ内の同時実行ジョブとフォークの最大値を設定するには、Automation Controller ユーザーガイド の インスタンスグループの作成を 参照してください。
8.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 ユーザーガイド の インスタンスグループの管理を 参照してください。
古いバージョンの Automation Controller (3.8.x 以前) で作成された分離インスタンスグループがあり、それらを実行ノードに移行して自動化メッシュアーキテクチャーで使用できるようにする場合は、Ansible Automation Platform アップグレードおよび移行ガイド の 分離インスタンスを実行ノードに移行する を参照してください。