使用字符串包含测试的 Jinja2 过滤器列表

标签 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\") }}"

但我得到的只是错误:
"<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”测试,我不知道它们在这个 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/

相关文章:

ansible - 在 ansible playbook 中 Ping 主机

Ansible 库存 : aws_ec2 module -- Looking for an example of a working 'groups:' function

ansible - 无法对/etc/下的文件使用查找文件模块

jquery - 使用 Ajax 接收复选框值

python - Jinja2 是否支持嵌套的 if 语句?

ubuntu - Ansible 将字符串转换为整数

python - 如何过滤 jinja2 模板中的集合?

jenkins - Ansible jenkins_plugin 模块返回 "HTTP Error 403: No valid crumb was included in the request"

ansible - 指向组下的特定主机,Ansible

python - 尽管安装了 Ansible,但找不到 boto3 和 botocore