Ansible-如何在条件中进行整数比较



我试图在条件中进行一个简单的整数比较,但出现了一些问题,并且没有正确计算。

剧本中的代码:

- name: Check the version of the current sql database on both dispatchers and save that value.
command: /usr/bin/mysql -V
changed_when: false
register: sqlversion
- name: Print to the screen the current sql database version.
debug:
var: "{{ sqlversion.stdout.split()[4] | regex_search('[0-9]+\.[0-9]+') | replace(".",'') }}"
register: w
- name: Show the value of the variable.
debug:
var: w
- name: Test result
command: w
when: ( w | int < 55 )

命令模块的输出(最终得到5.5.43号的5.5部分:

mysql  Ver 14.14 Distrib 5.5.43, for Linux (x86_64) using readline 5.2

我的实际运行,其中测试结果任务";失败";因为评估问题:

TASK [Check the version of the current sql database on both dispatchers and save that value.] ***********
ok: [server2]
ok: [server1]
TASK [Print to the screen the current sql database version.] ********************************************
ok: [server1] => {
"55": "55"
}
ok: [server2] => {
"55": "55"
}
TASK [Show the value of the variable.] ******************************************************************
ok: [server1] => {
"w": {
"55": "55",
"changed": false,
"failed": false
}
}
ok: [server2] => {
"w": {
"55": "55",
"changed": false,
"failed": false
}
}
TASK [Test result] **************************************************************************************
changed: [server1]
changed: [server2]

这是不对的,也不是意料之中的,显然最后一项任务显示了";"已更改";因为它运行了,并在不应该的时候将条件求值为true。相反,我对条件的编码方式应该跳过它!此外,如果我去掉"|int";那么无论数字是多少,它总是跳过。

这里有什么问题?一定有办法让它发挥作用。

简化解析

w: "{{ sqlversion.stdout|split(',')|first|split()|last }}"

给出

w: 5.5.43

使用版本的测试。请参见比较版本。例如,

- debug:
msg: Version is lower than 5.6
when: w is version('5.6', '<')

测试的完整剧本示例

- hosts: localhost
vars:
sqlversion:
stdout: "mysql  Ver 14.14 Distrib 5.5.43, for Linux (x86_64) using readline 5.2"
w: "{{ sqlversion.stdout|split(',')|first|split()|last }}"
tasks:
- debug:
var: w
- debug:
msg: Version is lower than 5.6
when: w is version('5.6', '<')

如果过滤器分割不可用,请使用两次方法

w: "{{ (sqlversion.stdout.split(',')|first).split()|last }}"

。。。但我也被迫在这一系列机器上使用Ansible 2.9…

如Vladimir Botka 所述

如果过滤器拆分不可用,请使用该方法两次。我加了一个例子。过滤器拆分自2.11起可用

用于操作字符串的split过滤器从Ansible v2.11开始可用,但您可以只使用Python方法.split()

作为Ansible v2.9或2.10中的一个工作循环,还可以实现一个自定义过滤器插件,以及一个简单的Ansible Jinja2过滤器,将字符串拆分为列表。通过这样做,像| split()这样的过滤器可以在旧版本中使用。

最新更新