web-dev-qa-db-ja.com

シェフがソースからプログラムをインストールおよび更新する

ソースからビルドしたプログラムがあります。このため、scriptリソースを使用しています。インストールと更新のロジックを実装する良い方法は何ですか?現在、組み込みのnot_if条件付き。

script "install_program" do
  not_if {File.exists?('/program')}
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program.tar.gz
    tar -zxf program.tar.gz
    cd tarball
    ./configure
    make
    make install
  EOH
end
35
m33lky

まず第一に、内部パッケージリポジトリをホストする手段がある場合は、通常、ターゲットプラットフォーム用のネイティブパッケージをビルドし、packageリソースを使用してそれらを管理することをお勧めします。ソース。それが常に利用可能または実現可能であるとは限らないので、...

「./configure && make && make install」スタイルのインストールスクリプトをべき等にする方法は、使用しているソフトウェアの種類によって異なります。ほとんどの場合、ターゲットファイルの存在を確認するだけで十分です。必要なバージョンと、適切なコマンドラインオプションを使用してプログラムを実行したときにプログラムが出力するバージョンを確認することが望ましい場合があります。これらの例の出発点として、上記のリソースを使用します。インタープリターbashがあるscriptリソースのショートカットとしてbashを使用できることに注意してください。

前提条件:プログラムは/usr/local/bin/programにインストールされており、バージョン番号を表示するために、おそらく--versionを引数に取ります。 cd、configure、makeコマンドを&&と一緒に配置します。おそらく失敗した場合、実行を継続しようとするべきではないためです。

bash "install_program" do
  not_if "/usr/local/bin/program --version | grep -q '#{node[:program][:version]}'"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
end

wgetを使用する代わりに、remote_fileリソースを使用することをお勧めします。これはそれ自体がべき等であるためです。 checksumパラメータが追加され、値が属性として含まれていることに注意してください。このパラメーターは、ローカルターゲットファイルがチェックサムと一致する場合、リモートファイルをダウンロードしないようChefに指示します。これはSHA256チェックサムです。また、このリソースはスクリプトがすぐに実行されるように通知するため、ダウンロード後も実行されます。スクリプトはアクション:nothingで設定されているため、remote_fileがダウンロードされた場合にのみ実行されます。

remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do
  source "http://www.example.com/program-#{node[:program][:version]}.tar.gz"
  checksum node[:program][:checksum]
  notifies :run, "bash[install_program]", :immediately
end

bash "install_program" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
  action :nothing
end

また、/tmpはシステムを再起動すると消去される場合があります。 Chef::Config[:file_cache_path]の値であるChefのファイルキャッシュの場所など、削除されない別の場所にダウンロードすることをお勧めします。例えば:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
  ...
end

さらなる例については、Opscodeが共有するいくつかのクックブックの「ソース」レシピをここで見ることができます: http://github.com/opscode/cookbooksphppythongnu_parallel、およびnagiosクックブックにはすべて「ソース」レシピがあります。

68
jtimberman