2013-02-13 10 views
26

Ho 7 file e 1 guerra. Devo cambiare i valori quando li distribuisco. Ho questo:Come posso cambiare un file con Chef?

##usuario 
#alfresco.user=***** 
alfresco.user=******** 
##pass 
#alfresco.password= sfsfs 
alfresco.password=sfgsf 

alfresco.rutaAnexos=/gthtfdh/dfgdf/cm: 

#atributo.type.anexo=ANEXO_INFO_OBJETO 
atributo.type.anexo=AN 
atributo.type.observaciones=OBSERVACIONES 

Ho bisogno di commentare alcune righe e decommentare alcune altre linee. Quindi ho bisogno di creare sette template e mettere variabili a seconda degli ambienti e creare un file nella ricetta.

Come posso fare questo?

+2

Vedi http://docs.opscode.com/essentials_cookbook_templates.html e http://docs.opscode.com/resource_template.html, come funzionano i modelli. – StephenKing

risposta

0

In base alla progettazione, non si modificano i file con Chef. Invece si mettono segnaposti (<%= ..%>) nei modelli di file, che vengono poi sostituiti con i valori dinamici (i cosiddetti attributi).

+7

Cosa succede se il file viene anche modificato da un altro software? I modelli sono fantastici, ma è necessario anche modificare i file (anche ansible ha il modulo lineinfile). – neutrinus

+0

Poi vedi la risposta qui sotto. – StephenKing

67

Lo chef lo consente e lo utilizza. È possibile trovare un esempio nella Opscode del

cookbooks/chef-server/recipes/default.rb:

ruby_block "ensure node can resolve API FQDN" do 
    block do 
    fe = Chef::Util::FileEdit.new("/etc/hosts") 
    fe.insert_line_if_no_match(/#{node['chef-server']['api_fqdn']}/, 
           "127.0.0.1 #{node['chef-server']['api_fqdn']}") 
    fe.write_file 
    end 
    not_if { Resolv.getaddress(node['chef-server']['api_fqdn']) rescue false } 
end 

Ecco il caso d'uso. Dopo l'installazione dalla sorgente ho dovuto decommentare le righe in qualche file di configurazione creato che non era lo stesso in tutte le versioni del software, quindi l'uso di modelli non era appropriato. I metodi che ho usato sono state:

  • (Object) search_file_replace (regex, sostituire)
  • (Object) search_file_replace_line (regex, a capo)

È possibile trovare la documentazione completa:

TO STRESS: questo metodo deve essere utilizzato solo quando l'uso di modelli e partial è inappropriato. Come già detto @StephenKing, i modelli sono un modo comune per farlo.

+0

Certo, puoi farlo in questo modo, ma sostengo fermamente che mettere in atto interi file è la cosa migliore rispetto a metterli in ordine. Immagino che tu lo veda quando confronti il ​​tuo codice usando una risorsa modello. – StephenKing

+0

@StephenKing se è così, mi piacerebbe che tu rispondessi alla mia domanda: Se hai 7 versioni di software, ognuna con differenze nel file di configurazione, e in quel file, devi impostare una configurazione di base che non cambierà mai, hai messo 7 file nel modello? Oppure useresti questo metodo per disapprovare 3 linee di codice e rendere universale il tuo ricettario di chef? – Konzula

+1

@StephenKing, se hai un modo in cui non ho pensato, ti preghiamo di fornirlo qui. Penso che questo tipo di discussione porterebbe beneficio all'intero argomento. Inoltre, sono d'accordo, il metodo che ho fornito dovrebbe essere usato con attenzione, e solo nel caso di necessità inevitabile. – Konzula

16

Ecco un esempio di come è possibile utilizzare Chef per decommentare una riga in un file di configurazione. ruby_block è protetto con ::File::grep. Il test per Debian è solo per divertimento.

pam_config = "/etc/pam.d/su" 
commented_limits = /^#\s+(session\s+\w+\s+pam_limits\.so)\b/m 

ruby_block "add pam_limits to su" do 
    block do 
    sed = Chef::Util::FileEdit.new(pam_config) 
    sed.search_file_replace(commented_limits, '\1') 
    sed.write_file 
    end 
    only_if { ::File.readlines(pam_config).grep(commented_limits).any? } 
end if platform_family?('debian') 
+0

proprio quello che volevo! – brauliobo

Problemi correlati