【问题标题】:Ansible - How to extract specific keys from a List of Dictionary by iterating through another List [edit]Ansible - 如何通过遍历另一个列表从字典列表中提取特定键[编辑]
【发布时间】:2023-01-26 05:11:35
【问题描述】:

我有一个服务器名称列表和一个环境中所有集群的字典列表。字典列表包含该集群中的相关服务器。例如

"full_cluster_dict": [
{
    "key": "cluster_a", 
    "value": [
        "ca_server1",
        "ca_server2",
        "ca_server3",
        "ca_server4",
        "ca_server5",
        "ca_server6",
        "ca_server7",
        "ca_server8"
    ]
},
{
    "key": "cluster_b", 
    "value": [
        "cb_server1",
        "cb_server2",
        "cb_server3"
    ]
},
{
    "key": "cluster_c",
    "value": [
        "cc_server1",
        "cc_server2",
        "cc_server3",
        "cc_server4"
    ]
}

"server_list": [
    "ca_server1",
    "cb_server2",
    "ca_server6"
]

我想创建一个较小的字典列表,仅显示包含来自 server_list 的服务器的集群。例如

"needed_cluster_dict": [
  {
     "key: "cluster_a",
     "value": [
        "ca_server1",
        "ca_server2",
        "ca_server3",
        "ca_server4",
        "ca_server5",
        "ca_server6",
        "ca_server7",
        "ca_server8"
    ]
 },
 {
     "key": "cluster_b",
     "value" : [
        "cb_server1",
        "cb_server2",
        "cb_server3"
    ]
 }
]

我尝试了以下

- name: extract only relevant clusters based on the list of servers
  ansible.builtin.set_fact:
    needed_cluster_dict: "{{ needed_cluster_dict|d({}) | combine({item: cluster_filter}) }}"
  with_items: "{{ server_list }}"
  vars:
    cluster_filter: "{{ sds_dict|dict2items|json_query(_query) }}"
    _query: '[?value.contains(@, `{{ item }}`)].value'`

但这只返回一个字典,其中上面的服务器名称是键,每个键包含一个服务器列表,例如

needed_cluster_list: {
  "ca_server1: [
    "ca_server1",
    "ca_server2",
    "ca_server3",
    "ca_server4"
  ],
  "ca_server2: [
    "ca_server1",
    "ca_server2",
    "ca_server3",
    "ca_server4"
  ],
  ...
  ...
}

对我最初问题的编辑表示歉意,但在询问之后,我发现循环字典列表比循环字典更容易。

【问题讨论】:

    标签: ansible ansible-facts ansible-filter


    【解决方案1】:

    创建所需集群的列表。测试列表的交集

      needed_cluster_str: |
        [{% for k,v in full_cluster_dict.items() %}
        {% if v|intersect(server_list)|length > 0 %}
        {{ k }},
        {% endif %}
        {% endfor %}]
      needed_cluster: "{{ needed_cluster_str|from_yaml }}"
    

      needed_cluster:
      - cluster_a
      - cluster_b
    

    提取所需的列表

      needed_cluster_lists: "{{ needed_cluster|map('extract', full_cluster_dict)|list }}"
    

      needed_cluster_lists:
      - - ca_server1
        - ca_server2
        - ca_server3
        - ca_server4
        - ca_server5
        - ca_server6
        - ca_server7
        - ca_server8
      - - cb_server1
        - cb_server2
        - cb_server3
    

    创建字典

      needed_cluster_dict: "{{ dict(needed_cluster|zip(needed_cluster_lists)) }}"
    

      needed_cluster_dict:
        cluster_a:
        - ca_server1
        - ca_server2
        - ca_server3
        - ca_server4
        - ca_server5
        - ca_server6
        - ca_server7
        - ca_server8
        cluster_b:
        - cb_server1
        - cb_server2
        - cb_server3
    

    用于测试的完整剧本示例

    - hosts: localhost
    
      vars:
    
        server_list: [ca_server1, cb_server2, ca_server6]
        full_cluster_dict:
          cluster_a:
            - ca_server1
            - ca_server2
            - ca_server3
            - ca_server4
            - ca_server5
            - ca_server6
            - ca_server7
            - ca_server8
          cluster_b:
            - cb_server1
            - cb_server2
            - cb_server3
          cluster_c:
            - cc_server1
            - cc_server2
            - cc_server3
            - cc_server4
    
        needed_cluster_str: |
          [{% for k,v in full_cluster_dict.items() %}
          {% if v|intersect(server_list)|length > 0 %}
          {{ k }},
          {% endif %}
          {% endfor %}]
        needed_cluster: "{{ needed_cluster_str|from_yaml }}"
        needed_cluster_lists: "{{ needed_cluster|map('extract', full_cluster_dict)|list }}"
        needed_cluster_dict: "{{ dict(needed_cluster|zip(needed_cluster_lists)) }}"
    
      tasks:
    
        - debug:
            var: needed_cluster
        - debug:
            var: needed_cluster_lists
        - debug:
            var: needed_cluster_dict
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多