如何在 Ansible 中对复杂版本号进行排序

dio*_*dio 6 sorting jinja2 ansible

我正在构建一个 Ansible 剧本,我想在其中检索软件的最新版本。为此,我在 Ansible 中使用了“排序”过滤器。然而,当使用版本号时,这变得有点困难,版本号更复杂并且不是真正的数字,例如0.2.1, 0.10.1

这就是我现在正在做的事情:

- name: Set version to compare
  set_fact:
    versions:
      - "0.1.0"
      - "0.1.5"
      - "0.11.11"
      - "0.9.11"
      - "0.9.3"
      - "0.10.2"
      - "0.6.1"
      - "0.6.0"
      - "0.11.0"
      - "0.6.5"

- name: Sorted list
  debug:
    msg: "{{ versions | sort }}"

- name: Show the latest element
  debug:
    msg: "{{ versions | sort | last }}"
Run Code Online (Sandbox Code Playgroud)

只要版本号保持在数字 10 以下(例如 0.9.3,但不是 0.10.2),上面的剧本就可以工作。

显示问题:

TASK [Set version to compare] ***************************************************************************************************************
ok: [localhost]

TASK [Sorted list] **************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "0.1.0",
        "0.1.5",
        "0.10.2",
        "0.11.0",
        "0.11.11",
        "0.6.0",
        "0.6.1",
        "0.6.5",
        "0.9.11",
        "0.9.3"
    ]
}

TASK [Show the latest element] **************************************************************************************************************
ok: [localhost] => {
    "msg": "0.9.3"
}

Run Code Online (Sandbox Code Playgroud)

在此示例中,期望值是0.11.11

有谁知道在 Ansible 中对复杂版本号进行排序的好方法?任何帮助,将不胜感激。谢谢。

Vla*_*tka 5

一个选择是编写一个过滤器插件。例如,

shell> cat filter_plugins/sort_versions.py
from distutils.version import LooseVersion


def sort_versions(value):
    return sorted(value, key=LooseVersion)


class FilterModule(object):

    def filters(self):
        return {
            'sort_versions': sort_versions,
        }
Run Code Online (Sandbox Code Playgroud)

那么下面的任务

    - debug:
        msg: "{{ versions|sort_versions }}"
Run Code Online (Sandbox Code Playgroud)

给出

  msg:
  - 0.1.0
  - 0.1.5
  - 0.6.0
  - 0.6.1
  - 0.6.5
  - 0.9.3
  - 0.9.11
  - 0.10.2
  - 0.11.0
  - 0.11.11
Run Code Online (Sandbox Code Playgroud)

如果您可以安装集合community.general,则不必编写过滤器。使用过滤器community.general.version_sort。然后,下面的任务给出相同的结果

    - debug:
        msg: "{{ versions|community.general.version_sort }}"
Run Code Online (Sandbox Code Playgroud)

用于测试的完整剧本示例

- hosts: all

  vars:

    versions:
      - '0.1.0'
      - '0.1.5'
      - '0.11.11'
      - '0.9.11'
      - '0.9.3'
      - '0.10.2'
      - '0.6.1'
      - '0.6.0'
      - '0.11.0'
      - '0.6.5'

  tasks:

    - debug:
        msg: "{{ versions|sort_versions }}"

    - debug:
        msg: "{{ versions|community.general.version_sort }}"
Run Code Online (Sandbox Code Playgroud)