Group_byモジュールで動的に作成する複数のホストグループでいくつかのロールを含むプレイブックを実行したい。
以下の例のようにそれを行うことができます(実際の役割を置き換えるping)。
すべてのインスタンスIDをリストするのではなく、ループで各グループを個別に実行する方法があるかどうか疑問に思っていました。すべてのインスタンスIDで重複する行を作成する必要はありません。
ここでの目的は、すべてのデータセンターの1つのインスタンスに一度に展開することであり、すべてを低シリアルで長時間実行するのではなく実行することです。
別の方法がありますが、各instance_idのインベントリに静的グループを作成したくありません。
---
- hosts: tag_type_edgenode
tasks:
- group_by: key=instance_id_{{instance_id}}
register: dyn_groups
- hosts: instance_id_1
tasks:
- ping:
- hosts: instance_id_2
tasks:
- ping:
- hosts: instance_id_3
tasks:
- ping:
- hosts: instance_id_4
tasks:
- ping:
各グループのホストの数が等しい場合、パターン+シリアルを使用できます。
グループを順番に移動するパターンによる、Ansible formsホストリスト。したがって、ホストの数が等しい場合、シリアルによって形成されるバッチはグループと等しくなります。
例では、各グループに正確に3つのホストがある場合、次を使用できます。
_- hosts: instance_id_*
serial: 3
tasks:
- ping:
_
Ansibleのパッチを少し気にしない場合は、 _ get_serialized_batches メソッドを変更できます。
このコードをwhile len(all_hosts) > 0:
の直前に追加します。
_ if 'serialize_by_var' in play.get_vars():
param = play.get_vars()['serialize_by_var']
sb = []
def by_param(x):
vrs = x.get_vars()
if param in vrs:
return vrs[param]
else:
return None
s_hosts = sorted(all_hosts,key=by_param)
for k, g in itertools.groupby(s_hosts, by_param):
sb.append(list(g))
display.vv('Serializing by Host var "{}": {}'.format(param,sb))
return sb
_
そして、次のような変数でホストをシリアル化できます。
_- hosts: tag_type_edgenode
vars:
serialize_by_var: instance_id
tasks:
- ping
_
Konstantinのアイデアに基づいて、エイリアスとパターンのリストを使用して次のようなことができます。
---
- hosts: "*-server-batch-1,*-servers-batch-2,*-server-batch-3"
serial: 3
...
...
[london]
london-server-batch-1 ansible_Host=server1.london.com
london-server-batch-2 ansible_Host=server2.london.com
london-server-batch-3 ansible_Host=server3.london.com
[tokyo]
tokyo-server-batch-1 ansible_Host=server1.tokyo.com
tokyo-server-batch-2 ansible_Host=server2.tokyo.com
tokyo-server-batch-3 ansible_Host=server3.tokyo.com