オープンソースなシステム自動管理ツール 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の基本的な動作の流れは以下のようになります。

  1. Cftセッションを開始
  2. システムに対する変更を監視して記録する
  3. 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を拡張する方法など、少し高度なトピックを扱う予定です。

おすすめ記事

記事・ニュース一覧