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

Sorting 如何在Ansible中对版本号进行排序,sorting,ansible,jinja2,Sorting,Ansible,Jinja2,我正在构建一个Ansible playbook,其中我想备份一个数据库,以防我需要升级软件。为此,我想将可用的最高版本号与已安装的版本号进行比较。如果最新版本高于已安装版本,我将备份数据库 然而,问题是我找不到一个好方法来对Ansible中的版本号进行排序。标准排序筛选器根据字符串而不是数字/版本进行排序 这就是我现在正在做的: - name: Get package version yum: list: package register: software_version -

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

然而,问题是我找不到一个好方法来对Ansible中的版本号进行排序。标准排序筛选器根据字符串而不是数字/版本进行排序

这就是我现在正在做的:

- 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, "<")
有人知道在Ansible中排序版本号的好方法吗

问:有人知道在Ansible中排序版本号的好方法吗

答:使用过滤器插件。例如过滤器

shell>cat过滤器插件/version\u sort.py
从distutils.version导入新版本
def版本_排序(l):
返回已排序(l,键=版本)
类FilterModule(对象):
def过滤器(自):
返回{
“版本排序”:版本排序
}
用剧本

shell>cat test-versions.yml
-名称:排序版本
主机:本地主机
变量:
版本:
- "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"
任务:
-调试:
msg:{{versions}版本{u sort}”
给予

“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"
]
为方便起见,Github提供了过滤器


执行迭代列表和比较项目的作业。请参见下面的示例

shell>cat test-versions.yml
-主机:本地主机
变量:
已安装的版本:1.10.1
版本:
- "1.1.3"
- "1.2.3"
- "1.7.5"
- "1.10.7"
任务:
-调试:msg=“{item}}比{{version\u installed}新”
循环:“{{versions}}”
当:项为版本(已安装版本“>”)
shell>ansible playbook test-versions.yml | grep msg
“msg”:“1.10.7比1.10.1更新”
问:有人知道在Ansible中排序版本号的好方法吗

答:使用过滤器插件。例如过滤器

shell>cat过滤器插件/version\u sort.py
从distutils.version导入新版本
def版本_排序(l):
返回已排序(l,键=版本)
类FilterModule(对象):
def过滤器(自):
返回{
“版本排序”:版本排序
}
用剧本

shell>cat test-versions.yml
-名称:排序版本
主机:本地主机
变量:
版本:
- "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"
任务:
-调试:
msg:{{versions}版本{u sort}”
给予

“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"
]
为方便起见,Github提供了过滤器


执行迭代列表和比较项目的作业。请参见下面的示例

shell>cat test-versions.yml
-主机:本地主机
变量:
已安装的版本:1.10.1
版本:
- "1.1.3"
- "1.2.3"
- "1.7.5"
- "1.10.7"
任务:
-调试:msg=“{item}}比{{version\u installed}新”
循环:“{{versions}}”
当:项为版本(已安装版本“>”)
shell>ansible playbook test-versions.yml | grep msg
“msg”:“1.10.7比1.10.1更新”

现在用另一种方法解决了这个问题。我没有对版本进行排序,而是将当前版本与所有可用版本进行了比较

  • 我首先将更新变量设置为false
  • 接下来,我将安装的版本与所有可用的版本进行了比较
  • 如果已安装版本>当前版本,请将更新变量设置为true
执行备份的任务将仅在更新变量为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
-名称:获取软件包版本
百胜:
清单:包裹
注册:软件版本
-名称:读取已安装且可用的版本
设定事实:
软件更新:错误
安装的软件版本:{{software版本}json查询(\“results[?yumstate=='installed'].version\”)}
软件版本可用:{{software版本}json查询(\“results[?yumstate=='available'].version\”)}
-名称:检查是否需要升级
设定事实:
软件更新:正确

当:software_version_installed为version(项目“时,现在以另一种方式解决。我没有对版本进行排序,而是将当前版本与所有可用版本进行比较

  • 我首先将更新变量设置为false
  • 接下来,我将安装的版本与所有可用的版本进行了比较
  • 如果已安装版本>当前版本,请将更新变量设置为true
执行备份的任务将仅在更新变量为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
-名称:获取软件包版本
百胜:
清单:包裹
注册:软件版本
-名称:读取已安装且可用的版本
设定事实:
软件更新:错误
安装的软件版本:{{software版本}json查询(\“results[?yumstate=='installed'].version\”)}
软件版本可用:{{software版本}json查询(\“results[?yumstate=='available'].version\”)}
-名称:检查是否需要升级
设定事实:
软件更新:正确

当:software_version_installed是version(项目),“这不是我要找的东西。版本过滤器工作得很好,但排序不起作用。S