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