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
,这个故事只会变得更糟
我可以为离线案例提供(至少)两个解决方法:
- pydoc 命令
- 蛮力
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
技术的目标,如果您愿意的话
在使用 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
我可以为离线案例提供(至少)两个解决方法:
- pydoc 命令
- 蛮力
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
技术的目标,如果您愿意的话