2011-12-16 10 views
35

Mam program, który buduję ze źródła. Do tego używam zasobu script. Jaki jest dobry sposób wdrożenia logiki instalacji i aktualizacji? Właśnie teraz mam zainstalowaną instalację z wbudowanym warunkowym not_if.szef instalacji i aktualizacji programów ze źródła

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 

Odpowiedz

67

Przede wszystkim, jeśli masz środki do organizacji wewnętrznego repozytorium pakietów, ja generalnie zaleca się zbudować rodzimych pakietów dla danej platformy (ów) docelowego i użyć zasobu package do zarządzania nimi, zamiast budowanie ze źródła. Wiem, że nie zawsze jest dostępny lub wykonalne, więc ...

Metoda którą zrobić „./configure & & zrobić & & make install” skrypt instalacyjny styl idempotent zależy od rodzaju oprogramowania pracujesz z. Najczęściej wystarczy sprawdzić, czy plik docelowy istnieje. Czasami pożądane jest określenie, jaka wersja jest wymagana, i która wersja zostanie wygenerowana przez program po uruchomieniu z odpowiednią opcją wiersza polecenia. Wykorzystam powyższy zasób jako punkt wyjścia dla tych przykładów. Zauważ, że możesz użyć bash jako skrótu dla zasobów script, które mają interpreter bash.

Założenia: Program instalowany jest pod numerem /usr/local/bin/program i przyjmuje argument --version, prawdopodobnie w celu wyświetlenia numeru wersji. Umieszczam cd, konfiguruję i wykonuję komendy razem z &&, ponieważ prawdopodobnie jeśli się 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 wget jest nieco lepiej korzystać z zasobów remote_file jak to idempotent na własną rękę. Zwróć uwagę, że parametr checksum jest dodawany, a jego wartość jest atrybutem. Ten parametr mówi Chefowi, aby nie pobierał pliku zdalnego, jeśli lokalny plik docelowy jest zgodny z sumą kontrolną. To jest suma kontrolna SHA256. Ponadto ten zasób powiadomi skrypt, aby działał od razu, więc po pobraniu. Skrypt jest ustawiony za pomocą działania :nothing, więc zostanie wykonany dopiero po pobraniu pliku remote.

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ą być usunięte w systemie po restarcie. Zaleca się, aby pobrać do innej lokalizacji, która nie została usunięta, na przykład do lokalizacji pamięci podręcznej plików Chef, 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 

do dalszych przykładach widać „źródło” recepty w kilku książek kucharskich udostępnionych przez Opscode tutaj: http://github.com/opscode/cookbooks. php, python, gnu_parallel i nagios książki kucharskie wszystkie mają receptury "źródłowe".

+0

UWAGA: Błąd z '' remote_file'' może czasami zawierać plik '' zngzip'' z rozszerzeniem '' .gz'', np. '' Tar.gz''. Tak więc '' tar -zxf'' zakończy się niepowodzeniem, ponieważ nie jest tak naprawdę gzipem. – Evgeny

+1

Podoba mi się ta odpowiedź: – Galen

+0

@jtimberman, czy mógłbyś wyjaśnić więcej, skąd z 'programu' i' wersja' zmienna są ustawione na –

Powiązane problemy