我正在wpa_supplicant创建的命名管道上执行一个简单的stat任务(Ansible 2.3.1.0):
- stat:
path: "/var/run/wpa_supplicant/{{ item }}"
with_items:
- wifi
register: wpa_stats
sudo: true
变量在执行后包含以下数据:
ok: [10.10.23.187] => {
"wpa_stats": {
"changed": false,
"msg": "All items completed",
"results": [
{
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": false,
"invocation": {
"module_args": {
"checksum_algorithm": "sha1",
"follow": false,
"get_attributes": true,
"get_checksum": true,
"get_md5": true,
"get_mime": true,
"path": "/var/run/wpa_supplicant/wifi"
}
},
"item": "wifi",
"stat": {
"atime": 1497900522.6306846,
"attr_flags": "",
"attributes": [],
"block_size": 4096,
"blocks": 0,
"charset": "binary",
"ctime": 1497900290.0605242,
"dev": 18,
"device_type": 0,
"executable": true,
"exists": true,
"gid": 0,
"gr_name": "root",
"inode": 796,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": false,
"issock": true,
"isuid": false,
"mimetype": "inode/socket",
"mode": "0770",
"mtime": 1497900290.0605242,
"nlink": 1,
"path": "/var/run/wpa_supplicant/wifi",
"pw_name": "root",
"readable": true,
"rgrp": true,
"roth": false,
"rusr": true,
"size": 0,
"uid": 0,
"version": null,
"wgrp": true,
"woth": false,
"writeable": true,
"wusr": true,
"xgrp": true,
"xoth": false,
"xusr": true
}
}
]
}
}
但是这个过滤器返回一个空结果:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat[?exists].path') | list }}"
如果我删除[?exists]
过滤器,则可以正常工作:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat.path') | list }}"
我也尝试过使用==
。已安装Jmespath,我正在使用JSON过滤器成功查询其他值。
我错过了什么?
答案 0 :(得分:2)
我想你想使用管道表达式:
results[*].stat | [?exists].path
我在stat[?filter]
过滤器中的JMESPath的低估应用在stat
内部(用于选择路径下方的元素),但是您想要应用过滤器来选择/拒绝stat
兄弟姐妹,所以你应该停止使用管道和滤芯进一步投影。