[英]How to sort complex version numbers in Ansible
我正在構建一個 Ansible 劇本,我想在其中檢索最新版本的軟件。 為此,我在 Ansible 中使用了“排序”過濾器。 然而,當使用更復雜且不是真正數字的版本號時,這變得有點困難,例如
0.2.1<\/code> 、
0.10.1<\/code> 。
這就是我現在正在做的事情:
- 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 }}"
一種選擇是編寫一個過濾器插件。
> cat filter_plugins/sort_versions.py
from distutils.version import LooseVersion
def filter_sort_versions(value):
return sorted(value, key=LooseVersion)
class FilterModule(object):
filter_sort = {
'sort_versions': filter_sort_versions,
}
def filters(self):
return self.filter_sort
那么下面的簡單玩法
- debug:
msg: "{{ versions | sort_versions }}"
給出:
"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"
]
您可以使用 Jinja2 比較版本而不是安裝過濾器插件
- name: test
set_fact:
max_number: "{{ item }}"
when: max_number |default('0') is version(item, '<')
loop: "{{ master_version }}"
您正在尋找的部分內容是version
測試,但是,它建立在用戶只想要一個比較的想法之上。 所以,你需要做一些膠水來找到“最新”的:
- set_fact:
max_version: >-
{%- set vmax = {} -%}
{%- for v_1 in versions -%}
{%- for v_2 in versions -%}
{%- if v_1 is version(v_2, ">") and v_1 is version(vmax.get("max", "0.0.0"), ">") -%}
{%- set _ = vmax.update({"max": v_1}) -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{{ vmax.max }}
(我不會假裝這是最佳解決方案,因為它很可能會多次比較版本,但它應該適用於小版本列表)
我有一個類似的用例,我有一個版本,需要從版本列表中獲取以前的版本。
---
- name: previous_version_filter
hosts: localhost
gather_facts: false
vars:
versions:
- "21.7.1"
- "21.13.0"
- "21.7.2"
- "21.13.1"
- "21.8.0"
- "21.7.0"
version: "21.13.0"
newer_versions: []
tasks:
- name: Create newer_versions list
set_fact:
newer_versions: "{{ newer_versions + [item] }}"
when: item is version(version, '>')
loop: "{{ versions }}"
- name: Create previous_versions list
set_fact:
previous_versions: "{{ versions | difference(newer_versions) | difference([ version ]) }}"
- name: Obtain previous_version
set_fact:
previous_version: "{{ item }}"
when: previous_version | default('0') is version(item, '<')
loop: "{{ previous_versions }}"
- debug:
msg: "{{ previous_version }}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.