読者です 読者をやめる 読者になる 読者になる

オープンソースこねこね

Webプログラミングなどについてあれこれ。

CentOS用にSupervisor3.3.0のRPMパッケージを作成した

Pythonも同封した、他パッケージへの依存がないsupervisorのRPMパッケージをOmnibusで作成してみました。

github.com

背景

CentOSの各バージョン(5, 6, 7)でSupervisorを使いたい、のだが。。。

CentOSではepelのyumリポジトリからsupervisorのRPMパッケージが提供されているというので、調べてみたのですが、CentOS5と6だとかなりバージョンが古い。提供されているのはバージョン2.xで、今の最新は3.3.0。かといってpythonのpipを使って最新をシステムワイドのpythonパッケージとしてインストールするのはイヤだなあと。

システムへのソフトウェアインストールはyumrpmなどのプラットフォーム標準のパッケージ管理システムをなるべく使うというポリシーです。特にデーモンなどは、実用するならinitスクリプトやlogrotateの設定も合わせてインストールしなければならないし。

またSupervisorを動かすのにpythonが必要なのですが、これのバージョンがCentOS5,6,7それぞれ違っていて、しかもCentOS5はpython2.4。古!

要するに古いCentOSの運用はつらい。

とにかく、CentOS5,6,7の環境で同じバージョン(最新のバージョン)のSupervisorを動かしたい。そこでOmnibusです。

Omnibus

github.com

chef社が提供している、依存物をまるごと同封したパッケージをクロスプラットフォームで作ってくれるツールです。

これを利用しているソフトウェアは、有名ドコロだとchefやtd-agentなど。これらのソフトウェアはRubyで書かれているのですが、OmnibusでRubyのランタイムを同封したパッケージを作って、ユーザに提供しています。このためユーザは別途Rubyをインストールする必要がなく、複数のパッケージによる管理の複雑さや依存性の問題を気にする必要がなくなります。余談ですが、これでパッケージングされたchef-soloが提供された時、劇的にインストールが簡単になって大変便利になったと記憶しています。

さて、Omnibusの利用方法は公式リポジトリのREADMEと、td-agentなどの利用例を参考にすればいいと思います。というか、私自身がそのようにして作業してました。個人的に特に参考にさせていただいたリポジトリは以下。

Omnibusではソフトウェアコンポーネントという単位で、パッケージングするソフトウェアの情報を定義するのですが、幸いなことにGithubで検索すると、先人の方々がpythonのそれを作っていて、そのへんも参考にさせていただきました。また公式に主要なソフトウェアコンポーネントの設定が公開、共有されていて、これも簡単に利用できるようになっています。

とはいえ、CentOS5はOS自体がやや古いのでOmnibusに必要なパッケージが直接ダウンロードできなかったりして、いろいろワークアラウンドをいれたりしてます。詳細は最初に記載した私のリポジトリのソースを見ていただければと思います。

本来はRPMだけでなくdebパッケージなども作成できるのですが、今回は自分が使うRPMのみを作成するように設定しました。

細かい調整など

supervisordを起動するinitスクリプトは当初epelのsrc.rpmを解凍して、中に入っていたものを使用していたのですが、reload処理がstopしてstartするというrestartと同じものになっており、これはイケてないな、と。 調べていたらユーザによるinitスクリプト集がsupervisorのリポジトリにあったので、こちらを参考に修正したものを使いました。

GitHub - Supervisor/initscripts: User-contributed OS init scripts for Supervisor

積み残し

Omnibusで作成したパッケージはデフォルトで/opt/{PACKAGE_NAME}ディレクトリ配下に全ての依存物もまとめてイントールされます。これはこれでいいのですが、initスクリプトなど、このディレクトリ以外の領域にファイルを配置する場合が悩ましく、現状postinstというパッケージインストール後に実行されるスクリプトの設定を使ってcpコマンドでコピーするという方式をとっています。

cp -f /opt/supervisor/etc/init.d/supervisord /etc/init.d/supervisord

他の参考にさせていただいたリポジトリも私が調べた限りでは、同様の手法で対応しているのですが、この方法だと少し問題があって、パッケージがインストールしたファイル一覧を見るコマンドrpm -qlの結果にコピーしたファイルが表示されないのです。

$ rpm -ql supervisor
/opt
/opt/supervisor
/opt/supervisor/LICENSE
/opt/supervisor/LICENSES
/opt/supervisor/LICENSES/bzip2-LICENSE
/opt/supervisor/LICENSES/cacerts-README
...
... (/etc/init.d/supervisord は出てこない。。。)

カスタムのspecファイルを書いたり、いろいろ試行錯誤してみましたがうまくいかず、ベストな方法は今のところわかっていません。 これについては実用上、明らかな問題にはならないので、現状、課題として積んでおいています。

成果物

作成したRPMファイルはgithubのreleasesページにアップロードしました。

https://github.com/kohkimakimoto/omnibus-supervisor/releases

これで、インストールはyumコマンド一発でできるし、外部に依存関係をもたないので、必要なくなったら他への影響を考えずにサクッとアンインストールもできるようになりました。CentOSのバージョンも5~7まで対応。ただしちょっとファイルサイズは大きいです。

インストールして動作させてみましたが、ひとまず問題はなさそうです。