Ansible:使用 CLI 列出 Jinja2 过滤器

Ansible: list Jinja2 filters using the CLI

在使用 Ansible 进行开发时,我希望能够完全使用 CLI 来查找信息,而不必每 5 分钟 Google 一些东西。

我经常使用 ansible-doc 命令来获取有关内置模块、Ansible 关键字等的信息,而当我必须编写 ansible.cfg 文件时,我经常使用 ansible-config 命令。不幸的是,我找不到任何与 Jinja2 过滤器相关的内容。

问题

如果我无法访问浏览器或我正在参加 Red Hat 考试,我如何才能在不完全依赖记忆的情况下获得所有 Jinja2 过滤器的列表?

我一直希望 ansible-doc 也有一个 -t filters 选项,但我认为这不太可能发生,因为考虑到 jinja2 本身有过滤器然后 ansible,过滤器处于独特的情况使用其插件机制在内置的 jinja2 之上添加额外的过滤器。随着新的 ansible-collections split

,这个故事只会变得更糟

我可以为离线案例提供(至少)两个解决方法:

  1. pydoc 命令
  2. 蛮力find

使用 pydoc

您可以通过 ansible --version 识别 ansible 本身正在使用的 python 解释器并查找 ansible python module location。虽然该路径将指向 .../site-packages/ansible 目录,但它仍然有助于了解 ansible 是否在 virtualenv 中(如 Brew 所做的那样),在 $HOME/.local 中,或者应该针对哪个系统 python 版本看

在这些片段中,我将只使用 python,但在实际情况下,它将是 python 二进制文件的完全限定路径ansible 使用

然后,通过

枚举 jinja2 过滤器
python -m pydoc jinja2.filters

和非集合ansible过滤器首先获取顶级包:

$ PAGER=cat python -m pydoc ansible.plugins.filter
Help on package ansible.plugins.filter in ansible.plugins:

NAME
    ansible.plugins.filter - # Make coding more python3-ish

PACKAGE CONTENTS
    core
    mathstuff
    urls
    urlsplit

然后迭代过滤器包

for i in core mathstuff urls urlsplit; do
  python -m pydoc ansible.plugins.filter.$i
done

该技术还将在输出底部打印实际的 python 源代码路径,如果您需要深入了解任何细微差别或记忆慢跑的实际实现细节

我使用这个技巧从已安装的集合中找到潜在的过滤器插件,取得了一些有限的成功

ansible-galaxy collection list | \
    sed 's/^/ansible_collections./; s/  *[0-9].*/.plugins.filter/'

但显然并非所有这些包都是正确的甚至存在

暴力使用 find

新发现的拆分成 ansible-collections 使得使用 pydoc 方法整个列表更难,但它们仍然在磁盘上 python 文件,所以你可以使用path 谓词定位提供过滤器插件的谓词:

for p in $(ansible --version | awk -F= '/ansible .* location/{gsub(":", "\n", ); print }'); do
  find ${p}* -path '*/plugins/filter/*' -name '*.py' 2>/dev/null
done

这将作为一个内存慢跑,一个阅读源代码的地方,以及使用上述 pydoc 技术的目标,如果您愿意的话