PRMとは?
PRMとは,目的別のPuppetデータファイル(これをレシピと呼びます)をリモートのリポジトリから自サイトへダウンロード/アップデートしたり,ローカルリポジトリ上で管理を行うためのツールで,yumやaptといったパッケージ管理システムのPuppetレシピに特化したもの,と捉えることができます。
現在のところレシピが充実しているわけでもなく,ソースコードを一部修正しないと動作しない機能があるなど,まだツールとしては不完全ですが,大変面白い試みだと思いますので,今回ご紹介したいと思います。
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

