我正在对许多服务器运行一个游戏,其中第一个任务执行 SQL 查询以获取数据库的架构版本。例如,当架构版本为 1 时,查询返回
"1"
(字符串)。这是响应的结构...
ok: [server.tld] => {
"db_result": {
"changed": false,
"executed_queries": [
"SELECT `value` FROM `registry` WHERE `setting` = 'schema_version'"
],
"failed": false,
"query_result": [
[
{
"value": "1"
}
]
],
"rowcount": [
1
]
}
}
在下一个任务中,我测试返回的模式版本是否小于当前版本...在这种情况下也是
1
(int),但在将来的升级之后,我们将针对 2
(int) 进行测试,这将导致所有服务器运行仍然返回 1
的补丁。我使用 Jinja 过滤器 | int
转换为整数以进行正确的比较。
- name: Copy schema update SQL file
copy: src=roles/db/files/{{ item.src }} dest=/tmp/{{ item.src }}
when: item.when
loop:
- src: schema_changes_v1.sql
when: "{{ db_result.query_result[0][0]['value'] | int }} < 1"
问题是,即使逻辑比较是
when: 1 < 1
,它应该解析为 false,但它仍然继续循环中的项目,而不是跳到下一个......
changed: [server.tld] => (item={'src': 'schema_changes_v1.sql', 'when': '1 < 1'})
为什么??
Ansible 2.12.2
when
中的条件被评估,因为它已经在大括号内。所以只需删除它们和引号即可:
- name: Copy schema update SQL file
copy: src=roles/db/files/{{ item.src }} dest=/tmp/{{ item.src }}
when: item.when
loop:
- src: schema_changes_v1.sql
when: db_result.query_result[0][0]['value'] | int < 1