ソースからビルドするプログラムがあります。そのためにリソースを使用しています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
ベストアンサー1
まず第一に、内部パッケージ リポジトリをホストする手段がある場合は、package
ソースからビルドするのではなく、ターゲット プラットフォーム用のネイティブ パッケージをビルドし、リソースを使用して管理することをお勧めします。これは常に利用できる、または実行可能であるとは限らないことは承知していますが、...
「./configure && make && make install」形式のインストール スクリプトをべき等にする方法は、使用しているソフトウェアの種類によって異なります。ほとんどの場合、ターゲット ファイルの存在を確認するだけで十分です。必要なバージョンと、適切なコマンド ライン オプションで実行したときにプログラムが出力するバージョンを決定することが望ましい場合もあります。上記のリソースをこれらの例の開始点として使用します。interpreter を持つリソースbash
のショートカットとしてを使用できることに注意してください。script
bash
前提: プログラムは にインストールされており、おそらくバージョン番号を表示するための/usr/local/bin/program
引数を取ります。cd、configure、および make コマンドを と一緒に配置したのは、おそらく 1 つでも失敗した場合は実行を続行しないはずだからです。--version
&&
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 のファイル キャッシュの場所など、削除されない別の場所にダウンロードすることをお勧めしますChef::Config[:file_cache_path]
。例:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
さらなる例として、Opscode が共有しているいくつかのクックブックの「ソース」レシピをここで参照できます。http://github.com/opscode/cookbooks、、、そして料理本にphp
はすべて「ソース」レシピがあります。python
gnu_parallel
nagios