In primo luogo, se si hanno i mezzi per ospitare un repository di pacchetti interna, io in genere consigliamo di creare pacchetti nativi per la piattaforma di destinazione (s), e utilizzare la risorsa package
per la loro gestione, piuttosto che costruendo dalla fonte. So che non è sempre disponibile o fattibile, quindi ...
Il metodo che si effettua una "./configure & & fare & & make install" script di installazione stile idempotente dipende dal tipo di software che si sta lavorando con. Molto spesso, è sufficiente verificare l'esistenza del file di destinazione. A volte, è preferibile determinare quale versione è richiesta e quale versione verrà emessa dal programma quando viene eseguita con l'opzione della riga di comando corretta. Userò la tua risorsa sopra come punto di partenza per questi esempi. Si noti che è possibile utilizzare bash
come collegamento per le risorse script
con interprete bash
.
Presupposti: il programma è installato su /usr/local/bin/program
e prende un argomento --version
presumibilmente per visualizzare il numero di versione. Metto il cd, configuro e faccio comandi insieme a &&
perché presumibilmente se uno fallisce, non dovremmo tentare di continuare l'esecuzione.
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
Invece di usare wget
è un po 'meglio usare la risorsa remote_file
come questo è idempotente da solo. Si noti che il parametro checksum
viene aggiunto, con il valore come attributo. Questo parametro indica a Chef di non scaricare il file remoto se il file di destinazione locale corrisponde al checksum. Questo è un checksum SHA256. Inoltre, questa risorsa notificherà lo script per l'esecuzione immediata, quindi dopo il download. Lo script è impostato con l'azione :nothing
in modo che venga eseguito solo se il file_remoto viene scaricato.
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
Inoltre, /tmp
possono essere cancellati nel sistema al riavvio. Si consiglia di scaricare in un'altra posizione che non è stata cancellata, come ad esempio la posizione della cache dei file di Chef, che è il valore di Chef::Config[:file_cache_path]
. Per esempio:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
Per ulteriori esempi, si può vedere "sorgente" ricette in diversi libri di cucina condivisi da Opscode qui: http://github.com/opscode/cookbooks. php
, python
, gnu_parallel
e nagios
tutti i libri di cucina contengono ricette "di origine".
NOTA: Un bug con '' remote_file'' può talvolta '' ungzip'' un file con un'estensione '' .gz'', come '' tar.gz''. Quindi '' tar -zxf'' fallirà perché non è realmente un gzip. – Evgeny
Mi piace questa risposta – Galen
@jtimberman potrebbe spiegarmi di più, da dove sono impostate le variabili 'program' e' version' –