在ansible剧本中合并两个复杂的词典

在ansible剧本中合并两个复杂的词典,ansible,jinja2,Ansible,Jinja2,我找不到合并两个变量的方法。 因为我的剧本中有好几个部分都用到了它们,所以它们必须留在这个结构中 当主机属于特定组时,我要做的是设置特殊的ssh公钥 主持人: ... [special-bla] blahost1 blahost2 ... 变量: 及 在我的ansible playbook中,我根据主机是否在特定组中创建了一个特殊的\u本地\u用户列表: - name: Create special_local_users list set_fact: special_

我找不到合并两个变量的方法。 因为我的剧本中有好几个部分都用到了它们,所以它们必须留在这个结构中

当主机属于特定组时,我要做的是设置特殊的ssh公钥

主持人:

...
[special-bla]
blahost1
blahost2
...
变量:

在我的ansible playbook中,我根据主机是否在特定组中创建了一个特殊的\u本地\u用户列表:

  - 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 %}
现在我想合并两个列表的设置。这将导致

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的了解非常有限,所以我没有找到方法

有什么想法吗? 提前谢谢! 拉尔斯

很抱歉问你。。。 我自己找到了一个解决办法:

  - 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 %}
它看起来不是很酷,但它很管用

它组合除添加的键之外的所有值

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"',
        }
  - 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 %}