ansible"当陈述不应包括jinja2模板分隔符时#34;

时间:2017-05-15 14:50:41

标签: ansible jinja2 ansible-2.x

我已经阅读了一些关于如何重写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 ... %}循环,这会生成警告。

我可以通过查看表示Started状态的json字符串的整个响应来进行不太具体的测试。但这似乎比查看每个容器的状态(构建true and true and ...的布尔表达式)更神秘。但这是我现在的替代方案。

或者我可以使用block并执行查询,然后将条件构建为事实,然后将该事实用作块上的until。但这似乎也难以阅读。

关于如何处理这种模式的建议?

1 个答案:

答案 0 :(得分:3)

您可以使用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状态。