facter を拡張する方法

November 3rd, 2009 by naoya | Filed under day.

puppet に付属している facter は、とても便利ですがデフォルトで提供されているもの以外にも自分独自に facter を簡単に拡張することができます。

facter を拡張して、”hardware_platform” という変数を拡張して作る方法を公開しておきます。
なお、Puppet バージョン 0.24.7 を想定しています。0.25 系は方法が違うので注意してください。

まず、次のような <MODULEPATH>/modules/plugins/facter に “hardware_platform.rb” を作成します。なお、必ず作成する ruby のファイル名と facter の変数名は同じでないといけません。

# hardware_platform.rb
Facter.add(“hardware_platform”) do
setcode do
%x{/bin/uname -i}.chomp
end
end

とは、puppet の設定ファイルがあるディレクトリ、デフォルトは /etc/puppet だけれど、次のコマンドで確認できます。

$ sudo /etc/init.d/puppetmaster genconfig | grep modulepath
modulepath = /etc/puppet/modules:/usr/share/puppet/modules

ちなみにカスタム facter を置く場所はどこでも大丈夫です。
作成したカスタム facter を ruby 側でロードできるように環境編集 RUBYLIB を設定します。

$ export RUBYLIB=<MODULEPATH>/module/plugins

RUBYLIB は、ruby の検索パスなので facter まで設定しないように注意します。
この状態で、次のコマンドを実行すればカスタム facter の動作を確認することができます。

$ facter hardware_platform
x86_64

まずは、この状態でカスタム facter を作りこんでいきます。

次に作成したカスタム facter を Puppet クライアントへ配布するには、Puppet クライアントの設定が必要になります。
具体的には、puppet.conf の main セクションに次の設定を追加して puppet クライアントを再起動します。

pluginsync = true
factpath = $vardir/lib/facter

あとは、Puppet サーバと同期すれば自動的に Puppet サーバからカスタム facter を転送されてきます。転送されてきたカスタム facter は、factdest パラメータにコピーされて自動的にロードされます。デフォルトは、/var/lib/puppet/lib/facter です。

Puppet クライアントで、カスタム facter の動作をテストしたいときは、次のコマンドを実行します。

$ sudo facter -p hardware_platform
x86_64

最後に拡張した Facter は、次のように ruby プログラムから簡単に使うことができます。

require ‘facter’
puts Facter[:hardware_platform].value

0.25 系での方法は、別の機会に紹介したいと思います。

参考資料

Leave a Reply