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

第6回 Puppet実践テクニック(その1)

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

プロバイダ

Puppetのリソース抽象化レイヤで中心的な役割を担っているのがプロバイダと呼ばれるものです。

リソース抽象化レイヤでは,管理対象となるリソースを具体的な実装から分離しているわけですが,その具体的な実装部分を裏側で処理しているのが,プロバイダと呼ばれるRubyのクラスやモジュールです。

プロバイダはリソースタイプごとに決まっており,通常はシステムに適したものが自動的に選択されます。たとえば,packageリソースタイプの場合, apt,gem,portage,ports,up2date,yumなど,様々なプロバイダがありますが,Debian/GNU Linuxがインストールされたシステムであればaptが自動で選択されます。

ですがPuppetも完璧ではないため,適切なプロバイダが自動で選択できない状況というのも発生します。そういった場合,以下のようにマニフェストで明示的にプロバイダを指定する必要があります。

package { 'ntp':
    provider => 'yum',
    ensure   => 'present',
}

また,リソースタイプごとにデフォルトのプロバイダを指定しておけば,個別のリソースでプロバイダを指定する手間が省けます。

# packageリソースタイプのデフォルトプロバイダを指定
Package { provider => 'yum' }

# 以下のpackageリソースではプロバイダにyumが利用される
package {
    'ntp':
        ensure => 'present';
    'sudo':
        ensure => 'present';
}

execリソースタイプ

execリソースタイプはその名の通り,何らかのコマンドを実行するためのリソースを宣言する場合に利用します。

しかし,マニフェストは実行するものではなく適用するものであり,アクションを記述するものではなく状態を記述するもの,というのが,Puppet におけるシステム管理の哲学だと筆者は考えていますので,execリソースタイプはどうしても他のリソースタイプでは要件に合わない,という場合にのみ利用するべきです。また,実行するコマンドも,何らかのアクションを行うためではなく,システムを何らかの状態に導くために実行するものである,という視点でリソースを宣言するのがPuppetでシステム管理を行うための重要なポイントです。

以下のマニフェストは,mysql-serverパッケージをインストールし,パスワードがセットされた状態にするためのマニフェストです。⁠パスワードをセットする」のも「パスワードがセットされた状態にする」のも,結果としては同じことを実行していますが,アクションではなく状態という視点を持つことが,Puppetでのシステム管理では重要です。

class mysql-server {
    $password = 'password'
    package { 'mysql-server': ensure => installed }

    service { 'mysqld':
        ensure    => running,
        subscribe => Package['mysql-server'],
    }
 
    exec { 'Set MySQL server root password':
        subscribe   => Package['mysql-server'],
        require     => Service['mysqld'],
        refreshonly => true,
        unless      => "mysqladmin -uroot -p$password status",
        path        => '/bin:/usr/bin',
        command     => "mysqladmin -uroot password $password",
    }
}

ファイルサーバ

puppetmasterdが持っているファイルサーバ機能を利用して,Puppetクライアントへファイルを配布することができます。

ファイルを配布するためのマニフェストは以下のようになり,Puppetサーバ上のファイルが置かれているパスを,puppet://...といったURLでsourceパラメータにセットします。

file { '/etc/sudoers':
    mode   => 440,
    owner  => 'root',
    group  => 'root',
    source => 'puppet://server.example.org/dist/etc/sudoers',
}

Puppetサーバ側では以下のように,/etc/puppet/fileserver.confを設定する必要があります。この例では,puppet: //server.example.org/distというURLを/var/puppet/distディレクトリにマップしています。したがって, puppet://server.example.org/dist/etc/sudoersで /var/puppet/dist/etc/sudoersを取得できるようになります。

[dist]
    path /var/puppet/dist
    allow client.example.com

単一のファイルではなく,特定のディレクトリ以下のファイルを再帰的に配布したい場合には,以下のようにrecurseパラメータにtrueを指定します。

file { '/etc/httpd/conf.d':
  source  => 'puppet://server.example.org/dist/etc/httpd/conf.d
  recurse => true,
}

実践テクニックは更に次回に続きます。

著者プロフィール

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

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

URLhttp://mizzy.org/