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
Author: m33lky, 2011-12-16

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.

 68
Author: jtimberman,
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