2017-06-20 11 views
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: 

答えて

4

各グループのホストの数が等しい場合は、pattern + serialを使用できます。
パターンを使用してグループを順番に移動することにより、ホストのリストが形成されます。したがって、ホストの数が等しい場合は、シリアルによって形成されたバッチはグループに等しくなります。あなたの例では

あなたは、各グループに正確に3ホストを持っている場合、あなたは使用することができます。

- hosts: instance_id_* 
    serial: 3 
    tasks: 
    - ping: 

あなたはAnsibleのパッチのビットを気にしない場合、あなたは_get_serialized_batches方法を変更することができます。

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 

をそして、あなたはこのような任意の変数によってホストをシリアル化することができます:
ちょうどwhile len(all_hosts) > 0:前にこのコードを追加します

- hosts: tag_type_edgenode 
    vars: 
    serialize_by_var: instance_id 
    tasks: 
    - ping 
+0

最初のオプションはうまくいきます。実行するためにグループごとにホストを注文します。 –

0

ビルコンスタンチンのアイデアのオフ、あなたは、この使用してエイリアスやのような何かを行うことができますパターンリスト:

--- 
- 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 
関連する問題