2011-12-16 8 views
35

Ho un programma che costruisco dal sorgente. Per questo sto usando la risorsa script. Qual è un buon modo per implementare la logica per l'installazione e l'aggiornamento? In questo momento ho appena installato l'installazione con il condizionale integrato not_if.chef installa e aggiorna i programmi dalla sorgente

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 

risposta

67

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".

+0

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

+1

Mi piace questa risposta – Galen

+0

@jtimberman potrebbe spiegarmi di più, da dove sono impostate le variabili 'program' e' version' –

Problemi correlati