将项目的值与替换字典列表中的字典连接起来

Concatenate value of item with replacing the dictionary in the list of dict

我有几个具有相同键和不同值的字典列表。在循环中,如果键相同但值不同,我想将值与定界符 | 连接起来,并用具有连接值的新字典替换当前字典(用右键选择)。

原始字典列表

mylist:
  - name: openssh-server
    macros:
      - macro: SYSTEMD.NAME.SERVICE.MATCHES
        type: text
        value: sshd
  - name: apache2
    macros:
      - macro: SYSTEMD.NAME.SERVICE.MATCHES
        type: text
        value: apache2
      - macro: APACHE.STATUS.PORT
        type: text
        value: 9999

预期的字典连接列表

当字典的键相同但值不同时,mylist 更新为连接值 (apache2|sshd)。

mylist:                                                                                                                                                                                                                                          
  - macro: SYSTEMD.NAME.SERVICE.MATCHES                                                                                                                                                                                                                     
    type: text                                                                                                                                                                                                                                              
    value: apache2|sshd                                                                                                                                                                                                                                     
  - macro: APACHE.STATUS.PORT                                                                                                                                                                                                                               
    type: text                                                                                                                                                                                                                                              
    value: '9999'

问:“遍历 mylist 以检查包是否安装时: ansible_facts.packages 中的 item.name”

问:“此外,type 可以是文本以外的其他值,如果可能,应该从 mylist 中检索。”

问:"用定界符连接值 |"

答:例如

    - set_fact:
        my_list_con: "{{ my_list_con|d([]) + [{'macro': item.0,
                                               'type': 'text',
                                               'value': _value}] }}"
      loop: "{{ mylist|map(attribute='macros')|flatten|groupby('macro') }}"
      vars:
        _value: "{{ item.1|map(attribute='value')|unique|sort|join('|') }}"

给予

  my_list_con:
  - macro: APACHE.STATUS.PORT
    type: text
    value: '9999'
  - macro: SYSTEMD.NAME.SERVICE.MATCHES
    type: text
    value: apache2|sshd

问:"循环 mylist 检查包是否安装了 when: item.name in ansible_facts.packages"

答:使用selectattr。例如,给定用于测试的包列表

  ansible_facts.packages:
  - openssh-server
  - apache

任务

    - set_fact:
        my_list_con: "{{ my_list_con|d([]) + [{'macro': item.0,
                                               'type': 'text',
                                               'value': _value}] }}"
      loop: "{{ mylist|
                selectattr('name', 'in', ansible_facts.packages)|
                map(attribute='macros')|flatten|groupby('macro') }}"
      vars:
        _value: "{{ item.1|map(attribute='value')|unique|sort|join('|') }}"

给予

  my_list_con:
  - macro: SYSTEMD.NAME.SERVICE.MATCHES
    type: text
    value: sshd