PRMとは?
PRMとは、目的別のPuppetデータファイル(これをレシピと呼びます)をリモートのリポジトリから自サイトへダウンロード/アップデートしたり、ローカルリポジトリ上で管理を行うためのツールで、yumやaptといったパッケージ管理システムのPuppetレシピに特化したもの、と捉えることができます。
現在のところレシピが充実しているわけでもなく、ソースコードを一部修正しないと動作しない機能があるなど、まだツールとしては不完全ですが、大変面白い試みだと思いますので、今回ご紹介したいと思います。
PRMのアーキテクチャ
PRMのアーキテクチャを簡単な図にしてみると以下のようになります。
リモートとローカルのリポジトリには、Mercurialという分散バージョン管理システムを利用しています。
prmコマンドを利用して、リモートリポジトリ上にあるレシピをダウンロードしたり、リモートリポジトリ上でアップデートされたレシピをローカルリポジトリに反映します。
また、分散バージョン管理システムを利用しているため、手元で修正したレシピをローカルリポジトリにコミットしたり、タグづけしたりと、ローカルリポジトリ上でレシピのバージョン管理を行うことができます。
PRMのインストール
PRMのソースコードはMercurialリポジトリでのみ公開されていますので、PRMを取得するためにはMercurialが必要になります。RedHat系Linuxであれば、python-develパッケージとmercurialパッケージが必要となり、以下のようにインストールします。
他のディストリビューションやOSでも、同様のパッケージを入手/インストールしてください。PRMのインストール手順は、どのOSでも共通で、以下のように実行します。
これで prm コマンドが利用できるようになります。
prmコマンドの使い方
設定ファイル
PRMの設定ファイルはデフォルトで/etc/prm.confです(設定ファイルが存在しなくても動作します)。prmコマンドの--configオプションで別のファイルを指定することもできます。prm.confの内容と各パラメータのデフォルト値は以下のようになっています。
repoPathはローカルリポジトリとして利用するディレクトリを指定します。manifestPathはレシピに含まれるマニフェストを置く場所を指定します。configPathはレシピに含まれる、Puppetクライアントへ配布するためのファイルを置く場所を指定します。
コードの修正
そのままでは動かない機能があるため、/usr/lib/python2.5/site-packages/prm/prm_repo.pyと/usr/lib/python2.5/site-packages/prm/prm_scm.pyを修正する必要があります。以下がその差分です。
レシピのダウンロード
レシピのサンプルとして、fedora-yumとhttpd-selinux-userdirがあります。レシピをダウンロードするには、prm getでリポジトリURLを指定します。
/var/lib/puppet/recipes/fedora-yumにレシピが保存され、/etc/puppet/manifests/prm/fedora-yum にマニフェストのコピー、/var/lib/puppet/config/fedora-yum にレシピ全体のコピーが置かれます。
レシピのアップデート
リモートリポジトリ上のアップデートをローカルに反映させるためには、以下のようにprm updateを実行します。
レシピのコミット
ローカルにあるレシピを修正して、ローカルリポジトリにコミットすることにより、ローカルでレシピのバージョン管理を行うことができます。
ローカルでレシピを修正する場合には、マニフェストは/etc/puppet/manifest/prm以下にあるものを、それ以外のファイルは/var/lib/puppet/configにあるものを修正します(/var/lib/puppet/recipes以下にあるファイルを修正してはいけません)。
修正したレシピをコミットするには、以下のようにprm commitを実行します。
レシピのタグづけ
レシピにタグづけするためには、prm tagを実行します。
レシピの一覧
ローカルにあるレシピの一覧を表示するには、prm listを実行します。
prm listではrecipe.xml(後述)のlabelで指定されたものが表示されます。
PRMレシピの作成
PRMレシピを作成して配布する場合には、以下のような構成でファイルを作成して、Mercurialリポジトリに追加します。
recipe.xmlの内容は以下のようになります。
labelでレシピの名前を指定し、descriptionでレシピの概要を記述します。dependenciesのrequireには、このレシピが依存する他のレシピのリポジトリURLを指定します。
PRMは一年以上アップデートされていないようですし、ドキュメントもほとんどなく、今後開発が継続されるかわかりませんが、Puppet本の発売によってPuppet利用者の裾野が広がれば、PRMのようなツールの必要性が見直されるかもしれません。
次回はCftというPuppet関連ツールをご紹介します。