我正在尝试从以数字1结尾的字典中查询列表。
这是我正在尝试的方法,但是我得到的输出为空列表。
- name: Get list of sid that are open in READ WRITE mode
set_fact:
sid_output: "{{ om.results | selectattr(\"sid\", \"match\", \"1$\") | map(attribute='sid') | list}}"
这是我字典的输出:
{
'msg':u'All items completed',
'changed':True,
'results':[
{
'_ansible_parsed':True,
'stderr_lines':[
],
u'cmd':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
u'end': u'2019-05-15 12:04:30.478084 ', ' _ansible_no_log':False,
u'stdout':u'READ WRITE',
'_ansible_item_result':True,
u'changed':True,
u'sid':u'dw1',
'failed':False,
u'delta': u'0:00:00.073102 ', u' stderr':u'',
u'rc':0,
u'invocation':{
u'module_args':{
u'creates':None,
u'executable':None,
u'_uses_shell':True,
u'_raw_params':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
u'removes':None,
u'argv':None,
u'warn':True,
u'chdir':None,
u'stdin':None
}
},
'stdout_lines':[
u'READ WRITE'
],
u'start': u'2019-05-15 12:04:30.404982 ', ' _ansible_ignore_errors':None,
'_ansible_item_label':u'dw1'
}
]
}
答案 0 :(得分:0)
您的问题是使用match
测试。来自documentation on search vs. match:
“匹配”要求字符串中的完全匹配,而“搜索”仅需要匹配字符串的子集。
换句话说,如果您尝试使用some_match is match('foo.*bar')
进行测试,则意味着字符串必须以foo
开头并以bar
结尾。如果您测试some_mastch is match('bar$')
,那么您正在寻找的是与bar
完全相同的字符串。
由于您正在使用:
selectattr(\"sid\", \"match\", \"1$\")
这意味着它将仅匹配完全等于1
的字符串。您想改用search
。而当您使用它时,请摆脱所有那些用引号引起来的双引号:
- set_fact:
sid_output: "{{ om.results | selectattr('sid', 'search', '1$') | map(attribute='sid') | list}}"
使用您的示例数据,这会将sid_output
设置为dw1
。