今回はFacterを拡張して,デフォルトでは取得できないシステム情報を取得する方法,ならびに拡張したFacterをPuppetでどのように利用するかについて解説します。
Facterとは?
Facterとは,第5回でも解説していますが,システムに関する情報(プロセッサアーキテクチャ,利用OSとそのバージョン,ドメイン名,FQDN,IPアドレスなど)を収集するための,クロスプラットフォームなRubyライブラリです。PuppetではこのFacterによってセットされるFacter変数を利用することにより,システム条件に応じて挙動を変更するようなマニフェストを記述したり,テンプレートにシステム情報を埋め込んだり,といったことが実現できます。
たとえば,OSの違いによるntpdパッケージ名の違いを吸収するためには,以下のようにマニフェストを記述します。
$ntp_package = $operatingsystem ? {
freebsd => 'openntpd',
default => 'ntp',
}
package { $ntp_package: ensure => present }
operatingsystemやipaddressなどFacterによって取得できる項目を"fact"と呼びます。
カスタムfactの作成
Facterを拡張するための準備として,カスタムfact用のファイルを置くディレクトリを作成し,rubyから参照できるように,環境変数RUBYLIBを設定します。
$ mkdir -p ~/lib/ruby/facter
$ export RUBYLIB=~/lib/ruby
カスタムfact用ファイルの内容は以下のようになり,~/lib/ruby/facter の下に置きます。
Facter.add("custom_fact") do
setcode do
# カスタムfactの値を返す
end
end
たとえば,環境変数$HOMEを取得するためのカスタムfactファイル ~/lib/ruby/facter/home.rb を以下の内容で作成します。
Facter.add("home") do
setcode do
ENV['HOME']
end
end
この状態でfacterコマンドを実行すると,環境変数$HOMEの値が取得できます。
$ facter home
/home/mizzy
特定の条件のみで値を返したい場合には,confineを利用します。例えば,kernelがlinuxの場合にのみ値を返すカスタムfactは,以下のように記述します。
Facter.add("custom_fact") do
confine :kernel => :linux
setcode do
# カスタムfactの値を返す
end
end
Puppetでのカスタムfactの配布
FacterはPuppetクライアント上で実行されるため,カスタムfactを利用するためには,すべてのPuppetクライアントにカスタムfactファイルを配布する必要があります。
Puppetサーバ側では以下の様な設定を/etc/puppet/fileserver.confに記述し,Puppetクライアントがファイルサーバ経由でカスタムfactファイルを取得できるようにします(/var/puppet/facts以下にカスタムfactファイルが置かれていると仮定します)。
[facts]
allow *
path /var/puppet/facts
Puppetクライアント側では,/etc/puppet/puppetd.conf(0.22.x)や/etc/puppet/puppet.conf(0.23.x以降)に以下の様に記述し,Puppetサーバからカスタムfactファイルを取得するように設定します。
[puppetd]
factsync = true
上記の様な設定を行い,Puppetクライアント上でpuppetdを実行すると,以下のように表示されカスタムfactが取得できていることがわかります。
$ sudo puppetd --server puppet.example.org --verbose
notice: Starting Puppet client version 0.22.4
info: Retrieving facts
notice: /fact_collector/File[/var/puppet/facts]/ensure: created
notice: /fact_collector/File[/var/puppet/facts/home.rb]/ensure: created
info: Loading fact home
info: Facts have changed; recompiling
...
ここで説明したカスタムfactの配布方法は,Puppet 0.24.x以降では変更されますが,0.24.xはまだstableではないため,今回は説明を割愛します。詳細はPuppetオフィシャルWikiのPlugins in Modulesをご参照ください。

