当元素包含字符串时,我试图在 Jinja2 中的 ansible 中过滤列表,但 Jinja 文档似乎不够清晰,我无法弄清楚。
这是我到目前为止:
- name: run script
command: /usr/tmp/run_script.py
register: script_results
- name: display run info
debug:
var: "{{script_results.stdout_lines | select(\"'running script' in script_results.stdout_lines\") }}"
但我得到的只是错误:
"<generator object _select_or_reject at 0x13851e0>": "VARIABLE IS NOT DEFINED!"
例如,如果
stdout_lines
包含 ["apples","running script one","oranges","running script two"]
, 我要打印running script one
running script two
他们有 documentation for select和 documentation for built-in-tests ,但它们不显示“in”测试,我不知道它们在这个 ansible 变量的上下文中是如何工作的。
我试着像这样解决它:
- name: display run info
debug:
var: item
with_items: "{{script_results.stdout_lines}}"
when: "'running script' in item"
但这对于未通过测试的每一行都显示“跳过”......有点违背了目的!
最佳答案
select
过滤器将采用另一个过滤器。就像在文档中一样 odd
,这将只返回列表的奇数元素。您想要组合的过滤器 select
与是 equalto
.
现在事情来了。 Ansible 捆绑了一个非常旧的 Jinja2 版本,它根本不包含 equalto
筛选。是的,除非您想过滤奇数元素,否则它会变得毫无用处。 (历史上从来没有人想要......)
此外,我还无法使自定义过滤器插件在 Ansible 2 中工作。因此,您几乎被迫将一些丑陋的东西组合在一起。
helloV 已经显示了一个选项。这是另一个想法:
- name: run script
shell: /usr/tmp/run_script.py | grep "running script"
register: script_results
更新:
我最近发现你可以使用
match
(不是标准的 Jinja2 过滤器,而是由 Ansible 添加)和 select
.这是 eualto
的一个很好的替代品filter plus 你可以使用正则表达式。这应该有效:{{ script_results.stdout_lines | select("match", ".*running script.*") }}
关于使用字符串包含测试的 Jinja2 过滤器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281785/