[和訳] Omnibus-ctl: これは何? 何をしてくれるの? #getchef
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Omnibus-ctl: What is it and what can it do for you? (2015/05/26) の和訳です。
Chef Omnibusを使ってソフトウェアをビルドしていますか? そのパッケージは複数のrunitサービスを実行する必要がありますか? そんなときはOmnibus-ctlはいかがでしょう?
Omnibus-ctlは、Chef Omnibusパッケージ内で一般的なコマンドを実行するのに大変便利なツールです。
Chef Omnibusって何?
Chef Omnibusはさまざまなプラットフォームに対応したプロジェクト向けの、フルスタックのインストーラを簡単に作成するための方法です。フルスタックのインストーラは、目的のアプリケーションをインストールして設定するために必要なすべてを含みます。
より詳しくは、Seth ChisamoreとChristopher MaierによるEat the Whole Bowl: Building a Full-Stack Installer with Omnibusをご覧ください。こちらにスライドもあります。
Omnibus-ctlって何?
Omnibus-ctlは、例えばomnibus-supermarketような、Omnibusパッケージで設定されるサーバを動作させるための各種サービスコマンドに対するラッパーです。これらのコマンドは一般的なrunitサービスへの問い合わせやChefコマンドの実行に広く用いられています。
Omnibus-ctlのインストール
Omnibus-ctlは通常、omnibus-softwareレポジトリを通してビルドされています。プロジェクトのGemfileでomnibus-software gemを要求することで、独自のomnibusプロジェクトで利用することができます。omnibus-supermarketプロジェクトではこのように使っているので、確認してみてください。
OmnibusプロジェクトにOmnibus-ctlを含める手順は次の通りです。
1) OmnibusプロジェクトのGemfileにomnibus-softwareを含めます。
2) Omnibusプロジェクト内に、config/software/#{project_name}-ctl.rbというファイルを作成します。
3) 作成したファイルの中に、依存関係としてomnibus-ctlを並べます。omnibus-ctlはomnibus-softwareの一部として提供されているのですが、依存関係として追加しておく必要があります。
config/software/#{project_name}-ctl.rb
dependency "omnibus-ctl"
4) ビルドブロック内で、#{install_dir}/bin/#{project.name}のような名前のファイルを設定します。ここで、SVWAIT (コマンドが効果を発揮するまで待つ時間、デフォルト 7秒)を定義し、Ruby環境の取り扱い方を追加し、最後にプロジェクト名と追加コマンドへのパスといったプロジェクト特有の引数をつけて基本となるomnibus-ctlコマンドを呼び出し、そしてユーザが与えたあらゆる引数 ($@) を渡します。実際にどうなっているかはomnibus-supermarketを見てみてください。
install_directory/bin/supermarket-ctlで定義したファイルをテンプレートと呼んでいることに注意してください。
omnibus-supermarket/config/software/supermarket-ctl.rb
WordPressではこのコードの表示に問題があるので、Githubで見てください。
これがRuby環境の取り扱い方、SVWAITなどを定義したテンプレートです。
config/templates/supermarket-ctl/supermarket-ctl.erb
WordPressではこのコードの表示に問題があるので、Githubで見てください。
このファイルによって、supermarket-omnibusパッケージをインストールしたら、サーバ内のすべてのサービスを再起動するための「supermarket-ctl restart」のようなコマンドを実行できるようになります。
Omnibus-ctlの利用
Omnibus-ctlをomnibusパッケージに含めてインストールすると、いろいろなコマンドを思うがままに使うことができます。
次のようなコマンドがあります。
General Commands:
cleanse
Delete all supermarket data, and start from scratch.
help
Print this help message.
reconfigure
Reconfigure the application.
show-config
Show the configuration that would be generated by reconfigure.
uninstall
Kill all processes and uninstall the process supervisor (data will be preserved).
Service Management Commands:
graceful-kill
Attempt a graceful stop, then SIGKILL the entire process group.
hup
Send the services a HUP.
int
Send the services an INT.
kill
Send the services a KILL.
once
Start the services if they are down. Do not restart them if they stop.
restart
Stop the services if they are running, then start them again.
service-list
List all the services (enabled services appear with a *.)
start
Start services if they are down, and restart them if they stop.
status
Show the status of all the services.
stop
Stop the services, and do not restart them.
tail
Watch the service logs of all enabled services.
term
Send the services a TERM.
これらのコマンドは#{project.name}-ctlを前置して呼び出せます。例えば、omnibus-supermarketパッケージをインストールしたサーバで再起動コマンドを実行するには、次のようにします。
$ supermarket-ctl restart
Omnibus-ctlの拡張
含まれているコマンドに加えて、独自のctlコマンドを書いて含めることができます。
軽量DSLを用いて独自のctlサブコマンドを作成します。
Chef ServerのinstallコマンドやOmnibus Supermarketのtestコマンドがよい例です。
一般的に、独自のOmnibusパッケージ中のChef Recipeに独自コマンドのテンプレートを含めます。Chef Recipeはこのテンプレートを使って指定のディレクトリにファイルを配置します。Omnibus Supermarketにある行がよい例です。
config/software/supermarket-ctl.rb
WordPressではこのコードの表示に問題があるので、Githubで見てください。
Omnibus Supermarketでは、あらゆる独自コマンドがomnibus-supermarket/cookbooks/omnibus-supermarket/files/default/ctl-commandsに収められています。Chef Recipeは、omnibus-supermarket/cookbooks/omnibus-supermarket/files/default/ctl-commands/test.rbのようなテンプレートを使ってファイルを作成し、コマンドラインから利用できるようにinstall_directory/embedded/service/omnibus-ctl/ディレクトリに同期します。
以上がomnibus-ctlの紹介となります。それでは使ってみましょう!