Ansible 解析逻辑比较 `1 < 1` to true in a loop item test despite filtering/casting to int

问题描述 投票:0回答:1

我正在对许多服务器运行一个游戏,其中第一个任务执行 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

ansible jinja2 ansible-2.x
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.