我如何过滤 ansible stat 存在标志?
How do i filter on ansible stat existence flags?
我正在 wpa_supplicant:
创建的命名管道上执行一个简单的统计任务 (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
}
}
]
}
}
但是这个过滤器 returns 结果为空:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat[?exists].path') | list }}"
如果我删除 [?exists]
过滤器,它会正常工作:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat.path') | list }}"
我也试过使用 ==
。 Jmespath 已安装,我正在使用 JSON 过滤器成功查询其他值。
我错过了什么?
我猜你想使用管道表达式:
results[*].stat | [?exists].path
根据我对 stat[?filter]
中 JMESPath 的低估,过滤器在 stat
内应用(应用于路径下方的 select 元素),但您想将过滤器应用于 select/reject stat
兄弟姐妹,所以你应该停止使用管道和过滤器元素进行进一步的投影。
我正在 wpa_supplicant:
创建的命名管道上执行一个简单的统计任务 (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
}
}
]
}
}
但是这个过滤器 returns 结果为空:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat[?exists].path') | list }}"
如果我删除 [?exists]
过滤器,它会正常工作:
- debug:
msg: "{{ wpa_stats | json_query('results[*].stat.path') | list }}"
我也试过使用 ==
。 Jmespath 已安装,我正在使用 JSON 过滤器成功查询其他值。
我错过了什么?
我猜你想使用管道表达式:
results[*].stat | [?exists].path
根据我对 stat[?filter]
中 JMESPath 的低估,过滤器在 stat
内应用(应用于路径下方的 select 元素),但您想将过滤器应用于 select/reject stat
兄弟姐妹,所以你应该停止使用管道和过滤器元素进行进一步的投影。