Search code examples
jsonansibleansible-factsjmespath

How to sort with JMESPath in ansible playbook?


I have an array returned by curl from consul during playing ansible playbook:

[
       { 
        "Node": {
            "Node": "test-eu-west-2-staging-0"
        },  
        "Node": {
            "Node": "test-nyc1-staging-0"
        },
        "Node": {
            "Node": "test-sfo1-staging-0"
        }
       }
]

I want to have it sorted by "Node": {"Node" : "hostname"} in ansible playbook

- name: Set TEST vars, servers info and number
    set_fact:
      TEST_SERVERS="{{ test.json | json_query('SOME SORTING QUERY') }}"
      TEST_SRV_NUM="{{ test.json | length }}"

I have read JMESPath and ansible docs for whole day but still don't know how to implement it (btw it is easy in jq sort_by(.Node.Node) but this trick is not applicable to ansible)


Solution

  • As @techraf noted, your sample JSON is malformed. I can make a guess that you have a list of objects with Node.Node inside, in this case you can use sort Jinja2 filter:

    ---
    - hosts: localhost
      gather_facts: no
      vars:
        myvar: [
           { "Node": { "Node": "test-c" } },
           { "Node": { "Node": "test-b" } },
           { "Node": { "Node": "test-a" } }
          ]
      tasks:
        - debug:
            msg: "{{ myvar | sort(attribute='Node.Node') }}"