ansible 映射一个属性

ansible mapping an attribute back

我可以在搜索字典列表时获取值,但无法使用 selectattr 并将值映射回来。 我离开的任何线索

- hosts: all
  gather_facts: no
  vars:
    lacp_groups:
      - master: lacp0
        network: 10.65.100.0/24
        gateway: 10.65.100.1
        dns4:
          - 10.65.100.10
          - 10.65.100.11
        interfaces:
          - em1
          - em2
      - master: lacp1
        network: 10.65.120.0/24
        gateway: 10.65.120.1
        dns4:
          - 10.65.100.10
          - 10.65.100.11
        interfaces:
            - em3
            - em4

  tasks:
    - debug:
        var: lacp_groups[0]
    - debug:
        msg: "{{ item.master }}"
      loop: "{{ lacp_groups}}"
      loop_control: 
        label: "{{item.master}}"
      when: "'em1' in item.interfaces"
    - set_fact:
        #myvar: "dns"
        myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}"
    - debug:
        var: myvar

OutPut back 正在说以下内容

TASK [debug] ****************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:28
ok: [localhost] => (item=lacp0) => {
    "msg": "lacp0"
}
skipping: [localhost] => (item=lacp1)  => {
    "skip_reason": "Conditional result was False"
}

TASK [set_fact] *************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:34
fatal: [localhost]: FAILED! => {
    ***"msg": "Unexpected templating type error occurred*** on ({{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}): expected string or buffer"
}
        

PLAY RECAP ******************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1

我知道我可以通过这样做来检索对象

- set_fact:
        myvar2: "{{ item.master }}"
      loop: "{{ lacp_groups}}"
      loop_control: 
        label: "{{item.master}}"
      when: "'em3' in item.interfaces"
    - debug:
        var: myvar2

但我想找出在 ansible 中执行此操作的 selectattr 和 map 方法

猜测:您使用的是 ansible < 2.10。在这种情况下,您必须将 map 函数的结果转换为 list:

myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | list | join() }}"

ansible >= 2.10 不需要这个