2011-12-16 16 views
35

ソースからビルドしたプログラムがあります。このため私は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 

答えて

67

まず、あなたが内部のパッケージリポジトリをホストするための手段を持っている場合は何よりも、私は一般的に(s)はあなたがあなたのターゲットプラットフォームのネイティブパッケージをビルドすることをお勧めしますし、それらを管理するためにpackageリソースを使用するのではなく、ソースからのビルド。私は、スタイルインストールスクリプトの冪等は、あなたが作業しているソフトウェアの種類によって異なり、「& &は& &は、make installを作るに./configure」

あなたが作る方法...それは常に利用できるか、現実的ではありません知っているので、と。多くの場合、ターゲットファイルの存在を確認するだけで十分です。場合によっては、必要なバージョンと、適切なコマンドラインオプションで実行したときに出力されるバージョンを判断することが望ましい場合もあります。これらの例の出発点として上記のリソースを使用します。なお、bashは、bashのリソースscriptのショートカットとして使用できます。

前提条件:このプログラムは/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パラメータが追加されていることに注意してください。このパラメータは、ローカルターゲットファイルがチェックサムと一致する場合、シェフにリモートファイルをダウンロードしないように指示します。これは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]です。たとえば:http://github.com/opscode/cookbooks:更なる例については

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

、あなたはここでOpscodeが共有するいくつかの料理本で「ソース」のレシピを見ることができます。 phppythongnu_parallelnagios料理本にはすべて「ソース」レシピがあります。

+0

注記: '' remote_file''のバグは '' tar.gz''のように '' .gz''拡張子を持つファイルを '' ungzip''することができます。だから '' tar -zxf''は本当にgzipではないので失敗します。 – Evgeny

+1

私はこの答えが好きです – Galen

+0

@jtimbermanあなたは 'program'と' version'変数がどこに設定されているのかもっと説明してください。 –

関連する問題