Jinja2过滤列表使用字符串包含test

Cor*_*han 8 jinja2 ansible ansible-2.x

当元素包含一个字符串时,我正试图在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\") }}"
Run Code Online (Sandbox Code Playgroud)

但我得到的只是错误:

"<generator object _select_or_reject at 0x13851e0>": "VARIABLE IS NOT DEFINED!"
Run Code Online (Sandbox Code Playgroud)

所以例如,如果stdout_lines包含["apples","running script one","oranges","running script two"],我想要打印

running script one
running script two
Run Code Online (Sandbox Code Playgroud)

他们有内置测试的选择文档的文档,但是它们没有显示"in"测试,我不知道它们如何在这个ansible变量的上下文中工作.

我尝试像这样解决它:

- name: display run info
  debug:
    var: item
  with_items: "{{script_results.stdout_lines}}"
  when: "'running script' in item"
Run Code Online (Sandbox Code Playgroud)

但是,对于没有通过测试的每一行显示"跳过"...有点击败目的!

udo*_*dan 15

select过滤器会采取另一种过滤器.就像在docs中一样odd,它只会返回列表中的奇数元素.您想要select与之结合使用的过滤器是equalto.

现在就是这样的.Ansible捆绑了一个非常旧版本的Jinja2,它只是不包含equalto过滤器.是的,除非你想过滤奇数元素,否则它会变得无用.(历史上没有人想要...)

此外,我还无法在Ansible 2中使自定义过滤器插件工作.所以你几乎被迫一起破解丑陋的东西.

helloV已经显示了一个选项.这是另一个想法:

- name: run script
  shell: /usr/tmp/run_script.py | grep "running script"
  register: script_results
Run Code Online (Sandbox Code Playgroud)

更新:

我最近发现你可以使用match(不是标准的Jinja2过滤器,而是由Ansible添加)select.这是eualto过滤器的一个很好的替代品,你可以使用正则表达式.这应该工作:

{{ script_results.stdout_lines | select("match", ".*running script.*") }}
Run Code Online (Sandbox Code Playgroud)


hel*_*loV 4

我知道可能有不止一种方法可以做到这一点。这对你有用吗?

  - debug: var={{item}}
    when: item.find('running script') > -1
    with_items: script_results.stdout_lines
Run Code Online (Sandbox Code Playgroud)