resources
- Puppet Wiki
- http://www.reductivelabs.com/trac/puppet/wiki
- Installation Guid
- http://www.reductivelabs.com/trac/puppet/wiki/InstallationGuide
- OSCON Presentation
- http://www.reductivelabs.com/downloads/puppet/OSCON.pdf
- Transitioning From Cfengine
- http://www.reductivelabs.com/trac/puppet/wiki/TransitioningFromCfengine
- Type Reference (必読)
- http://www.reductivelabs.com/projects/puppet/reference/typedocs.html
Puppet って?
http://www.reductivelabs.com/trac/puppet/wiki/DocumentationStart
Puppet is a declarative language for expressing system configuration, a client and server for distributing it, and a library for realizing the configuration.
Puppet とは...
- システムの状態を表現するための宣言型の言語
- 設定を配布するためのクライアント、サーバプログラム
- 設定を実現するためのライブラリ
である。Puppet はすべて Ruby で実装されている。そのため、拡張が容易である。同種のソフトウェアに cfengine があるが、 C で書かれているため拡張が容易ではなかった。
Directory
/etc/puppet:
puppetd.conf など、各デーモンの設定ファイル。全ホスト共通。ただし、ほとんどの場合 puppet をパッケージシステム経由でインストールするときに用意されるし、更新したければ puppet を使えばよい。
/etc/puppet/manifests:
site.pp, functions.pp など。puppetmasterd が動いているホストのみ。
/var/lib/puppet:
puppetd が生成するファイルなどが置かれる。template もここ。puppetd が動いているマシンが主に使用する。
設定ファイルはいずれ subversion で管理する。cfengine とちがって、 設定ファイルは各ホストへ配布する必要はない。puppetd が接続時に puppetmasterd へ問い合わせ、自動的にアップデートされる。そのとき、ローカルキャッシュを /var/lib/puppet 以下へ保存する。cfengine ではこの動作も記述する必要があった。
つまり、 puppetmasterd のみ /etc/puppet/manifests 以下を保持する必要がある。よって、クライアント側に最低限必要なものは puppetmasterd が動いているホスト名のみとなる。この点は cfengine が最初に update.conf を必要とするところに比べて優れていると思う。
CfEngine との違い
1. How do all of these variables, like operatingsystem, get set?
http://www.reductivelabs.com/trac/puppet/wiki/FrequentlyAskedQuestions#id42
cfengine では、システムの状態に合せてハードクラスが自動的に設定された。puppetでそれに対応するのは facter が収集した情報ということのようだ。たとえば…
# facter architecture => i386 domain => osaka.tknetworks.org facterversion => 1.3.5 fqdn => natsu.osaka.tknetworks.org hardwareisa => Intel(R) Pentium(R) 4 CPU 1.60GHz hardwaremodel => i686 hostname => natsu id => nabeken ipaddress => 10.0.5.12 kernel => Linux kernelrelease => 2.6.18-gentoo-r4 macaddress => 00:90:FE:22:B0:89 EA:FE:EB:B8:9C:96 B6:99:DC:B0:FB:94 memoryfree => 458.47 MB memorysize => 1010.11 MB operatingsystem => Gentoo operatingsystemrelease => 2.6.18-gentoo-r4 processor0 => Intel(R) Pentium(R) 4 CPU 1.60GHz processorcount => 1 ps => ps -ef puppetversion => 0.22.1 rubysitedir => /usr/lib/ruby/site_ruby/1.8 rubyversion => 1.8.5 swapfree => 499.82 MB swapsize => 499.99 MB uniqueid => 007f0100
となり、この対が puppet で使用できるデフォルトの変数となる。
puppetd vs cfexecd
puppetd はデフォルトでは 30 分毎に puppetmasterd へ問い合わせる。この数値は設定可能である。http://reductivelabs.com/projects/puppet/reference/configref.html
puppetd の引数に -o をつけると cfagent と同じ動作になる。
How to manage your home directory with Puppet
puppet の習得がてら自分のホームディレクトリの管理に使用してみます。いくつかリモートのシェル環境がある場合は環境を統一できます。私の場合、私物のマシンで4台、仕事でも数台シェル環境があります。それぞれ .zshrc などを手でちまちまコピーしているのですが、常にどこかで更新していて、正直もうどこが最新なのかよくわかりません。危ない兆候です。
puppet はシステム全体だけでなく、それよりも小さな領域、今回なら自分のホームディレクトリもマネージメントできます。それは信頼できるマシン上の自分の権限で puppetmasterd を動かすことに他なりません。subversion と組合せればなかなか強力な環境ができそうです。リモートでは puppetd を動かすか、定期的に puppetd -o を回すことになります。puppetでなくても、 svn co を適当に全マシンで回しても似たようなことができますが、それでは細かな制御ができません。Linuxでのものを BSD へそのまま持っていけるかどうかを考えてみてください。
…Ruby が入っているのが最低条件です。最近なら言えば入れてくれるのではないでしょうか。
puppetmasterd
まずは自分のホームディレクトリ上に puppetmasterd 用のディレクトリを作成します。
$ mkdir .puppetmasterd $ cd .puppetmasterd $ cp /etc/puppet/puppet* .
$ cat puppetmasterd.conf [puppet] # Where Puppet stores dynamic and growing data. # The default value is '/var/puppet'. vardir = /home/nabeken/.puppetmasterd/var # The Puppet log directory. # The default value is '$vardir/log'. logdir = $vardir/log # Where SSL certificates are kept. # The default value is '$confdir/ssl'. ssldir = $vardir/ssl [puppetd] # The file in which puppetd stores a list of the classes # associated with the retrieved configuratiion. Can be loaded in # the separate ``puppet`` executable using the ``--loadclasses`` # option. # The default value is '$confdir/classes.txt'. classfile = $vardir/classes.txt # Where puppetd caches the local configuration. An # extension indicating the cache format is added automatically. # The default value is '$confdir/localconfig'. localconfig = $vardir/localconfig [puppetmasterd] masterport = 9999
$ cat .puppetmasterd/fileserver.conf This file consists of arbitrarily named sections/modules # defining where files are served from and to whom # Define a section 'files' # Adapt the allow/deny settings to your needs. Order # for allow/deny does not matter, allow always takes precedence # over deny [home] path /home/nabeken/.puppetmasterd/dist allow 10.3.0.0/16 allow 10.0.0.0/24 allow 2001:3e0:4dd::/42 allow 2001:380:e03:61::/64 allow 127.0.0.1/32
とりあえず、簡単な例として、 zsh, bash にしてみた。たぶん、もっと賢く書けば短かくなるんだと思うけど…。.puppetmasterd/dist は適当なリポジトリの working copy としておく。
$ cat .puppetmasterd/manifests/site.pp ~ class zsh { file { "/home/$id/.zshrc": owner => $id, group => users, mode => 0600, source => "puppet://risa.osaka.tknetworks.org:9999/home/.zshrc", require => Exec["update"] } file { "/home/$id/.zshenv": owner => $id, group => users, mode => 0600, source => "puppet://risa.osaka.tknetworks.org:9999/home/.zshenv", require => Exec["update"] } file { "/home/$id/.zsh-hosts": owner => $id, group => users, mode => 0600, source => "puppet://risa.osaka.tknetworks.org:9999/home/.zsh-hosts", require => Exec["update"] } } class bash { file { "/home/$id/.bashrc": owner => $id, group => users, mode => 0600, source => "puppet://risa.osaka.tknetworks.org:9999/home/.bashrc", require => Exec["update"] } file { "/home/$id/.bash_profile": owner => $id, group => users, mode => 0600, source => "puppet://risa.osaka.tknetworks.org:9999/home/.bash_profile", require => Exec["update"] } } node default { include zsh include bash } node risa inherits default { exec { "update": command => "svn update", cwd => "/home/$id/.puppetmasterd/dist/", path => "/usr/bin" } }