ANSIBLE-Json_Query-过滤结果

时间:2019-10-08 12:13:09

标签: ansible json-query

在我的ansible剧本中,我试图过滤json结果,但目前无法正常工作。

1 /剧本
在我的ansible剧本下面,用于查询和过滤结果:


tasks:
    - name: "Query Attributes" 
          ...
          ...
      register: query_result

    - name: Display Result
      debug: 
        var: query_result  

    - name: Display Filtered Result
      debug:
        msg: "{{ query_result.current| json_query('[].context.attributes[?name==`prod`].name') }}" 

也许是我的json_query过滤器内部存在问题?
任何想法 ?


2 /过滤后的Query_result输出

TASK [Display Result] ***************************************************
"query_result": {
                    "ansible_facts": {
                        "discovered_interpreter_python": "/usr/bin/python"
                    }, 
                    "changed": false, 
                    "current": [
                        {
                            "context": {
                                "attributes": {
                                    "name": "prod", 
                                    "uid": "11756"
                                }
                            }
                        }, 
                        {
....
                                }
                            }
                        }, 
                        {
                            "context": {
                                "attributes": {
                                    "name": "dev", 
                                    "uid": "14424"
                                }
                            }
                        }
                    ], 
                    "failed": false
                }
            }

*****************************      

3 /过滤的结果为空
不幸的是,我的结果是空的。

    TASK [Display Filtered Result] **********************************************************    
{    
                "msg": []    
            }    

谢谢

1 个答案:

答案 0 :(得分:0)

首先,单引号和双引号在jmespath expressions specification中很重要。您用于搜索的文字字符串需要用单引号引起来。

第二,您的过滤器将不匹配。您要么必须在流处理中将过滤器移到更高的级别,要么要通过管道传递表达式。

下面是一些说明上述建议并得出相同结果的示例

---
- name: Filter with jmespath
  hosts: localhost
  gather_facts: false

  vars:
    query_result: {
      "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
      },
      "changed": false,
      "current": [
         {
           "context": {
             "attributes": {
               "name": "prod",
               "uid": "11756"
             }
           }
         },
         {
           "context": {
             "attributes": {
               "name": "dev",
               "uid": "14424"
             }
           }
         }
      ],
      "failed": false
    }

  tasks:

    - name: Display original result
      debug: var=query_result

    - name: Display Filtered Result - One expression - one liner
      debug:
        msg: "{{ query_result.current | json_query(\"[?context.attributes.name=='prod'].context.attributes.name[]\") }}"

    - name: Display Filtered Result - One expression - Query in block var
      vars:
        query: >-
          [?context.attributes.name=='prod'].context.attributes.name[]
      debug:
        msg: "{{ query_result.current | json_query(query) }}"

    - name: Display Filtered Result - Pipe expressions - Query in block var
      vars:
        query: >-
          [].context.attributes[] | [?name=='prod'].name[]
      debug:
        msg: "{{ query_result.current | json_query(query) }}"

对于下一个问题,请阅读帮助部分,并考虑直接在您的问题中提供full MVCE(就像我在此答案中所做的那样)。