...
例えば、「あるアプリケーションのコマンドにパスを通したい」場合は、具体的にどのような方法でパスを通すかを決めておきます。
.bashrc に追記してもいいですし、/etc/profile.d/ にスクリプトを置いても実現可能ですが、それぞれ細かい条件が異なりますよね。
.bashrc に書く場合は、どのユーザーを対象とするかを決めなければいけませんし、既に .bashrc に記述されている内容を壊さないようにしないといけません。
/etc/profile.d/ にスクリプトを置く場合は、スクリプトファイル名を決めなければいけませんし、すべてのユーザーにパスを通して問題ないか確認が必要です。
今回は、/etc/profile.d/application.sh に「export PATH=$PATH:/opt/application/bin」という内容のファイルを置くことにします。
使えそうな Resource を探し、仕様を確認する
/etc/profile.d/ にスクリプトを置くとします。これはどの Resource を使えば実現できるでしょうか。
Chef のドキュメント [ http://docs.opscode.com/chef/resources.html ] を見て、使えそうな Resource を探しましょう。
Recipe を記述する
Recipe を書くにはまず、「具体的に何をしたいのか」を明らかにし、それに対し「どの Resource を使用するか」を決めなければなりません。
そうしてからようやく具体的なソースコードを記述できます。
たとえば、あるアプリケーションのコマンドにパスを通すために、「Chef 実践入門」や「Chef 活用ガイド」といった書籍を利用するのも手です。
/etc/profile.d/ application.sh に 「export PATH=$PATH:/opt/application/bin」 という内容のファイルを配置したいとします。
これはどの Resource を使えば実現できるでしょうか。
Chef のドキュメントを調べると、file Resource というのが見つかります。
これは、任意の内容のテキストファイルを任意のパスに配置する Resource のようです。
使えそうですね。
では、file Resource の詳細を確認しましょう。
Chef のドキュメント [ にスクリプトファイルを置く場合は、たとえば次のような手段があります。
- bash Resource で、「export PATH ~」という内容のテキストファイルを出力するスクリプトを実行する
- ruby_block Resource で、〃
- template Resource で、「export PATH ~」という内容のテキストファイルを配置する
- file Resource で、「export PATH ~」という内容のテキストファイルを配置する
各 Resource の詳細はドキュメントを参照して確認してください。
bash Resource や ruby_block Resource でも問題なく実現できますが、「もし既にファイルが存在していたら Resource の実行をスキップする」という処理を書くのが少々面倒です。
template Resource や file Resource には :create_if_missing という Action があり、対象のファイルが存在ないときにだけ Resource を実行させることができます。
template Resource は配置するファイルの内容を動的に制御する機能を備えていますが、 今回配置したいスクリプトファイルは完全に固定のものなので、そこまでの機能は不要です。
なので、file Resource を使うのが適しているでしょう。
Recipe を記述する
使用する Resource が決まったら、ドキュメントを確認しながら ./recipes/default.rb に Recipe を記述します。
default.rb はその Cookbook が標準的に実行する Recipe で、一般的なプログラミングでいうメインメソッドのようなものです。
file Resource のドキュメント [ http://docs.opscode.com/resource_file.html ] を参照すると、次のようなシンタックスになっていることが確認できます。
コード ブロック |
---|
file <配置先のファイルパス> do
content <配置するファイルの内容>
end |
充分に理解できたら、いよいよ具体的なソースコードを実装します。
...
を確認すると、name にファイルパスを、content Attribute にファイルの内容を指定することがわかりますので、
その仕様に従って Recipe を記述すればOKです。
コード ブロック | ||
---|---|---|
| ||
file “/etc/profile.d/application.sh” do
content “export PATH=$PATH:/opt/application/bin”
action :create_if_missing
end |
これで完成です。
このように Recipe を書くには、
具体的に何をしたいのかを明らかにする
使えそうな Resource を探し、仕様を確認する
Recipe を記述する
という手順を繰り返していきます。
お題: Jenkins の Cookbook をつくる
では、ここまでの話を踏まえて、実際に Cookbook を作ってみてください。
作成するのは Jenkins をインストールする Cookbook です。
Jenkins とは
手動でインストールするときの手順
Jenkins をインストールする Recipe をつくる
まずは、手動で Jenkins をインストールする場合の手順を確認します。
http://pkg.jenkins-ci.org/redhat/ から rpm をダウンロード
ダウンロードした rpm を yum コマンドでインストール
/etc/sysconfig/jenkins を編集して、実行ユーザーを変更
利用するディレクトリのオーナーを変更
サービスを登録・起動
これを Recipe にしてみましょう。
デフォルトの Recipe なので、chef generate cookbook で生成された recipes/default.rb を編集します。
ヒント
コマンドを実行する
ヒント: 主な Resource
コマンドを実行する
execute Resource [ http://docs.opscode.com/resource_execute.html ]
ファイルをダウンロードする
remote_file Resource [ http://docs.opscode.com/resource_remote_file.html ]
※ ダウンロードしたファイルなどは /tmp ではなく Chef::Config[:file_cache_path] に保存する
パッケージをインストールする
...
package Resource [ http://docs.opscode.com/resource_package.html ]
テキストファイルの内容を置換する
...
ruby_block Resource [ http://docs.opscode.com/resource_ruby_block.html ]
Chef::Util::FIleEdit [ http://rubydoc.info/gems/chef/Chef/Util/FileEdit ]
※ execute Resource で sed コマンドを実行してもよい
※ file Resource + lazy でもできるかな?
ファイルやディレクトリのオーナーを変更する
ruby_block Resource [ http://docs.opscode.com/resource_ruby_block.html ]
FileUtils#chown_R [ http://docs.ruby-lang.org/ja/1.9.3/method/FileUtils/m/chown_R.html ]
※ execute Resource で chown コマンドを実行してもよい
サービスを起動する / 自動的に起動するように登録する
service Resource [ http://docs.opscode.com/resource_service.html ]