1

在我的 ansible 剧本中,我试图过滤一个 json 结果,但现在它不起作用。

1/ Playbook
下面我的 ansible playbook 来查询和过滤结果:


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/ 过滤前查询结果输出

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": []    
            }    

谢谢

4

1 回答 1

3

首先,单引号和双引号在jmespath 表达式规范中很重要。您的搜索文字字符串需要单引号。

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

以下是一些示例,说明了上述建议并导致相同的结果

---
- 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) }}"

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

于 2019-10-08T14:07:42.933 回答