2013-06-02 7 views
10

Ich versuche ein Chef-Rezept zu erstellen, um mehrere Zeilen (20-30) an eine bestimmte Konfigurationsdatei anzuhängen.Verwenden eines Chef-Rezepts zum Anhängen mehrerer Zeilen an eine Konfigurationsdatei

Ich bin mir bewusst, das empfohlene Muster ist change entire config files anstatt nur an eine Datei anhängen, aber ich mag diesen Ansatz aus mehreren Gründen nicht.

Bisher ist die einzige Lösung, die ich hatte einen verwenden cookbook_file und dann ein Bash-Ressource zu tun verwenden:

cat lines_to_append >> /path/configfile

Offensichtlich würde dies nicht richtig funktionieren, da es die Datei anhängen würde über und jedes Mal, wenn Sie einen Koch-Client betreiben. Ich müsste ein kleines Bash-Skript erstellen, um zuerst nach einer bestimmten Zeichenfolge zu suchen, und, , falls nicht gefunden, an die Datei anhängen.

Aber dies scheint den Zweck der Verwendung von Chef zu besiegen. Es muss einen besseren Weg geben. Eine vielversprechende Lösung war die line cookbook von OpsCode Community. Es zielte darauf ab, dieses genaue Problem zu lösen. Leider ist die Funktionalität unvollständig, fehlerhaft und der Code ist nur ein schneller Hack. Weit davon entfernt, eine solide Lösung zu sein.

Eine andere Option, die ich bewertete, war augeas. Scheint ziemlich mächtig, aber es würde dem System noch eine weitere Abstraktionsebene hinzufügen. Overkill, in meinem Fall.

Da dies eine der offensichtlichsten Aufgaben für jeden Systemadministrator ist, gibt es eine einfache und schöne Lösung mit Chef, die ich nicht sehe?


EDIT: Hier ist, wie ich es so weit bin Lösung:

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 

Es funktioniert, aber nicht sicher, dies ist die empfohlene Chef Muster.

Antwort

10

Wie Sie selbst gesagt haben, ist das empfohlene Chef-Muster die Verwaltung der gesamten Datei.

Wenn Sie Chef 11 verwenden, könnten Sie wahrscheinlich Partials für das verwenden, was Sie erreichen möchten.

Es gibt weitere Informationen here und auf diesem example cookbook.

Solange Sie Zugriff auf die ursprüngliche Konfigurationsvorlage haben, fügen Sie einfach <%= render "original_config.erb" %> an den Anfang Ihrer parms_to_append.conf Vorlage an.

8

Wie bereits erwähnt, ist die Verwendung von Vorlagen und partials gängige Methode, dies zu tun, aber Chef ermöglicht das Anhängen von Dateien und sogar Ändern (Bearbeiten) von Dateizeilen.Appendind wird mit folgenden Funktionen ausgeführt:

  • insert_line_after_match (regex, newline);
  • insert_line_if_no_match (regex, Newline)

Sie here auf Stackoverflow finden und beispielsweise können, und die vollständige Dokumentation über rubydoc.info

Bitte mit Vorsicht verwenden, und nur dann, wenn partials und Vorlagen nicht geeignet ist.

3

Ich habe so etwas wie dies:

monit_overwrites/templates/default/monitrc.erb:

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

In meinem Rezept, das ich dies tat:

monit_overwrites/Rezepte/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

Der einfachste Weg, dies anzugehen, wäre, eine Zeichenfolge zu erstellen und sie an den Inhalt zu übergeben. Natürlich funktionieren Bash-Blöcke ... aber ich denke, die Dateiressourcen sind elegant.

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