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".
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
Podoba mi się ta odpowiedź: – Galen
@jtimberman, czy mógłbyś wyjaśnić więcej, skąd z 'programu' i' wersja' zmienna są ustawione na –