chef instaluje i aktualizuje programy ze źródła
Mam program, który buduję ze źródła. W tym celu używam zasobu script
. Jaki jest dobry sposób na implementację logiki instalacji i aktualizacji? W tej chwili mam tylko zaimplementowaną instalację z wbudowanym not_if
warunkowym.
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 answers
Po pierwsze i najważniejsze, jeśli masz środki do hostowania wewnętrznego repozytorium pakietów, generalnie zalecam tworzenie natywnych pakietów dla docelowej platformy(platform) i używanie zasobu package
do zarządzania nimi, zamiast budowania ze źródła. Wiem, że nie zawsze jest to dostępne lub wykonalne, więc ...
Metoda, którą robisz"./ configure & & make & & make install " skrypt instalacyjny w stylu idempotent zależy od rodzaju oprogramowania, z którym pracujesz. Najczęściej jest to wystarczające do sprawdzenia istnienia pliku docelowego. Czasami pożądane jest określenie, która wersja jest wymagana i którą wersję program wypowie po wykonaniu z odpowiednią opcją wiersza poleceń. Użyję twojego zasobu powyżej jako punktu wyjścia dla tych przykładów. Zauważ, że możesz użyć bash
jako skrótu dla script
zasobów, które mają interpreter bash
.
Założenia: program jest zainstalowany na /usr/local/bin/program
i pobiera argument --version
przypuszczalnie, aby wyświetlić wersję numer. Umieszczam płytę cd, konfiguruję i wykonuję komendy razem z &&
, ponieważ prawdopodobnie jeśli jedna zawiedzie, nie powinniśmy próbować kontynuować wykonywania.
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
Zamiast używać wget
lepiej jest użyć zasobu remote_file
, ponieważ jest on sam w sobie idempotentny. Zauważ, że dodano parametr checksum
, z wartością jako atrybutem. Parametr ten mówi Chef, aby nie pobierał pliku zdalnego, jeśli lokalny plik docelowy pasuje do sumy kontrolnej. To jest suma kontrolna SHA256. Ponadto ten zasób powiadomi skrypt do uruchomienia natychmiast, więc po jego pobraniu. Skrypt jest ustawiony za pomocą akcji :nothing
, więc zostanie wykonany tylko wtedy, gdy plik remote_file zostanie pobrany.
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
Również, /tmp
mogą zostać usunięte w systemie po ponownym uruchomieniu. Zaleca się pobieranie do innej lokalizacji, która nie jest usuwana, np. Chef ' s file cache location, która jest wartością Chef::Config[:file_cache_path]
. Na przykład:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
Dalsze przykłady można znaleźć w "źródłowych" przepisach w kilku książkach kucharskich udostępnionych przez Opscode tutaj: http://github.com/opscode/cookbooks. php
, python
, gnu_parallel
, i nagios
książki kucharskie mają" źródłowe " przepisy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 21:09:43