当键不存在时地图出现问题

Cyr*_*ANO 5 jinja2 ansible

我有一个具有以下格式的 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
Run Code Online (Sandbox Code Playgroud)

我想做的是将 var_file 中的 scan_name 选择为如下变量:

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

如果所选的 id 有密钥,则它可以正常工作,但如果没有,则会出现以下错误:

{
    "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'scan_name
}
Run Code Online (Sandbox Code Playgroud)

是否可以返回未定义而不是查找错误?

β.ε*_*.βε 4

default如果列表中的对象不具有给定属性,您可以指定要使用的值。

{{ users|map(attribute="username", default="Anonymous")|join(", ") }}
Run Code Online (Sandbox Code Playgroud)

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


因此,鉴于任务:

{{ users|map(attribute="username", default="Anonymous")|join(", ") }}
Run Code Online (Sandbox Code Playgroud)

这产生:

- debug:
    msg: >-
      {{
        bds_info
          | selectattr('id', 'equalto', db_name | upper)
          | map(attribute='scan_name', default='undefined')
          | join
      }}
  vars:
    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

Run Code Online (Sandbox Code Playgroud)