Ansibleのtemplateにカスタムフィルタを追加

Ansibleのtemplateモジュールではjinja2が使われているため、カスタムフィルタを登録して好きな処理を書ける。

templateはplaybookのパース時にも使われるので、Ansibleロード時点でグローバルなプラグインとして導入する必要がある。今のところロードするフィルタの切り替えはansible.cfgで切り替えるしか無いようだ。 (ドキュメントには ./libraryに置くことでロードできるらしいのだがcfgで上書きされているっぽい)

フィルタの登録はFilterModule().filters()が返す辞書。

import socket
class FilterModule(object):
    def filters(self):
        return {"A": socket.gethostbyname}

このファイルを適当な名前でfilter_pluginsフォルダに置くとansibleロード中に読み込まれる。

実際のパス指定はansible.cfgの

filter_plugins     = /usr/share/ansible_plugins/filter_plugins

参照: https://github.com/ansible/ansible-examples/blob/master/language_features/filter_plugins/custom_plugins.py