Jinja2筛选器列表使用字符串包含测试
当元素包含字符串时,我试图在Jinja2中过滤ansible中的列表,但是Jinja文档似乎不够清晰,无法让我弄清楚.
I'm trying to filter a list in ansible in Jinja2 when the elements contain a string, but the Jinja documentation doesn't seem clear enough for me to figure it out.
这是我到目前为止所拥有的:
This is what I have so far:
- 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\") }}"
但是我得到的只是错误:
But all I get is the error:
"<generator object _select_or_reject at 0x13851e0>": "VARIABLE IS NOT DEFINED!"
例如,如果stdout_lines
包含["apples","running script one","oranges","running script two"]
,我想打印
So for example, if stdout_lines
contains ["apples","running script one","oranges","running script two"]
, I want to print
running script one
running script two
他们有选择文档和
They have documentation for select and documentation for built-in-tests, but they don't display the "in" test, and I don't know how they work in the context of this ansible variable.
我试图这样解决它:
- name: display run info
debug:
var: item
with_items: "{{script_results.stdout_lines}}"
when: "'running script' in item"
但是,每条未通过测试的行都会显示正在跳过"……有点违反了目的!
But that displays "skipping" for every line that doesn't pass the test ... kinda defeating the purpose!
select
过滤器将采用另一个过滤器.就像在文档odd
中一样,该文档仅返回列表中的奇数元素.您想将select
与结合使用的过滤器是equalto
.
The select
filter would take another filter. Like in the docs odd
, which will return only the odd elements of the list. The filter you would like to combine select
with is equalto
.
现在这是东西. Ansible捆绑了非常旧的Jinja2版本,该版本根本不包含equalto
过滤器.是的,除非您想过滤奇数元素,否则它就变得毫无用处. (历史上没有人愿意...)
Now here's the thing. Ansible bundles a very old version of Jinja2, which simply does not contain the equalto
filter. Yes, that renders it useless unless you want to filter odd elements. (Which nobody ever in history wanted to...)
此外,我仍然无法在Ansible 2中使用自定义过滤器插件.因此,您几乎被迫一起破解一些丑陋的东西.
Furthermore I was yet unable to make custom filter plugins work in Ansible 2. So you're pretty much forced to hack something ugly together.
helloV已经显示了一个选项.这是另一个想法:
helloV already showed one option. Here is another idea:
- name: run script
shell: /usr/tmp/run_script.py | grep "running script"
register: script_results
更新:
Update:
我最近发现您可以将match
(不是标准的Jinja2过滤器,而是由Ansible添加)与select
一起使用.那可以很好地替代eualto
过滤器,而且您可以使用正则表达式.这应该起作用:
I recently discovered you can use match
(not a standard Jinja2 filter but added by Ansible) together with select
. Thats a good replacement for the eualto
filter plus you can use regular expressions. This should work:
{{ script_results.stdout_lines | select("match", ".*running script.*") }}