すこし前のことになりますが、ベルギーにて 3 月 27 〜 28 日まで Puppet キャンプが開催されました。
Puppet Labs に、そのときの動画をスライドがすべて公開されています。
動画はあとでチェックすることにして、スライドだけチェックしてみました。講演のタイトルは、次のとおりです。
- Portable infrastructure with Puppet – Luke Kanies (Slides|Video)
- Embedded Puppet – Alban Peignier (Slides|Video)
- Deploying datacenters with Puppet – A user’s perspective – Rafael Brito (Slides|Video)
- Puppet modules and module standards – Alessandro Franceschi (Slides|Video)
- Auditing change management policies with Puppet and Splunk – Jeff McCune (Slides|Video)
- Puppet in complex, real-time environments – Rick van der Zwet (Video)
まずは、Puppet の中心人物である Luke さんの発表。この発表では、おもに Puppet の現在の状況と、これからの展望について発表がありました。以下、メモです。
- Puppet は、安定している(現在のリリースバージョンは、0.25.5)
- Puppet は、さまざまな面で日々高速に進化している
- Puppet は、さまざまな分野で使われている(Google、DELL、Disney、J.P.Morgan など)
- Puppet キャンプ 2009 では、次のことを約束した
- バージョン 1.0 のリリース … 1.0 / 2.0 はスキップして、現在 2.6 で開発中で、いくつか大きな機能を盛り込んでいる、Pure Ruby DSL(*1)、クラスパラメータ(*2)、REST への移行がすべて完了する、puppet のプログラム一つに移行する(例えば、puppetmastered -> puppet master となる)、レポートにさらに詳細な情報が含まれるようになる、新しい関連を示すシンタックスが追加される(*3)、ハッシュ(*4)
- Web GUI アプリケーション … Puppet Dashboard としてリリースした
- モジュール … モジュールを共有できる場所として Puppet Forge をリリースした
(*1) Pure Ruby DSL
Puppet 2.6 では、Ruby で DSL として、次のような感じで記述することができる。ついにこの機能が登場しそうです。Ruby で記述できれば、特殊な Puppet DSL を学習することができなくて済みますね(大きな概念は変わらないと思いますが)。おそらく、これはユーザの声をきいた結果だと個人的に思います。
hostclass “foo” do
package :foo, :ensure => :present
service :foo, :ensure => :running
end
node “hoge.example.com” do
acquire “ssh”
end
(*2) クラスにパラメータを与えることができる
class foo($hoge = “bar”) {
…
}
class { foo: hoge => “bar” }
(*3) 次のようなシンタックスが追加される、個人的にはちょっと複雑な文法なので使いこなせなさそうです
notify { b: } -> notify { a: } -> notify { c: }
Notify[b] ~> Notify[a] ~-> Notify[c]
(*4) ハッシュ、Ruby のハッシュっぽく記述することができる、これは重宝しそうです
class foo {
$data = {}
$data[one] = 1
$data[one] = 2
file { “/tmp/hoge”: content => template(“foo/tmp/hoge”), }
Puppet Forge については、改めて別の機会に紹介したいと思います。
次の話は、Puppet を組み込む方法について。これは省略します。
その次の話は、Puppet を使って複数のデータセンターを構築する方法の話。OS は、RHEL でしたが、その中で kickstart の pre セクションで、MAC アドレスを登録する次のスクリプトは、なるほどと思いました。
%pre
SERVER=`grep ‘url address’ /tmp/anaconda.log | awk ‘{print $6}’`
cd /tmp && wget -q http://${SERVER}/pub/dmidecode
chmod +x /tmp/dmidecode
SN=`dmidecode | grep “Serial Number” | head -1 | awk ‘{print $3}’`
MAC=`ifconfig | grep HWaddr | awk ‘{print $5}’`
wget -q http://${SERVER}/cgi-bin/register.pl?mac=$MAC\&sn=$SN
reboot
上のスクリプトでは、MAC アドレスと dmidecode をしたマシンのシリアル番号を register.pl へ送っています。
僕は、いままでマシンの BIOS などで MAC アドレスを確認していましたが、この方法を応用すれば自動化できる可能性が出てきました、さっそく挑戦してみたいと思います!
その次の話では、Puppet モジュールの標準的な書き方について、いくつか参考になる話があったのでまとめておきます。
include するときのポイント。次のように使い分けると分かりやすい。
- include postfix – Postfix サービスをインストールして実行する
- include postfix::disable – Postfix をインストールするがサービスは実行しない
- include samba::server – Samba サーバをインストールする
- include samba::client – Samba クライアントをインストールする
import と include の違いは、Puppet の中で重要なので押さえておきたいところです。次のような違いがあります。
- import autofs – $modulepath/autofs/manifests/init.pp を読み込む
- include autofs::server – $modulepath/autofs/manifests/server.pp を読み込む
puppetdoc コマンドを使うと、コメントが含まれているマニフェストからドキュメントを生成することができる。例えば、次のようなマニフェストを書く。
# Class: apache
#
# このモジュールは Apache を管理します
#
# Parameters:
#
# Actions:
#
# Requires:
#
# Sample Usage:
#
# [注意: コメントとクラス定義の間には空行を入れないこと]
class apache {
...
}
最後の二つの講演は、特に参考になる情報はありませんでしたが、Puppet キャンプ楽しそうです!