Edited at

【Ansible】独自Plugins-filter_plugins編-

More than 3 years have passed since last update.

Ansibleを使っていると、無性に独自のFilter Pluginを作りたくなることってありますよね。

ですが、なかなか独自Pluginの作り方について言及している記事が無かったので作ってみました。

今回は文字列のエスケープをしたくなったので、雑なFilter Pluginを作ってみました。

Moduleはインプット/アウトプットが形式に沿っていればどの言語でも良いのですが、PluginはPythonではないといけない模様です。


出来上がりイメージ



  • Before文字列

    mydomain\\Administrator
    



  • After文字列

    mydomain%50cAdministrator
    


「\」を「%50c」に置換しています。

勘の良い人は「あ、VMware環境にいる人だ」って思われるかもしれませんが、その通りです。


Plugin置き場について

Ansible Playbookと同じパスに「filter_plugins」というディレクトリを作り、その中に任意の名前の「○○○○.py」を配置しておきます。重複さえなければ名前にルールはないようです。

このパスに入っているPythonスクリプト達は、使われる/使われないに関わらず全てFilter Pluginとして読み込まれます。

または、ansible.cfgの以下の箇所を書き換えることでもPluginの置き場を指定できます。

filter_plugins     = /usr/share/ansible_plugins/filter_plugins


コード

pluginの中身はこんな適当な感じでOKです。

# ↓これは必須

from ansible import errors

def escape(name):
return name.replace('\\', '%50c')

# ↓Filter Pluginの場合は以下の2行が必須
class FilterModule(object):
def filters(self):
return {
# 右辺はメソッド名です
'escape_domain' : escape,

# これでも同じ結果が得られます
# ささっと終わる場合はラムダ式でもいいですが、属人性は強いかもしれません
'escape_domain2': lambda content: content.replace('\\', '%5c')
}

※サーバに配置する場合はソースをそのまま使わずコメント部分は消してください

※または「# -- coding: utf-8 --」を先頭に記載してください


使い方

PlaybookやRoleにて以下のように呼び出すことができます。

{{ name | escape_domain }}

パイプの右に書くのは、Pluginのreturnマップの左辺です。

Jinja2のfilterをめっちゃ駆使してエスケープしている人もいますけど、Ansibleの良さの1つである「属人性排除」を結局殺してしまっていることがあるので、独自Pluginで逃げてもいいんじゃないでしょうか。

独自の場合、カスタマイズが必要になるので面倒を見続けるという覚悟も必要ですが。

それでは。