如何在Ansible中对版本号进行排序 [英] How to sort version numbers in Ansible

查看:92
本文介绍了如何在Ansible中对版本号进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个Ansible剧本,如果要升级软件,我想在其中备份数据库.为此,我想将可用的最高版本号与已安装的版本号进行比较.如果最新版本比已安装的版本高,我将备份数据库.

I'm building an Ansible playbook in which I want to make a backup of a database in case I need to upgrade the software. For this I want to compare the highest version number that is available to the version number that is installed. In case the latest version is hight than the installed version I'll back up the database.

但是,问题是我找不到在Ansible中对版本号进行排序的好方法.标准排序过滤器对字符串(而不是数字/版本)进行排序.

The problem however is that I cannot find a good way to sort version numbers in Ansible. The standard sort filter sorts on strings instead of numbers/versions.

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

This is what I'm doing right now:

- 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, "<")

只要版本号保持在数字10的下方(例如1.2.3,但不是1.10.1),上面的剧本就可以正常工作,因为排序是像字符串一样进行的.当版本号必须排序时1.2.3和1.10.1,它将以1.2.3作为最新版本.

The playbook above works, as long as version numbers stay underneath the number 10 (e.g. 1.2.3, but not 1.10.1) since sorting is performed like a string. When the version number has to sort e.g. 1.2.3 and 1.10.1, it will take 1.2.3 as latest version.

显示问题:

- 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中对版本号进行排序的好方法吗?

Does anyone know a good way to sort version numbers in Ansible?

推荐答案

现在已经以另一种方式解决了.我没有对版本进行排序,而是将当前版本与所有可用版本进行了比较.

It's now solved in another way. Instead of sorting the versions I compared the current version to all available versions.

  • 我首先将更新变量设置为false
  • 接下来,我将安装的版本与每个可用的版本进行比较
  • 如果已安装版本>当前版本,请将更新变量设置为true

仅当update变量为true时,才会执行执行备份的任务.

The task performing the backup will only be performed when the update variable is true.

- name: Get package version
  yum:
    list: package
  register: software_version

- name: Read which version is installed and available
  set_fact:
    software_update: false
    software_version_installed: "{{ software_version | json_query(\"results[?yumstate=='installed'].version\") | last }}"
    software_version_available: "{{ software_version | json_query(\"results[?yumstate=='available'].version\") }}"

- name: Check if upgrade is needed
  set_fact:
    software_update: true
  when: software_version_installed is version(item, "<")
  with_items: "{{ software_version_available }}"

- 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_update

这篇关于如何在Ansible中对版本号进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆