[英]Ansible: list Jinja2 filters using the CLI
在使用 Ansible 進行開發時,我希望能夠完全使用 CLI 來查找信息,而不必每 5 分鍾谷歌一次。
當我必須編寫ansible.cfg
文件時,我經常使用ansible-doc
命令來獲取有關內置模塊、Ansible 關鍵字等的信息和ansible-config
。 不幸的是,我找不到與 Jinja2 過濾器相關的任何內容。
如果我無法訪問瀏覽器或者我正在參加 Red Hat 考試,如何在不完全依賴我的記憶的情況下獲得所有 Jinja2 過濾器的列表?
我一直希望ansible-doc
也有一個-t filters
選項,但我認為這不太可能發生,因為過濾器處於一種獨特的情況,因為 jinja2 本身有過濾器,然后 ansible 在內置層之上添加了額外的過濾器 -在 jinja2 中使用其插件機制。 隨着新的 ansible-collections 拆分,這個故事只會變得更糟
我可以為離線案例提供(至少)兩種解決方法:
find
您可以通過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
如果您需要深入了解任何細微差別或 memory-jog 的實際實現細節,該技術還將在輸出底部打印實際的 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", $2); print $2}'); do
find ${p}* -path '*/plugins/filter/*' -name '*.py' 2>/dev/null
done
如果您願意,這將用作內存慢跑、讀取源代碼的地方以及使用上述pydoc
技術的目標
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.