2016-02-09 83 views
5

我试图在元素包含字符串时在Jinja2中的ansible中过滤列表,但Jinja文档看起来不够清晰,不足以让我弄清楚。Jinja2使用字符串的过滤器列表包含测试

这是我到目前为止有:

- 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 selectdocumentation for built-in-tests,但他们没有展示“in”测试,我不知道他们是如何在这个变量的背景下工作的。

我试图解决这样的:

- name: display run info 
    debug: 
    var: item 
    with_items: "{{script_results.stdout_lines}}" 
    when: "'running script' in item" 

但是,这显示“退出”,每行未通过测试......还挺击败宗旨!

回答

4

我知道可能有多种方法可以做到这一点。这会为你工作吗?

- debug: var={{item}} 
    when: item.find('running script') > -1 
    with_items: script_results.stdout_lines 
+0

此打印一行,每跳过项目,不幸失败的目的。 – CorayThan

10

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过滤器加上你可以使用正则表达式。这应该工作:

{{ script_results.stdout_lines | select("match", ".*running script.*") }} 
+0

我会使用这个解决方案,但实际上我在剧本的其他地方使用了脚本的完整输出。我想我可能已经能够将script_results传递给grep并以这种方式注册第二个变量,但我决定改用直接的python路径。 – CorayThan

+0

@CorayThan我更新了我的答案。我现在找到了'equalto'过滤器的好替代品。 – udondan

+0

感谢@ubondan,这正是我一直在寻找的。最新的Ansible发行版有什么变化吗? –

0

我最终写了一个python脚本来做到这一点,因为我不能得到ansible或古jinja2做出剪切。

Ansible任务:

- name: gather run info 
    command: "{{role_path}}/files/print_results.py {{script_results.stdout_lines}}" 
    register: script_print_results 
    delegate_to: 127.0.0.1 
    run_once: true 

- name: display run info 
    debug: 
    var: script_print_results.stdout_lines 
    delegate_to: 127.0.0.1 
    run_once: true 

Python脚本:

for result_line in sys.argv[1:]: 
    if "running script:" in result_line: 
     print result_line[1:-1] 
相关问题