ansible“;when语句不应包含jinja2模板分隔符“;

ansible“;when语句不应包含jinja2模板分隔符“;,ansible,jinja2,ansible-2.x,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: prog

我已经阅读了一些示例,说明如何重新编写
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和true以及…
)更神秘。但这是我目前的选择

或者我可以使用
进行查询,然后将条件构建为事实,然后将该事实用作
,直到块上的
。但这似乎也很难理解


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

您可以使用
selectattr
/
rejectattr
过滤器从列表中提取/删除特定项目:

until: (progress_status.content | from_json).data.states | rejectattr('state','equalto','Started') | list | length == 0
在这里,我们从json中获取
(progress_status.content)。data.states
列表,删除所有具有
state=='Started'
的元素,并检查剩余列表的长度


当reject后的列表为空时,任务将完成,这意味着所有项都已启动。

我更愿意在上一个任务中创建一个shell脚本(作为模板),该脚本执行
语句中循环所执行的操作,直到
语句停止,并且在每个容器停止时返回零。然后您可以将该脚本作为
local\u action
运行,然后您的
until
语句只需检查脚本的结果,您的剧本看起来就会简单得多。非常好的解决方案!谢谢-它的作品伟大,是那种优雅,我一直在寻找!