2012-09-24 9 views
9

Esiste un modo per verificare che esista un file cookbook_file in una ricetta dello chef? Mi piacerebbe fare qualcosa di simile al seguente:Chef - Test per cookbook_file esistenza

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
end 

e lo hanno non fallisce se il file "etc/cron.d/{nome servizio}" non esiste, dal momento che io possa avere tanti servizi in esecuzione su una macchina , ma solo alcuni di loro hanno associato cron jobs.

Non voglio avere una grande lista di servizi che prendono cron jobs come

['service_1', 'service_2', ...], 

dal momento che sembra abbastanza fragile. Idealmente, mi piacerebbe avere una directory che contenga i lavori cron per i servizi che ne hanno bisogno, e avere la ricetta non fallire se questi file non sono presenti. È ciò che sto cercando possibile?

risposta

6

Per quanto ne so, non è possibile testare in vantaggio se esiste il file cookbook_file. Ma puoi fare in modo che lo chef continui la corsa invece di fallire, se non trova il file.

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
    ignore_failure true 
end 
+0

Questo funziona abbastanza bene per me - grazie! – Marc

+1

Produce comunque un errore nei log. – timurb

0

Nel complesso, lo suggerire di utilizzare answer fornito da @JonathanM.

Se si preferisce non dipendere da un chef_gem, qui il codice necessario nella propria ricetta. Questo codice è stato testato su Chef 11.12.8 ma suppongo che dovrebbe funzionare con qualsiasi versione Chef 11.x.

Per verificare la presenza di 'fonte s:

only_if { run_context.has_cookbook_file_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

per verificare una template' un cookbook_file fonte s:

only_if { run_context.has_template_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

La variabile cookbook_name è implicitamente disponibili all'interno di ogni ricetta e ha il libro di cucina corrente nome come valore. Per verificare se un altro libro di cucina ha un modello o un file, sostituire cookbook_name con una stringa hardcoded, ad esempio "java".

Nota che girare con l'API interna di Chef è rischioso, poiché il codice potrebbe cambiare tra le versioni principali (anche tra le versioni secondarie, credo). Ecco perché affidarsi a chef_gem è una buona idea, la gemma potrebbe gestire più versioni di Chef, ridurre i disturbi visivi nel codice della ricetta e rendere più leggibile il codice della ricetta anche se la DSL è ben pensata.