2013-06-02 6 views
10

Sto provando a creare una ricetta Chef per aggiungere più righe (20-30) a un file di configurazione specifico.Utilizzo di una ricetta Chef per aggiungere più righe a un file di configurazione

Sono a conoscenza che lo schema consigliato è change entire config files anziché aggiungere semplicemente un file, ma non mi piace questo approccio per diverse ragioni.

Finora l'unica soluzione che ho trovato è stato quello di utilizzare un cookbook_file e quindi utilizzare una risorsa bash di fare:

cat lines_to_append >> /path/configfile

Ovviamente questo non avrebbe funzionato correttamente, in quanto sarebbe aggiungere il file su e oltre, ogni volta che gestisci lo chef-cliente. Dovrei creare un piccolo script bash per verificare prima una stringa specifica e, se non trovato, aggiungere al file.

Ma questo sembra vanificare lo scopo di utilizzare Chef. Ci deve essere un modo migliore.

Una soluzione promettente era la line cookbook dalla comunità OpsCode. Ha mirato a risolvere questo problema esatto. Sfortunatamente la funzionalità è incompleta, buggata e il codice è solo un rapido trucco. Lungi dall'essere una soluzione solida.

Un'altra opzione che ho valutato era augeas. Sembra piuttosto potente, ma aggiungerebbe ancora un altro livello di astrazione al sistema. Overkill, nel mio caso.

Dato che questo è uno dei compiti più ovvi per qualsiasi sysadmin, c'è una soluzione facile e bella con lo Chef che non vedo?


EDIT: ecco come sto risolvendo finora:

cookbook_file "/tmp/parms_to_append.conf" do 
    source "parms_to_append.conf" 
end 

bash "append_to_config" do 
    user "root" 
    code <<-EOF 
     cat /tmp/parms_to_append.conf >> /etc/config 
     rm /tmp/parms_to_append.conf 
    EOF 
    not_if "grep -q MY_IDENTIFIER /etc/config" 
end 

Funziona, ma non è sicuro questo è il modello Chef consigliato.

risposta

10

Come hai detto tu stesso, il modello Chef consigliato è quello di gestire l'intero file.

Se stai utilizzando Chef 11, potresti probabilmente utilizzare partial per quello che stai cercando di ottenere.

C'è più informazioni here e su questo example cookbook.

Finché si ha accesso al modello di configurazione originale, è sufficiente aggiungere <%= render "original_config.erb" %> all'inizio del modello parms_to_append.conf.

8

Come detto prima, l'utilizzo di modelli e partials è un modo comune per farlo, ma lo chef consente di aggiungere file e persino di modificare (modificare) le righe dei file.L'appendicazione viene eseguita utilizzando le seguenti funzioni:

  • insert_line_after_match (regex, newline);
  • insert_line_if_no_match (regex, a capo)

Si possono trovare e con l'esempio here su StackOverflow, e la documentazione completa sul rubydoc.info

Utilizzare con cautela, e solo quando parziali e modelli non sono appropriati.

3

ho fatto qualcosa di simile:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START 
set mail-format { from: [email protected] } 
#---FLOWDOCK-END 

Nella mia ricetta che ho fatto questo:

monit_overwrites/Ricette/default .rb:

execute "Clean up monitrc from earlier runs" do 
    user "root" 
    command "sed '/#---FLOWDOCK-START/,/#---FLOWDOCK-END/d' > /etc/monitrc" 
end 

template "/tmp/monitrc_append.conf" do 
    source "monitrc_append.erb" 
end 

execute "Setup monit to push notifications into flowdock" do 
    user "root" 
    command "cat /tmp/monitrc_append.conf >> /etc/monitrc" 
end 

execute "Remove monitrc_append" do 
    command "rm /tmp/monitrc_append.conf" 
end 
0

Il modo più semplice per affrontare questo sarebbe creare una stringa e passarla al contenuto. Ovviamente i blocchi di bash funzionano ... ma penso che le risorse dei file siano eleganti.

lines = "" 
File.open('input file') do |f| 
    f.lines.each do |line| 
     lines = lines + line + "\n" 
    end 
end 
file "file path" do 
    content line 
end