![](/img/trans.png)
[英]Ansible: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}
[英]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形式返回容器列表及其“状态”。 我想继续查询这个uri
直到所有容器都没有处于Started
状态。
由于{% for ... %}
循环,这会生成警告。
我可以通过查看表示已启动状态的json字符串的整个响应来进行不太具体的测试。 但这似乎比查看每个容器的状态(构建一个true and true and ...
的布尔表达式true and true and ...
)更加神秘。 但这是我现在的替代方案。
或者我可以使用block
并执行查询,然后将条件构建为事实,然后将该事实用作块上的until
。 但这似乎也难以阅读。
关于如何处理这种模式的建议?
您可以使用selectattr
/ rejectattr
过滤器从列表中获取/删除特定项目:
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
状态时,任务将完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.