Sorting a fact in Ansible

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

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.

https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.dictsort

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

from a quick glance, it looks like you would change v.value to v.1

OK, that took care of it. Worked great! I appreciate the timely response!

Thanks,
Harry