LoginSignup
64
64

More than 5 years have passed since last update.

ChefでSourceから何かをインストールするCookbookのウォークスルー

Last updated at Posted at 2013-04-30

この記事は最終更新から1年以上経過しています。 気をつけてね。

Chefのレシピでソースから何かをmakeしてinstallをするやり方は、個人によってまちまちかと思います。

私はこんな感じでやっています。

概要

Joyent SmartOSにirdサーバデーモンのngircdをインストールして、サービスとして起動します。

このCookbookはGithubに公開しています。 higanworks-cookbooks/ngircd_smartos(v0.1.1)

追記:続編できました! [LWRPによる]続・ChefでSourceから何かをインストールするCookbookのウォークスルー

レシピのざっくり解説

  1. ローカルに目的のファイルが無かったら取ってくる
  2. ファイルを取ってきたらmake & install、ローカルがあれば何もしない
  3. サービス登録
  4. サービススタート

attributes

attributes/default.rb
## base settings
default['ngircd']['conf_dir'] = '/opt/local/etc'
default['ngircd']['conf_motd'] = '/opt/local/etc'


## repository
default['ngircd']['site_url'] = 'http://ngircd.barton.de/pub/ngircd/'
default['ngircd']['arch_file'] = 'ngircd-20.2.tar.gz'

## for tempolary working
default['ngircd']['working_dir'] = ::File.join(Chef::Config[:file_cache_path], 'ngircd')
default['ngircd']['configure_flags'] = ' --prefix=/opt/local --with-openssl'

attributes には環境によって変更するかも、という要素を置いています。
ローカルのファイルチェックには、file_cache_pathを使うようにしているので、 Chef::Config[:file_cache_path]はサーバインスタンスのリブートで中身が消えないパスにしておくとよいです。

recipes

リソースごとに注釈をいれてみます。

recipes/default.rb
directory node['ngircd']['working_dir'] do
  action :create
end

bash 'make and install ngircd' do
  action :nothing
  flags '-ex'
  cwd node['ngircd']['working_dir']
  code <<-EOH
tar xzf #{node['ngircd']['arch_file']}
cd #{::File.basename(node['ngircd']['arch_file'], '.tar.gz')}
./configure #{node['ngircd']['configure_flags']}
make -j2
make install
EOH
end

remote_file ::File.join(node['ngircd']['working_dir'], node['ngircd']['arch_file']) do
  action :create_if_missing
  source node['ngircd']['site_url'] + node['ngircd']['arch_file']
  notifies :run, 'bash[make and install ngircd]', :immediately
end

smf 'ngircd' do
  start_command '/opt/local/sbin/ngircd'
  start_timeout 120
  stop_command '/usr/bin/pkill ngircd'
  stop_timeout 120
end

service 'ngircd' do
  action :enable
end

directory node['ngircd']['working_dir']

file_cache_pathの下にngircdというディレクトリを作って、ngircd関係はそこにまとめるようにしています。数が増えてくるとよごれるので。

bash 'make and install ngircd'

毎回走らないようにaction :nothingです。
ヨソからnotifiesで呼ばれるために定義しています。

flags-eを含めるとbash -eとなり、途中のコマンドがexit_status ≠ 0の場合止まってもらいます。

codeは普通のスクリプトです。

remote_file ::File.join(node['ngircd']['working_dir'], node['ngircd']['arch_file'])

action :create_if_missingでローカルにファイルがあったら何もしないという選択を指定してます。
ただ:createの指定だと、remote_fileは毎回取ってきてsha比較などをしますがそこまでのものでもないので。

このリソースにアップデートがあったら(※ファイルを実際に取ってきた)、一つ前のbash[make and install ngircd]に対しrunアクションを通知します、:immediatelyとしているのでファイル作成直後に実行されます。

:immediatelyを省略したら実行は後回しにされます、後にservice['ngircd']リソースがあり、ngirc本体のインストールを完了させるためbashを即時実行しておく必要があります。

smf 'ngircd'

これはsmartos用のサービス登録リソースです、svcadmngircdを操作出来るようにしています。

service 'ngircd'

サービスをスタートします、bashの実行が終わってなければ当然failします。

おわりに

ということでソースから何かを入れるレシピ、私のやり方を紹介してみました。

もっと良い感じのやり方や、こんな時はどうやってるの?という事に興味があればコメント等にて分かる範囲で答えます。

追記:続編できました! [LWRPによる]続・ChefでSourceから何かをインストールするCookbookのウォークスルー

64
64
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
64