Search code examples
ansiblejinja2

Sort a list of strings that contain numbers in ansible


Is there a way to properly sort this list of virtual machine names? Azure and Ansible reports them as follows:

dev-xxx-myvm-1
dev-xxx-myvm-10
dev-xxx-myvm-2
dev-xxx-myvm-3
dev-xxx-myvm-4
dev-xxx-myvm-5
dev-xxx-myvm-6
dev-xxx-myvm-7
dev-xxx-myvm-8
dev-xxx-myvm-9

RESULT:

dev-xxx-myvm-1
dev-xxx-myvm-2
dev-xxx-myvm-3
dev-xxx-myvm-4
dev-xxx-myvm-5
dev-xxx-myvm-6
dev-xxx-myvm-7
dev-xxx-myvm-8
dev-xxx-myvm-9
dev-xxx-myvm-10
[...]

Solution

  • the easiest solution is to use community.general.version_sort.

    - name: "Getting deployment state"
      block:
      - name: "Getting deployment state"
        azure.azcollection.azure_rm_virtualmachine_info:
          resource_group: myRG
        register: existing_vms
      - name: Saving all VM names in vm_names
        ansible.builtin.set_fact:
          vm_names: "{{ vm_names | default([]) + [item.name] }}"
        loop: "{{ existing_vms.vms }}"
      - name: Sorting the VM names in vm_names_sorted
        ansible.builtin.set_fact:
          vm_names_sorted: "{{ vm_names | community.general.version_sort }}"