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

第8回Puppet実践テクニック(その3)

前回に引き続き、Puppetを実践で利用するためのテクニックについて解説します。

データファイルの階層構造

Puppet本家WikiのPuppet Best Practiceでは、データファイル(マニフェスト、モジュール、テンプレート、配布用ファイル等)を管理しやすい階層構造の例が説明されています。筆者が勤める⁠株⁠paperboy&co.では、この例をベースにして以下のような階層構造でデータファイルを管理しています。

⁠株⁠paperboy&co.におけるデータファイルの階層構造
(株)paperboy&co.におけるデータファイルの階層構造

distディレクトリには、Puppetクライアントへ配布するファイルを置きますが、直接ファイルを置かずに、更にクラスごとのディレクトリを作成し、その下に配布用のファイルを置きます。dist/{classname}以下は、Puppetクライアント上にファイルを置く時のパスと同じ構造にします。例えば、baseクラスのノードに/etc/hostsファイルを配布する場合は、dist/base/etc/hostsといった構造になります。

manifestsディレクトリにはマニフェストを置きます。site.ppにはインポートするマニフェストを列挙します。また、manifestsディレクトリの下にはクラスごとにディレクトリを作成し、その下に目的別のマニフェストファイルを置きます。例えば、単純にパッケージの追加/削除を行うためのpackage.pp、Apache関連のリソースをひとまとめにしたapache.pp、といった形になります。

templatesディレクトリ以下にはクラスごとにディレクトリを作成してテンプレートファイルを置きます。templates/{classname}以下の構造はdist/{classname}以下と同様です。

modulesディレクトリにはモジュールを置きます。

マニフェストのコーディングスタイル

Puppet本家WikiのStyle Guideでは、推奨されるマニフェストのコーディングスタイルについて説明されていますが、これに筆者独自の推奨スタイルを併せた形でご紹介します。

矢印(=>)の配置

矢印の配置は、一番長いパラメータに合わせて揃えます。

exec {
    'blah':
        path => '/usr/bin',
        cwd  => '/tmp';
    'test':
        subscribe   => '/etc/test',
        refreshonly => true;
}

ただし、配置はリソースごとに揃えることが推奨ですので、以下は推奨されない配置例です。

exec {
    'blah':
        path        => 'usr/bin',
        cwd         => '/tmp';
    'test':
        subscribe   => '/etc/test',
        refreshonly => true;
}

クォート

予約語や、パラメータで予め決められている選択肢(ensureパラメータのpresent, absentなど)はクォートしません。これら以外の文字列はクォートしますが、変数展開しない場合にはシングルクォートで、変数展開する場合にはダブルクォートでクォートします。リソース名もクォートします。

file { '/tmp/somefile':
    ensure => present,
    owner  => 'root',
    group  => "$group",
}

カンマ

最後のパラメータ行もカンマで終えるようにします。こうしておくと、行を入れ替える時に、単純にカット&ペーストするだけで済みます。

file { "/tmp/somefile":
    ensure => exists,
    owner  => 'root',
}

リソースの宣言

パラメータがひとつしかないリソースは、1行で宣言します。

file { '/tmp/somefile': ensure => exists }

同じタイプのリソースを複数宣言する場合は、ひとつのブロック内に複数のリソースを宣言します。各リソースは;(セミコロン)で区切られます。この場合には、⁠最後のパラメータ行もカンマで終える」⁠パラメータがひとつしかないリソースは1行で宣言する」という原則は適用されません。

file {
    '/tmp/app':
        ensure => directory;
    '/tmp/app/file':
        ensure => exists,
        owner  => 'webapp';
    '/tmp/app/file2':
        ensure => exists,
        owner  => 'webapp',
        mode   => 755;
}

シンボリックリンク

シンボリックリンクは以下のように宣言できますが、これは推奨されない例です。

file { '/var/log/syslog':
    ensure => '/var/log/messages',
}

シンボリックリンクであることを明確にするために、以下のスタイルが推奨されます。

file { '/var/log/syslog':
    ensure => link,
    target => '/var/log/messages',
}

レポーティング

Puppetにはマニフェストの適用結果をレポートする機能があります。レポートの種類としては、log、tagmail、rrdgraph、storeの4種類があります。

レポート機能のための設定

Puppetクライアント側での設定

レポート機能を利用するためには、コマンドラインオプションまたは設定ファイルでレポート機能を有効にする必要があります。

コマンドラインオプションの場合、puppetd実行時に以下のように--reportオプションを指定します。

$ sudo puppetd --report

設定ファイルの場合、0.22.xではpuppetd.confに以下のように記述します。

report = true

0.23.xではpuppet.confのpuppetdセクションに以下のように記述します。

[puppetd]
    report = true

Puppetサーバ側での設定

Puppetサーバ側では、コマンドラインオプションまたは設定ファイルで有効にするレポートの種類を設定します。

コマンドラインオプションの場合、puppetmasdterd実行時に以下のように--reportsオプションで設定します。

$ sudo puppetmasterd --reports tagmail,log,rrdgraph,store

設定ファイルの場合、0.22.xではpuppetmasterd.confに以下のように設定します。

reports = tagmail,log,rrdgraph,store

0.23.xではpuppet.confに以下のように設定します。

[puppetmasterd]
    reports = tagmail,log,rrdgraph,store

0.22.x、0.23.xともに、何も設定されていない場合でも、storeがデフォルトで有効になります。

レポートの種類毎の解説

log

logはPuppetクライアントからのレポート通知をログファイルに出力します。puppetmasterdで--verboseオプションを指定している場合は、標準出力に出力します。ログに出力される内容は以下のようになります。

Sep 16 19:57:12 puppet puppetmasterd[3077]: (//client.example.org/base/Package[ntpd]/ensure) change from absent to latest failed: Could not update: Could not find package ntpd at /etc/puppet/manifests/site.pp:9
Sep 16 19:57:12 puppet puppetmasterd[3077]: (//client.example.org/base/File[/etc/hosts]/mode) mode changed '600' to '644'

syslogのfacilityはデフォルトではdaemonですが、puppet.confで別のfacilityに変更することができます。

[puppetmasterd]
    syslogfacility = local0

tagmail

tagmailはPuppetからのレポート通知をメール送信します。メールの内容は以下のようになっています。

Subject: Puppet Report for client.example.org
From: report@puppet.example.org

Sun Sep 16 20:01:06 +0900 2007 //client.example.org/base/Package[ntpd]/ensure (err): change from absent to latest failed: Could not update: Could not find package ntpd at /etc/puppet/manifests/site.pp:9
Sun Sep 16 20:01:06 +0900 2007 //client.example.org/base/File[/etc/hosts]/mode (notice): mode changed '600' to '644'

tagmailを利用する際には、/etc/puppet/tagmail.confにメール送信先アドレスを設定する必要があります。

all:  root@localhost
mail: postmaster@domain.com
sun:  solarisadmins@domain.com

tagmailはその名の通り、リソースにつけられたタグに応じて、メールの送信先を変えることができます。allはすべてのタグに適用される送信先アドレスです。

また、puppet.confで以下のように、メール送信に関する設定を変更することができます。

[puppetmasterd]
    sendmail   = /usr/lib/sendmail
    reportfrom = puppet@localhost
    smtpserver = localhost

rrdgraph

rrdgraphは、適用されたリソース数やエラーで適用できなかったリソース数、マニフェストの取得や適用にかかった時間などをPNG画像のグラフに出力します。

rrdgraphを利用するためには、RRDtoolrubyRRDtoolがPuppetサーバ上にインストールされている必要があります。

HTMLと画像ファイルは、Puppetサーバ上の/var/puppet/rrd/client.example.orgといったディレクトリに出力されます。出力される画像は以下のようになります。

rrdgraph
rrdgraph(1) rrdgraph(2) rrdgraph(3)

store

storeはrrdgraphで得られる情報と同じものを、YAML形式でファイルへとダンプします。

$ ls /var/puppet/reports/client.example.org/
200709140455.yaml  200709160621.yaml  200709160625.yaml  200709161119.yaml
200709160618.yaml  200709160622.yaml  200709161038.yaml

レポートファイルの内容は次のようになります。

--- !ruby/object:Puppet::Transaction::Report
host: client.example.org
logs: []

metrics:
  time: !ruby/object:Puppet::Util::Metric
    label: Time
    name: time
    values:
    - - :file
      - File
      - 0.00976777076721191
    - - :total
      - Total
      - 1.16076874732971
    - - :config_retrieval
      - Config retrieval
      - 1.1510009765625
  resources: !ruby/object:Puppet::Util::Metric
    label: Resources
    name: resources
    values:
    - - :restarted
      - Restarted
      - 0
    - - :applied
      - Applied
      - 0
    - - :total
      - Total
      - 3
    - - :failed_restarts
      - Failed restarts
      - 0
    - - :skipped
      - Skipped
      - 0
    - - :failed
      - Failed
      - 0
    - - :scheduled
      - Scheduled
      - 2
    - - :out_of_sync
      - Out of sync
      - 0
  changes: !ruby/object:Puppet::Util::Metric
    label: Changes
    name: changes
    values:
    - - :total
      - Total
      - 0
records: {}

time: 2007-09-14 14:35:00.834810 +09:00   

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

お知らせ

本連載をベースに、大幅に加筆/修正した形で、Software Design 2007年12月号にPuppet特集を寄稿いたしましたので、ぜひご覧ください。今後の連載の内容とも被る部分はありますが、本連載ではできるかぎりPuppetの最新情報に追従したり、SD誌ではご紹介できなかった内容を盛り込んでいきたいと思います。

おすすめ記事

記事・ニュース一覧