List 在一个列表中标识值的函数

List 在一个列表中标识值的函数,list,ansible,List,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:

下面的代码试图查找与值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"

我会使用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 "
}

可能还有一种使用过滤器的奇特方法。

我会使用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 "
}

可能还有一种使用过滤器的奇特方法。

也许这是适合您的:

--- 
- 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 }}"
然后,如果您希望有多个匹配项,您可以使用
匹配
列表解决:

--- 
- 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"
    ]
}

也许这是适合你的:

--- 
- 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 }}"
然后,如果您希望有多个匹配项,您可以使用
匹配
列表解决:

--- 
- 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"
    ]
}