键不存在时映射的问题

Problem with map when the key does not exist

我有一个 var_file 这种格式:

bds_info:

  - id:   BD1
    db_name: BD1
    db_port: XXXX
    server: server1
    repo_url: repo1

  - id:   BD2
    db_name: BD2
    db_port: XXXX
    server: server2
    repo_url: repo2
    scan_name: scan2

我想做的是 select scan_name 从 var_file 变成这样的变量:

var_scan_name_to_use:       "{{ (bds_info   | selectattr('id', 'equalto', (db_name|upper) ) | map(attribute='scan_name') | join) }}"

如果 id selected 有密钥,它可以正常工作,但如果没有,我会收到以下错误:

{
    "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'scan_name
}

是否可以 return undefined 而不是查找错误?

You can specify a default value to use if an object in the list does not have the given attribute.

{{ users|map(attribute="username", default="Anonymous")|join(", ") }}

来源:https://jinja.palletsprojects.com/en/2.11.x/templates/#map


鉴于剧本:

- hosts: all
  gather_facts: no

  tasks:
    - debug:
        msg: >-
          {{ 
            bds_info 
              | selectattr('id', 'equalto', db_name | upper)
              | map(attribute='scan_name', default='undefined') 
              | join
          }}
        db_name: BD1
        bds_info:
          - id: BD1
            db_name: BD1
            db_port: XXXX
            server: server1
            repo_url: repo1
          - id: BD2
            db_name: BD2
            db_port: XXXX
            server: server2
            repo_url: repo2
            scan_name: scan2

这产生:

PLAY [all] *******************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [localhost] => {
    "msg": "undefined"
}

PLAY RECAP *******************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0