Как я могу фильтровать флаги существования ansible stat?

Я выполняю простую задачу статистики (Ansible 2.3.1.0) в именованном канале, созданном wpa_supplicant:

- 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.

Что мне не хватает?


person Rich Henry    schedule 19.06.2017    source источник


Ответы (1)


Я думаю, вы хотите использовать выражение канала:

results[*].stat | [?exists].path

Из моего понимания JMESPath в stat[?filter] фильтр применяется внутри stat (для выбора элементов, которые находятся ниже по пути), но вы хотите применить фильтр для выбора/отклонения stat братьев и сестер, поэтому вам следует остановить дальнейшие проекции с элементами канала и фильтра.

person Konstantin Suvorov    schedule 20.06.2017