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

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

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

レシピのダウンロード

レシピのサンプルとして、fedora-yumhttpd-selinux-userdirがあります。レシピをダウンロードするには、prm getでリポジトリURLを指定します。

$ sudo prm get http://hg.et.redhat.com/hg/emd/recipes/fedora-yum

/var/lib/puppet/recipes/fedora-yumにレシピが保存され、/etc/puppet/manifests/prm/fedora-yum にマニフェストのコピー、/var/lib/puppet/config/fedora-yum にレシピ全体のコピーが置かれます。

レシピのアップデート

リモートリポジトリ上のアップデートをローカルに反映させるためには、以下のようにprm updateを実行します。

$ sudo prm update fedora-yum

レシピのコミット

ローカルにあるレシピを修正して、ローカルリポジトリにコミットすることにより、ローカルでレシピのバージョン管理を行うことができます。

ローカルでレシピを修正する場合には、マニフェストは/etc/puppet/manifest/prm以下にあるものを、それ以外のファイルは/var/lib/puppet/configにあるものを修正します(/var/lib/puppet/recipes以下にあるファイルを修正してはいけません⁠⁠。

修正したレシピをコミットするには、以下のようにprm commitを実行します。

$ sudo prm commit fedora-yum

レシピのタグづけ

レシピにタグづけするためには、prm tagを実行します。

$ sudo prm tag -r REL-20080204 fedora-yum

レシピの一覧

ローカルにあるレシピの一覧を表示するには、prm listを実行します。

$ prm list
Standard yum repo configurations for Fedora machines


Enable httpd userdirs on machines running SELinux enforcing

prm listではrecipe.xml(後述)のlabelで指定されたものが表示されます。

PRMレシピの作成

PRMレシピを作成して配布する場合には、以下のような構成でファイルを作成して、Mercurialリポジトリに追加します。

files/     (Puppetクライアントへの配布用ファイル)
manifests/ (マニフェスト)
README     (レシピの説明)
recipe.xml

recipe.xmlの内容は以下のようになります。

<recipe xmlns="http://redhat.com/prm/1.0" name="URL" version="1.0">
  <label>short human-readable freeform label</label>
  <description>freeform text explaining what this recipe does</description>
  <dependencies>
    <require recipe="URL1"/>
    <require recipe="URL2"/>
  </dependencies>
</recipe>

labelでレシピの名前を指定し、descriptionでレシピの概要を記述します。dependenciesのrequireには、このレシピが依存する他のレシピのリポジトリURLを指定します。

PRMは一年以上アップデートされていないようですし、ドキュメントもほとんどなく、今後開発が継続されるかわかりませんが、Puppet本の発売によってPuppet利用者の裾野が広がれば、PRMのようなツールの必要性が見直されるかもしれません。

次回はCftというPuppet関連ツールをご紹介します。

おすすめ記事

記事・ニュース一覧