オープンソースなシステム自動管理ツール Puppet
第12回 Puppet関連ツールの紹介(Cft)
Cftとは?
Cft(「シフト」と読みます)はシステムに対する変更を監視して,記録するためのRubyでできたコマンドラインツールです。
Cftは記録された変更をPuppetマニフェスト形式で出力することができますので,既にPuppetを利用している場合には,あるシステムで行った変更を記録してPuppetマニフェスト形式で出力,それをそのまま他のシステムに適用する,といったことができます。
また,Puppetを利用していない場合でも,Cftを利用することでシステムに対する変更を自動的に漏れなく記録することができますし,記録のための統一フォーマットとしてPuppetマニフェストを流用することで,人手による作業にありがちな記録漏れやミス,フォーマットの不統一を防ぐことができます。
Cftのインストール
Cftのソースコードやパッケージはhttp://cft.et.redhat.com/download/から入手することができます。
Cftのインストール方法としては,
- rpmパッケージのインストール
- gemパッケージのインストール
の2つのパターンがあります(ソースtarballも存在しますが,tarballからはrakeコマンドでrpmまたはgemパッケージを作成してからインストールすることになります)。
ただし,gemパッケージは現在きちんとインストールできるものにはなっていないため,実質はrpmパッケージのインストールのみにしか対応していません。したがって,ここではrpmパッケージのインストールについて解説します。
Cftをインストールするためには,以下のパッケージが必要です
- ruby バージョン1.8.x
- puppet バージョン0.24.x以降
- ruby-fam
- ruby-rpm バージョン1.2.3以降
現在,デフォルトでこれらのパッケージに対応しているRed Hat系のLinuxディストリビューションはFedora 7以降ですので,Cftをお手軽に試したい場合には,Fedora 7以降をご利用ください。Fedora 7以降であれば,以下のようにコマンドを実行することで,Cftのインストールが完了します。
$ sudo yum install ruby puppet ruby-fam ruby-rpm
$ sudo rpm -ivh http://cft.et.redhat.com/download/cft-latest.noarch.rpm
Cftの実行
Cftを実行するには,以下のようにcftコマンドを実行します。
# cft mode [options] session
システムに対する一連の変更を,Cftでは「セッション」という単位で扱います。Cftの基本的な動作の流れは以下のようになります。
- Cftセッションを開始
- システムに対する変更を監視して記録する
- Cftセッションを終了
なお,cftコマンド実行時には,コマンドサーチパスに/sbinや/usr/sbinが含まれている必要があるため,一般ユーザがsudo経由でcftを実行する場合には,以下のようなaliasを設定しておくと便利です。
$ alias cft='PATH=$PATH:/sbin:/usr/sbin sudo cft'
以降では,このaliasが設定されていることを前提として,cftコマンドの実行方法を解説します。
セッションの開始と終了
まずは,cft beginを実行してセッションを開始します。
$ cft begin セッション名
セッションが開始された後は,パッケージをインストールしたり,ファイルを変更したりと,何らかのシステム管理タスクを、いつもと同じように実行します。セッションが終了されるまで,Cftはパッケージやファイルの変更を監視し,記録します。変更の記録は「/tmp/cft/セッション名」というディレクトリの下に保存されます。
セッションを終了するには,cft finishを実行します。
$ cft finish セッション名
例えば,postfixをインストールして設定する,というシステムへの変更を記録したい場合には,以下のように実行します。(セッション名はpostfixとしています。)
$ cft begin postfix
$ sudo yum install postfix
$ sudo vi /etc/postfix/main.cf
$ sudo /sbin/chkconfig postfix on
$ sudo /etc/init.d/postfix start
$ cft finish postfix
セッションをPuppetマニフェストで出力
cft manifestを実行すると,記録したセッションをPuppetマニフェスト形式で出力することができます。先ほど記録したpostfixセッションを出力すると,以下のようになります。
$ cft manifest postfix
class {
group { 'postdrop':
allowdupe => 'false',
provider => 'groupadd',
gid => '90',
check => ['ensure','gid'],
loglevel => 'notice',
ensure => 'present'
}
group { 'postfix':
allowdupe => 'false',
provider => 'groupadd',
gid => '89',
check => ['ensure','gid'],
loglevel => 'notice',
ensure => 'present'
}
user { 'postfix':
allowdupe => 'false',
uid => '89',
provider => 'useradd',
gid => '89',
check => ['ensure','uid','gid','comment','home','shell','groups'],
groups => ['mail'],
loglevel => 'notice',
membership => 'minimum',
comment => '',
shell => '/sbin/nologin',
ensure => 'present',
home => '/var/spool/postfix',
managehome => 'false'
}
service { 'postfix':
pattern => 'postfix',
provider => 'redhat',
check => ['ensure','enable'],
enable => 'true',
loglevel => 'notice',
ensure => 'running',
path => ['/etc/init.d']
}
package { 'postfix.i386':
ensure => '2:2.4.5-2.fc7'
}
file { '/etc/postfix/main.cf':
group => 'root',
owner => 'root',
source => '/tmp/cft/postfix/after/etc/postfix/main.cf',
mode => '0644',
ensure => 'file'
}
... 以下省略 ...
}
セッションのレジューム
cft beginで--resumeオプションを指定すると,一度終了したセッションを再開することができます。
$ cft begin --resume postfix
セッションをtar+gzip形式で保存
cft packでセッションをtar+gzip形式のファイルとして保存することができます。
$ cft pack --tar postfix_session.tar.gz postfix
セッションを削除
記録したセッションを削除するには,cft eraseを実行します。
$ cft erase postfix
Cftの解説は以上です。次回からはまたPuppet本体の話に戻り,仮想リソース,外部ノード,Puppetを拡張する方法など,少し高度なトピックを扱う予定です。

