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)
我知道可能有不止一种方法可以做到这一点。这对你有用吗?
- debug: var={{item}}
when: item.find('running script') > -1
with_items: script_results.stdout_lines
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21103 次 |
| 最近记录: |