键不存在时映射的问题
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
我有一个 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