我正在编写一个Ansible playbook,其中我想在需要升级软件时备份数据库。为此,我希望比较可用的最高版本号和已安装版本号。如果最新版本高于已安装版本,则备份数据库。
然而问题在于,我无法找到一种好的方法在Ansible中对版本号进行排序。标准的sort过滤器按字符串而非数字/版本进行排序。
这是我目前正在做的事情:
上述playbook的工作是可靠的,只要版本号不超过10(例如1.2.3,但不是1.10.1),因为它是按照字符串排序的。当版本号需要排序例如1.2.3和1.10.1时,它将把1.2.3作为最新版本。
为了展示此问题:
然而问题在于,我无法找到一种好的方法在Ansible中对版本号进行排序。标准的sort过滤器按字符串而非数字/版本进行排序。
这是我目前正在做的事情:
- name: Get package version
yum:
list: package
register: software_version
- name: Read which version is installed and available
set_fact:
software_version_installed: "{{ software_version | json_query(\"results[?yumstate=='installed'].version\") | sort | last }}"
software_version_available: "{{ software_version | json_query(\"results[?yumstate=='available'].version\") | sort | last }}"
- name: Backup old database file on remote host
copy:
src: "{{ software.database_path }}"
dest: "{{ software.database_path }}_{{ ansible_date_time.date }}_v{{ software_version_installed }}"
remote_src: yes
when: software_version_installed is version(software_version_available, "<")
上述playbook的工作是可靠的,只要版本号不超过10(例如1.2.3,但不是1.10.1),因为它是按照字符串排序的。当版本号需要排序例如1.2.3和1.10.1时,它将把1.2.3作为最新版本。
为了展示此问题:
- name: Read which version is installed and available
set_fact:
software_versions: [ "2.5.0", "2.9.0", "2.10.0", "2.11.0" ]
- name: Debug
debug:
var: software_versions | sort
TASK [grafana : Debug]**********************************
ok: [localhost] => {
"software_versions | sort": [
"2.10.0",
"2.11.0",
"2.5.0",
"2.9.0"
]
}
有没有人知道在Ansible中排序版本号的好方法?