ansible, идентифицирующий значения в списке

#list #ansible

#Список #ansible

Вопрос:

Приведенный ниже код пытается найти все ключи, связанные со значением HWIC-8A. Я попробовал несколько разных вариантов, и я не могу получить ключ для печати, не делая чего-то действительно длинного. Поскольку я буду повторять этот код с разными значениями, я не хочу искать каждую пару ключ / значение по отдельности в этом списке.

 MODULES:
  Slot_0_SubSlot_0: HWIC-8A
  Slot_0_SubSlot_1: EHWIC-VA-DSL-M
  Slot_0_SubSlot_3: HWIC-8A
    
- name: Apply HWIC-8A Build
  debug:
    msg: "{{ item.key }}"
  with_items: "{{ MODULES }}"
  when: "{{ item.value }} == HWIC-8A"
  

Ответ №1:

Может быть, это что-то для вас:

 --- 
- hosts: localhost
  vars:
    MODULES:
      Slot_0_SubSlot_0: HWIC-8A
      Slot_0_SubSlot_1: EHWIC-VA-DSL-M
      Slot_0_SubSlot_3: HWIC-8A
  tasks:
  - debug: var=MODULES
  - debug: msg="{{ MODULES | dict2items }}"
  - debug: msg="{{ MODULES | dict2items | selectattr('value','match','HWIC-8A') | map(attribute='key')| list }}"
  

Затем, если вы хотите иметь несколько совпадений, вы могли бы решить это с помощью MATCH списка:

 --- 
- hosts: localhost
  vars:
    MODULES:
      Slot_0_SubSlot_0: HWIC-8A
      Slot_0_SubSlot_1: EHWIC-VA-DSL-M
      Slot_0_SubSlot_3: HWIC-8A
      Slot_1_SubSlot_3: HWIC-8C
      Slot_1_SubSlot_2: HWIC-8C
    MATCH:
    - HWIC-8A
    - HWIC-8C
  tasks:
  - debug: 
      msg: "{{ MODULES | dict2items | selectattr('value','match',item) | map(attribute='key')| list }}"
    with_items: "{{ MATCH }}"
  

Вывод:

 TASK [debug] ***********************************************************************************************************************************************************************************
Thursday 27 August 2020  15:08:10  0200 (0:00:00.042)       0:00:02.037 ******* 
ok: [localhost] => (item=HWIC-8A) => {
    "msg": [
        "Slot_0_SubSlot_0",
        "Slot_0_SubSlot_3"
    ]
}
ok: [localhost] => (item=HWIC-8C) => {
    "msg": [
        "Slot_1_SubSlot_3",
        "Slot_1_SubSlot_2"
    ]
}
  

Ответ №2:

Для этого я бы использовал шаблоны use jinja. Что-то вроде этого:

   - name: Apply HWIC-8A Build
    debug:
      msg: '{% for m in MODULES %}{% if MODULES[m] == "HWIC-8A" %}{{ m }} {% endif %}{% endfor %}'
  

Что даст вам это:

 ok: [localhost] => {
    "msg": "Slot_0_SubSlot_0 Slot_0_SubSlot_3 "
}
  

Вероятно, существует также необычный способ использования фильтров.