簡體   English   中英

Ansible:使用 CLI 列出 Jinja2 過濾器

[英]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 拆分,這個故事只會變得更糟

我可以為離線案例提供(至少)兩種解決方法:

  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

如果您需要深入了解任何細微差別或 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM