2017-05-10 6 views
1

2つの変数をマージする方法が見つかりません。 彼らは私のプレイブックのいくつかの部分で使用されているので、彼らはこの構造にとどまっていなければなりません。2つの複雑な辞書を不可能なプレイブックに統合する

ホストが特定のグループに属している場合、特別なssh公開鍵を設定します。

ホスト:

... 
[special-bla] 
blahost1 
blahost2 
... 

VARS:私のansible脚本で

user_list: 
    - user:  root 
    uid:  0 
    # ... other A settings ... 
    keys: 
     - { 
      file: files/ssh/pubkeys/admin1.pub, 
      options: 'from="10.28.89.0/24"', 
     } 
     - { 
      file: files/ssh/pubkeys/admin2.pub, 
      options: 'from="10.28.89.0/24"', 
     } 
     - { 
      file: files/ssh/pubkeys/admin3.pub, 
      options: 'from="10.28.10.32,10.28.89.0/24"', 
     } 

special_users: 
    special_bla_users: 
    - user:  root 
     # ... other B settings ... 
     keys: 
     - { 
      file: files/ssh/pubkeys/bla/bla_admin.pub, 
      options: 'from="10.0.0.1"', 
      } 

私はホストが特定のグループ内にある場合に応じて、special_local_usersリストを作成します。

- name: Create special_local_users list 
    set_fact: 
     special_local_user_list: | 
     {% for item in special_host_groups -%} 
     {% set section= item ~ '_users' %} 
     {% if special_users[section] is defined -%} 
     {%  for user in special_users[section] -%} 
     {{ user | to_json }}, 
     {%-  endfor %} 
     {%- endif %} 
     {%- endfor %} 

ここでは、2つのリストの設定をマージします。

user_list: 
    - user:  root 
    uid:  0 
    # ... other A settings ... 
    # ... other B settings ... 
    keys: 
     - { 
      file: files/ssh/pubkeys/admin1.pub, 
      options: 'from="10.28.89.0/24"', 
     } 
     - { 
      file: files/ssh/pubkeys/admin2.pub, 
      options: 'from="10.28.89.0/24"', 
     } 
     - { 
      file: files/ssh/pubkeys/admin3.pub, 
      options: 'from="10.28.10.32,10.28.89.0/24"', 
     } 
     - { 
      file: files/ssh/pubkeys/bla/bla_admin.pub, 
      options: 'from="10.0.0.1"', 
     } 

でJinja2の私の知識をもたらすべきであるこれは非常に限られているので、私は道を見つけることができませんでした。

アイデア? ありがとうございます!尋ねるため

答えて

0

申し訳 ラース... は、私が自分で解決策を見つけた:

- name: Merge user_list with special_local_user_list 
    set_fact: 
     user_list: | 
     {% set user_list_users=user_list | map(attribute='user') | list %} 
     {% set special_local_user_list_users=special_local_user_list | map(attribute='user') | list %} 
     {% set _users=user_list | map(attribute='user') | list %} 
     {% for item1 in special_local_user_list -%} 
     {% if item1['user'] in user_list_users %} 
     {%  for item2 in user_list if item2['user'] == item1['user'] -%} 
     {{ 
       item1.update(keys = item1['keys'] + item2['keys']) 
     }}{{ item2 | combine(item1) }}, 
     {%-  endfor %} 
     {%- else %} 
     {{ item1 }}, 
     {%- endif %} 
     {%- endfor %} 
     {% for item2 in user_list if item2['user'] not in special_local_user_list_users -%} 
     {{ item2 }}, 
     {%- endfor %} 

それは非常にクールに見えないが、それは動作します。

追加されるキー以外のすべての値を組み合わせます。

関連する問題