繁体   English   中英

ansible“当陈述不应包括jinja2模板分隔符”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM