オープンソースなシステム自動管理ツール Puppet

第14回 Facterの拡張

この記事を読むのに必要な時間:およそ 2.5 分

今回は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をご参照ください。

著者プロフィール

宮下剛輔(みやしたごうすけ)

(株)paperboy&co.技術責任者。 社内ではサーバ周りからアプリケーション開発まで幅広く関わる一方,個人的にはPerlプログラミングを趣味として,サーバ管理用ユニットテストスイート Assurer(アシュラ)をオープンソースで公開したり,CPAN AuthorPlaggerコミッタとして活動している。また,YAPC::Asia 2007 Tokyo等の技術系カンファレンスでスピーカを務めるのも最近の楽しみのひとつ。共著書に『MASHUP++』がある。

URLhttp://mizzy.org/

コメント

コメントの記入