我试图在条件中进行一个简单的整数比较,但出现了一些问题,并且没有正确计算。
剧本中的代码:
- 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()
这样的过滤器可以在旧版本中使用。