2016-09-06 1 views
1

Ich habe eine Ruby-Vorlage (.erb), die ich über einen Hash zu iterieren. Es sollte die gleiche Ausgabedatei jedes Mal erzeugen, wenn der Puppenagent läuft.Schleife über Hash in definierter Reihenfolge in Ruby-Vorlage

Was ich derzeit habe, ist das Folgende. Dies ist meine Vorlage (Teil rsyslog Config, wenn jemand fragt):

<% log_files.each do |log_file, tag| -%> 
# <%= log_file %> 
$InputFileName <%= log_file %> 
$InputFileTag <%= tag %>: 

Diese Vorlage wird mit einem Hash gemacht, die wie folgt aussieht:

log_files => { 
    '/root/apache_auth.local' => 'httpd', 
    '/root/install.log' => 'hugo', 
}, 

(Nicht wirklich Logfiles). Dies funktioniert und erzeugt die gewünschte Konfigurationsdatei. Das Problem dabei ist, dass jedes Mal, wenn ich den Puppet-Agenten anrufe, die Reihenfolge der Log-Dateien im Hash geändert wird, so dass die Konfigurationsdatei neu geschrieben wird und der Daemon anschließend neu gestartet wird. Die Funktionalität bleibt gleich, aber ich möchte die Config-Datei nicht neu schreiben und rsyslog jedes Mal neu starten, wenn der Puppet-Agent läuft.

Nun gehe ich davon aus, dass dies mit Hashes nicht lösbar ist, da sie keine definierte Reihenfolge haben. Welche anderen Möglichkeiten habe ich, um zu erreichen, was ich will?

+0

Es ist eine Puppenvorlage (.erb). – Isaac

Antwort

2

Da die Scriptlets in einem ERB-Template aus Ruby-Code bestehen, ist dies im Wesentlichen eine Ruby-Frage. Die möglichen Antworten hängen daher davon ab, welche Version von Ruby unter Ihrem Puppet-Katalog-Compiler läuft. obwohl es in neueren Ruby diese Variante auf Ihrem Code kann jedoch bessere Alternativen wird von Puppet seit Puppet 2.7 in jedem Ruby-Unterstützung arbeiten:

<% @log_files.sort.each do |log_file, tag| -%> 
# <%= log_file %> 
$InputFileName <%= log_file %> 
$InputFileTag <%= tag %>: 
<% end -%> 

Der Schlüssel hier (kein Wortspiel beabsichtigt) die sort ist.

+0

Nur neugierig: Ist dies der Standard-Algorithmus für die Bestellung eines Hash in Ruby? –

+2

@MattSchuchard, Ruby 1.9+ hat Ordnung konservierende Hashes, also dort, wenn Reihenfolge der Insertion konsistent ist, dann brauchen Sie nicht unbedingt etwas anderes. Auf der anderen Seite ist 'Hash.sort' eine lange Standardmethode, und was ich vorgestellt habe, ist eine ziemlich idiomatische Art, einen Hash in sortierter Reihenfolge zu durchlaufen. Beachten Sie jedoch, dass 'Hash.sort' ein Array von 2-Element-Arrays und keinen Hash zurückgibt. –

+0

Danke für die Info. Ich denke, ich kann die Frage "Unterschied zwischen Python-Wörterbuch und Ruby-Hash" nicht mehr während der Interviews verwenden. –