web-dev-qa-db-ja.com

複数のホストグループで1つずつプレイブックを実行する

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:
6
Shay Rybak

各グループのホストの数が等しい場合、パターン+シリアルを使用できます。
グループを順番に移動するパターンによる、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
_
8

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
0
Paul Calabro