1
[
"dltpglci553i7mxg3vbkml7ns46p57bbnsn",
"zpxtlv6s37frl4645n3pfcbg3pblrfgmjzvd5n7w",
"wfv4mrzqnq2nq44xbsn35iiqnindixct2kspwfdq",
"p2vgqnvwwnwdxmrjk6lzk6x6wfwinjdc4tbgq",
"ttg3i44dxflbnwlbpqvmm22kvbkgcjmzl4fjrznipgkcr",
"qqc7lficx3bcxrfrkt4dnrrb4m7m2iwd73jpfqjsngc",
"jlpclfrzspps7jt5jt2dtvvbg3mtnllq3sdr4q",
"633gpf6dg7mlstbncbxql6jt46sgwlpvj2fvviq",
"cmgfsw527bs2wwjmqmfw6bv4ctb6m3kr3rk5s4dbq",
"5qrxtckg3r5q67ntzjv5tivjkqmfgxibqvfk",
"tsgqxp2kjrjjl5dfm3dp2k62xcgvfjqvccm4b72rdxn",
"qktssclbi6k3wqd7gisgs5gfdgdqnm64b36dsmj55s",
"3flglzwmlv22sgdn3xd3p6cw2qqisln5bzbncgbg7gbr",
"jrz56p7nsbnkclvqzi4slt7bvbjcqnxic4qs",
"rwktr34qcxf76f7nkxim4tzkvtt5g36vr6k67pinznpfq",
"2wqq4i76rqf4gtwffktdvz52t3sgnkd4ggv6n",
"sivpqtv35q33g5qgp4snjcbpgr27jlwx66il2swgcq",
"mi2q5nzk4gnnpxtvsppbg5c5nirggpj7fqqdiv6wnl",
"wrrjcl6rcndd24wwwtl563izrclzjv2x2sxxn44rq",
"g4s2qfxgcntcxftv76c6xfki44ziqvvslfqwgj",
"kp3svkqkpkfti2tsbm2c5ds6vnlfvgmtx6sjkgv4i",
"i57ck7jpqrgi6vgwpqvnkw42sdjcqb7gqlmilll",
"lj35g346rpz3tw73qz4pkfbdisq5pbbrtlv5t",
"gbcxv3dgdkk255llittdgn2irwwtidbzcr67n3jf"]

I got output from running ansible and as a list of values. Now What I want it to slice this list [:10] or something which gives me first 10 values or last values.

 - name: Debug sort
      
       debug: msg="{{ jsondata.data | sort(attribute='time-created') | map(attribute='id') list  }}"
       vars: 
        query1: '"time-created"'
        query2: 'id'    
        query3: 'data[*].id'

I just want to slice the list from start or end, let's say I want 10 values from start or 20 values from last item of the list. Is there is filter I can add in debug here ?

Also, where I can get more filters/or this jinja2 documentation. I am finding all over different places and not able to find at one.

Harry
  • 91
  • 7
  • There are three main sources of filters: [Ansible](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html), [Jinja](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters), and [Collections](https://docs.ansible.com/ansible/latest/collections/index.html). – Vladimir Botka Aug 22 '22 at 02:19

1 Answers1

1

Create the list

ids: "{{ jsondata.data|sort(attribute='time-created')|
                       map(attribute='id')|
                       list }}"

Then slice the list. For example, the first 10 values and last 20 values

ids_first_10: "{{ ids[:10] }}"
ids_last_20: "{{ ids[20:] }}"

Example of a complete playbook for testing

shell> cat pb.yml
- hosts: localhost

  vars:

    jsondata: "{{ out.stdout|from_yaml }}"
    ids: "{{ jsondata.data|sort(attribute='time-created')|
                           map(attribute='id')|
                           list }}"
    ids_first_10: "{{ ids[:10] }}"
    ids_last_20: "{{ ids[20:] }}"

  tasks:

    - name: Create file data.json
      copy:
        dest: /tmp/data.json
        content: "{{ content|from_yaml|to_json }}"
      vars:
        content: |
          data:
          {% for id in query('sequence', 'count=50') %}
            - time-created: today
              id: {{ id }}
          {% endfor %}
      when: create_data|d(false)|bool

    - command: cat /tmp/data.json
      register: out

    - debug:
        var: ids_first_10|to_yaml

Create the file for the first time

shell> ansible-playbook pb.yml -e create_data=true

Then, test the playbook

shell> ansible-playbook pb.yml

PLAY [localhost] *****************************************************************************

TASK [Create file data.json] *****************************************************************
skipping: [localhost]

TASK [command] *******************************************************************************
changed: [localhost]

TASK [debug] *********************************************************************************
ok: [localhost] => 
  ids_first_10|to_yaml: |-
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Example by @Harry from the comment below will display all but the first 5 values. The suggestions below would improve the code:

  • The variables query* are redundant. Delete them.

  • Putting ids into the task's vars is not very practical. The such variable will be defined in this task only. You'll have to calculate it again if needed. Instead, put it into the play's vars or any other place as convenient.

    - name: Debug sort
      debug:
        msg: "{{ ids[5:] }}"
      vars:
        query1: '"time-created"'
        query2: 'id'
        query3: 'data[*].id'
        ids: "{{ jsondata.data|sort(attribute='time-created')|map(attribute='id')|list }}"
Vladimir Botka
  • 58,131
  • 4
  • 32
  • 63