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

第11回 Puppet 関連ツールの紹介(PRM)

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

PRMとは?

PRMとは,目的別のPuppetデータファイル(これをレシピと呼びます)をリモートのリポジトリから自サイトへダウンロード/アップデートしたり,ローカルリポジトリ上で管理を行うためのツールで,yumやaptといったパッケージ管理システムのPuppetレシピに特化したもの,と捉えることができます。

現在のところレシピが充実しているわけでもなく,ソースコードを一部修正しないと動作しない機能があるなど,まだツールとしては不完全ですが,大変面白い試みだと思いますので,今回ご紹介したいと思います。

PRMのアーキテクチャ

PRMのアーキテクチャを簡単な図にしてみると以下のようになります。

PRMのアーキテクチャ

PRMのアーキテクチャ

リモートとローカルのリポジトリには,Mercurialという分散バージョン管理システムを利用しています。

prmコマンドを利用して,リモートリポジトリ上にあるレシピをダウンロードしたり,リモートリポジトリ上でアップデートされたレシピをローカルリポジトリに反映します。

また,分散バージョン管理システムを利用しているため,手元で修正したレシピをローカルリポジトリにコミットしたり,タグづけしたりと,ローカルリポジトリ上でレシピのバージョン管理を行うことができます。

PRMのインストール

PRMのソースコードはMercurialリポジトリでのみ公開されていますので,PRMを取得するためにはMercurialが必要になります。RedHat系Linuxであれば,python-develパッケージとmercurialパッケージが必要となり,以下のようにインストールします。

$ sudo yum install python-devel
$ sudo yum install mercurial

他のディストリビューションやOSでも,同様のパッケージを入手/インストールしてください。PRMのインストール手順は,どのOSでも共通で,以下のように実行します。

$ hg clone http://hg.et.redhat.com/hg/emd/applications/prm/
$ cd prm
$ sudo python setup.py install

これで prm コマンドが利用できるようになります。

prmコマンドの使い方

設定ファイル

PRMの設定ファイルはデフォルトで/etc/prm.confです(設定ファイルが存在しなくても動作します)。prmコマンドの--configオプションで別のファイルを指定することもできます。prm.confの内容と各パラメータのデフォルト値は以下のようになっています。

[main]
repoPath     = /var/lib/puppet/recipes
manifestPath = /etc/puppet/manifests/prm
configPath   = /var/lib/puppet/config

repoPathはローカルリポジトリとして利用するディレクトリを指定します。manifestPathはレシピに含まれるマニフェストを置く場所を指定します。configPathはレシピに含まれる,Puppetクライアントへ配布するためのファイルを置く場所を指定します。

コードの修正

そのままでは動かない機能があるため,/usr/lib/python2.5/site-packages/prm/prm_repo.pyと/usr/lib/python2.5/site-packages/prm/prm_scm.pyを修正する必要があります。以下がその差分です。

diff -r 9a58e277cd5d prm_repo.py
--- a/prm_repo.py       Mon Feb 04 06:34:46 2008 +0900
+++ b/prm_repo.py       Mon Feb 04 06:35:42 2008 +0900
@@ -115,7 +115,7 @@ class Repo:

         # er, we should let the user pass in a commit message...
         commitMessage = "Automatic commit by prm commit"
-        buf = self.scm.commit(None, commitMessage)
+        buf = self.scm.commit(commitMessage)
         print buf

     def deployManifests(self):
diff -r 9a58e277cd5d prm_scm.py
--- a/prm_scm.py        Mon Feb 04 06:34:46 2008 +0900
+++ b/prm_scm.py        Mon Feb 04 06:35:42 2008 +0900
@@ -106,30 +106,26 @@ class Mercurial(SCM):


     def commit(self, message=None):
-       os.chdir(self.localPath)
        cmdstring = "hg commit -m \"%s\"" % message
        buf = self._popenAndRead(cmdstring)
        return buf

     def tag(self, tagname):
-       os.chdir(self.localPath)
        cmdstring = "hg tag %s" % tagname
        buf = self._popenAndRead(cmdstring)
        return buf

     def pull(self):
-       os.chdir(self.localPath)
        cmdstring = "hg pull"
        buf = self._popenAndRead(cmdstring)
        return buf

     def update(self, revision=None):
        self.pull()
-       os.chdir(self.localPath)
        revstr = ""
        if revision:
-           revstr = " %s" % revision
-       cmdstring = "hg update -m %s" % (revstr)
+           revstr = "-r %s" % revision
+       cmdstring = "hg update %s" % (revstr)
        buf = self._popenAndRead(cmdstring)
        return buf

著者プロフィール

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

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

URLhttp://mizzy.org/

コメント

コメントの記入