Sorting a fact in Ansible

258 views
Skip to first unread message

lift...@gmail.com

unread,
Oct 19, 2021, 1:29:09 PM10/19/21
to Ansible Project
I am trying to sort a list when setting a fact in Ansible as follows:

  - name: Get installed packages
    become: true
    become_method: sudo
    package_facts:
    register: installed

  - name: Set package facts
    set_fact:
      packages: "{{ ansible_facts.packages|dict2items|sort }}"

This works when I run it from the command line, but when I do this within Ansible Tower, I get the following error:

Unexpected templating type error occurred on ({{ ansible_facts.packages|dict2items|sort }}): '<' not supported between instances of 'dict' and 'dict'

I know this isn't a Tower list, but would anyone have any idea why this would work in the Ansible CLI but not in Tower?

Thanks,
Harry

Matt Martz

unread,
Oct 19, 2021, 1:32:41 PM10/19/21
to ansible...@googlegroups.com
I'd recommend that you use `dictsort` instead of `dict2items`  It achieves the goal very similarly, but sorts by default, and would avoid the error you are getting.

The biggest difference is instead of having `item.key` and `item.value`, you have `item.0` and `item.1`.


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/132882cc-f901-4ed7-b768-72f052b0645fn%40googlegroups.com.


--
Matt Martz
@sivel
sivel.net

lift...@gmail.com

unread,
Oct 19, 2021, 2:02:19 PM10/19/21
to Ansible Project
So if I set the fact as follows:

  - name: Set package facts
    set_fact:
      packages: "{{ ansible_facts.packages|dictsort }}"

How would I traverse that in my template?:

{% for v in hostvars[i]['packages'] %}
{% for pkg in v.value %}
Package: {{ pkg.name }}  Version: {{ pkg.version}}  Arch: {{ pkg.arch }}  Release: {{ pkg.release }}
{% endfor %}
{% endfor %}

Thanks,
Harry

Matt Martz

unread,
Oct 19, 2021, 2:22:15 PM10/19/21
to ansible...@googlegroups.com
from a quick glance, it looks like you would change `v.value` to `v.1`

lift...@gmail.com

unread,
Oct 19, 2021, 2:25:36 PM10/19/21
to Ansible Project
OK, that took care of it.  Worked great!  I appreciate the timely response!

Thanks,
Harry

Reply all
Reply to author
Forward
0 new messages