可以 "when statements should not include jinja2 templating delimiters"
ansible "when statements should not include jinja2 templating delimiters"
我已经阅读了一些关于如何重写 when
子句以避免关于 jinja2 模板分隔符 {{
和 }}
的警告的示例 - 但没有看到任何关于避免使用 {% for ... %}
.
我大致有以下步骤:
- name: Wait for Started status to clear
uri:
url: http://{{ container.ip }}:8080/upgrade/api/v1/upgrades/{{ theuuid }}
return_content: yes
register: progress_status
until: >
{% for c in (progress_status.content | from_json).data.states %}
{{ c.state != 'Started' }}
{% if not loop.last %}and{% endif %}
{% endfor %}
retries: 30
delay: 15
uri
以 json 形式调用 returns 容器列表及其 'state'。我想继续查询这个 uri
直到 none 个容器处于 Started
状态。
由于 {% for ... %}
循环,这会生成警告。
我可以通过查看代表 Started 状态的 json 字符串的整个响应来做一个不太具体的测试。但这似乎比查看每个容器的状态(构建 true and true and ...
的布尔表达式)更神秘。但这是我现在的选择。
或者我可以使用 block
进行查询,然后将条件构建为事实,然后将事实用作块上的 until
。但这似乎也更难阅读。
关于如何处理这种模式的建议?
您可以使用 selectattr
/rejectattr
过滤器来 fetch/delete 列表中的特定项目:
until: (progress_status.content | from_json).data.states | rejectattr('state','equalto','Started') | list | length == 0
这里我们使用 (progress_status.content | from_json).data.states
列表,删除所有具有 state=='Started'
的元素并检查剩余列表的长度。
当拒绝后的列表为空时任务将完成,这意味着所有项目都具有 Started
状态。
我已经阅读了一些关于如何重写 when
子句以避免关于 jinja2 模板分隔符 {{
和 }}
的警告的示例 - 但没有看到任何关于避免使用 {% for ... %}
.
我大致有以下步骤:
- name: Wait for Started status to clear
uri:
url: http://{{ container.ip }}:8080/upgrade/api/v1/upgrades/{{ theuuid }}
return_content: yes
register: progress_status
until: >
{% for c in (progress_status.content | from_json).data.states %}
{{ c.state != 'Started' }}
{% if not loop.last %}and{% endif %}
{% endfor %}
retries: 30
delay: 15
uri
以 json 形式调用 returns 容器列表及其 'state'。我想继续查询这个 uri
直到 none 个容器处于 Started
状态。
由于 {% for ... %}
循环,这会生成警告。
我可以通过查看代表 Started 状态的 json 字符串的整个响应来做一个不太具体的测试。但这似乎比查看每个容器的状态(构建 true and true and ...
的布尔表达式)更神秘。但这是我现在的选择。
或者我可以使用 block
进行查询,然后将条件构建为事实,然后将事实用作块上的 until
。但这似乎也更难阅读。
关于如何处理这种模式的建议?
您可以使用 selectattr
/rejectattr
过滤器来 fetch/delete 列表中的特定项目:
until: (progress_status.content | from_json).data.states | rejectattr('state','equalto','Started') | list | length == 0
这里我们使用 (progress_status.content | from_json).data.states
列表,删除所有具有 state=='Started'
的元素并检查剩余列表的长度。
当拒绝后的列表为空时任务将完成,这意味着所有项目都具有 Started
状态。