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

第3回マニフェストはじめの一歩

今回から、Puppetでのシステム管理の肝となる、マニフェストについて解説していきます。

マニフェストとは、Puppet独自の宣言型言語によって、システムのあるべき状態を記述したファイルです。マニフェストをいかに維持管理するかが、Puppetでのシステム管理の要となります。

シンプルなマニフェストをシステムに適用してみる

まずはシンプルなマニフェストを作成してそれを適用することによって、Puppetが動作する様子を実際に見てみましょう。

Puppetサーバ上で、以下の内容の/etc/puppet/manifests/site.ppを作成します。

file { '/etc/hosts':
    owner => 'root',
    group => 'root',
    mode  => 644,
}

内容は推測できると思いますが、詳細は後ほど解説します。

マニフェストを作成したらpuppetmasterdを起動します。

$ sudo puppetmasterd --nonodes --verbose
info: Starting server for Puppet version 0.22.4
info: Parsed manifest in 0.01 seconds
info: Listening on port 8140
notice: Starting Puppet server version 0.22.4

次はPuppetクライアント側での操作です。/etc/hostsのパーミッションを644以外に変更します。

$ sudo chmod 600 /etc/hosts

そしてpuppetdを起動します。--verboseオプションをつけることにより、実際に何が行われているのかを確認することができます。

$ sudo puppetd --server puppet.example.com --verbose
notice: Starting Puppet client version 0.22.4
info: Facts have changed; recompiling
info: Caching configuration at /var/puppet/state/localconfig.yaml
info: No classes to store
notice: Starting configuration run
notice: //File[/etc/hosts]/mode: mode changed '600' to '644'

この様に、/etc/hostsのパーミッションが600から644に変更されていることが確認できます。

リソースの宣言

ユーザ、ファイル、ソフトウェ等の、Puppetの管理対象となるものを「リソース」と呼びます。マニフェスト作成のはじめの一歩は、リソースを宣言するところからはじまります。

先ほど適用したマニフェストをもう一度見てみます。

file { '/etc/hosts':
    owner => 'root',
    group => 'root',
    mode  => 644,
}

最初の「file」はリソースタイプと呼ばれ、このリソースの種類を示しています。リソースタイプの次に記述されている「'/etc/hosts'」はリソースを識別するための名前です。残りのowner、group、modeはこのリソース固有のパラメータです。

これにより、⁠/etc/hostsファイルのオーナ/グループはroot/root、パーミッションは644であるべき』というシステムの状態が宣言されます。

あらかじめPuppetに組み込まれているリソースタイプには、file以外にも以下のようなものがあります。

  • user(ユーザ)
  • group(グループ)
  • host(ホスト)
  • package(ソフトウェアパッケージ)
  • service(稼動しているサービス)

これら以外にも様々なリソースタイプがあります。

リソースの名前は管理対象となるファイルのパスを示しています。管理対象となるファイルのパスは、pathパラメータによって指定することもできるため、以下の様にマニフェストを記述することもできます。

file { 'hosts':
    path  => '/etc/hosts',
    owner => 'root',
    group => 'root',
    mode  => 644,
}

pathパラメータの様に、リソース名と結び付けられるパラメータをnamevarと呼びます。namevarはfileタイプの場合はpath、userタイプの場合はnameといった具合に、リソースタイプによって異なります。

fileタイプで指定できるパラメータには、他にも以下のようなものがあります。

  • backup
  • checksum
  • content
  • ensure

fileタイプ以外のリソースタイプにどんなものがあるか、各リソースタイプのnamevarは何か、各リソースタイプ毎に設定できるパラメータやその意味は何かなど、もっと詳しくお知りになりたい方は、パペウィキ - Typeリファレンスをご参照下さい。

この連載でも順次解説していきたいと思います。

複数リソースの宣言

マニフェストでは当然のことながら、以下の様に複数のリソースを宣言することができます。

file { '/etc/hosts':
    owner => 'root',
    group => 'root',
    mode  => 644,
}

file { '/etc/sudoers':
    owner => 'root',
    group => 'root',
    mode  => 440,
}

リソースタイプが同じ場合には、以下の様にひとつのブロックでまとめて宣言することもできます。

file {
    '/etc/hosts':
        owner => 'root',
        group => 'root',
        mode  => 644;
    '/etc/sudoers':
        owner => 'root',
        group => 'root',
        mode  => 440;
}

リソースタイプが異なる場合には、ひとつのブロックでまとめて宣言することはできません。

file { '/etc/sudoers':
    owner => 'root',
    group => 'root',
    mode  => 440,
}

exec { 'blah':
    path => '/usr/bin',
    cwd  => '/tmp',
}

リソースパラメータのデフォルト値

同じタイプのリソースに共通となるパラメータのデフォルト値を宣言することができます。宣言の方法は通常のリソースの宣言と似ていますが、リソースタイプの先頭を大文字にし、リソース名は指定せずに、以下の様に宣言します。

File {
    owner => 'root',
    group => 'root',
    mode  => 644,
}

file {
    '/etc/hosts':  ;
    '/etc/passwd': ;
    '/etc/group' : ;
    '/etc/sudoers':
        mode => 440;
}

デフォルト値と異なるものは上書きすることができ、上の様に記述することで、⁠/etc/hosts、/etc/passwd、/etc/group、/etc/sudoersのオーナ/グループはroot/root、パーミッションは/etc/sudoersが440、それ以外のファイルは644であるべき』というシステムの状態が宣言されます。

マニフェスト作成に便利なツール

配布されているPuppetのtarballには、Emacs用とVim用のヘルパーモードファイルが同梱されています。それぞれext/emacs、ext/vimディレクトリに置かれています。

ヘルパーモードはタブキーでのインデント調整やシンタックスカラーリングをサポートしており、とても便利です。筆者はEmacs用のヘルパーモードを利用していますが、これなしでマニフェストを書く気にはなれません。

ヘルパーモードファイルだけ欲しい場合には、tarballをダウンロードしなくても、SVNリポジトリから必要なファイルだけを取得することができます。

今回はマニフェストはじめの一歩と題して、マニフェストでのリソースの宣言方法について解説しました。次回はマニフェストについて更に詳細に解説する予定です。

参考URL

おすすめ記事

記事・ニュース一覧