2014-07-10 5 views
5

Ich bin mit Puppet plant eine beliebige Liste von Appsettings in einer ASP.NET web.config zu aktualisieren (für die Bereitstellung) und ich bin in einem Dilemma, vor allem, weil ich ' m eine echte n00b in Puppe.Iterieren über einen Hash-Schlüssel/Werte in Puppet

Ich habe diese yaml Datei (hiera)

--- 
appSettings: 
    setting1: "hello" 
    setting2: "world!" 
    setting3: "lalala" 

die Anzahl von setting[x] beliebig Spanne (ein appSetting) und ich möchte durch die Hash-Schlüssel/Wert-Schleife der entsprechenden appSetting/add in dem Netz zu aktualisieren, .config (mit exec mit Powershell) das Problem ist, ich habe hoch und niedrig auf, wie auf Schlüssel und Werte iterieren.

Ich stolperte create_resources und dies natürlich durchläuft einen Hash von Hash mit einer vorgegebenen Menge von Schlüsseln. Wiederum sind die Schlüsselnamen innerhalb des Manifests nicht bekannt (daher werden die Schlüssel/Wert-Paare wiederholt).

jede Anleitung wird geschätzt.

Edit: sieht aus wie es ist eine keys() Funktion, die ich über den Hash verwenden und über iterieren kann, dann verwenden Sie hiera_hash ('appSettings'), um den Hash zu erhalten und durchlaufen die Werte.

+0

Der Ansatz etwas beleidigend klingt. Wäre es nicht wirtschaftlicher, die Schlüssel/Wert-Paare in eine Datei auf dem Agenten zu schreiben und ein * einziges * monolithisches PowerShell-Skript die gesamte Bearbeitung auf einmal zu erledigen? –

+1

@FelixFrank sorry, ich verstehe nicht recht, warum es "missbräuchlich" ist. Das PowerShell-Skript aktualisiert die Einstellung "web.config" jeweils für eine App. Können Sie näher erläutern, was ein besserer Ansatz wäre? –

+1

Idealerweise könnten Sie eine [Vorlage] (http://docs.puppetlabs.com/guides/templating.html) erstellen, die den gesamten Inhalt für Ihre Datei ausgibt. Abgesehen davon wäre es wünschenswert, Dinge in nur zwei Ressourcen zu verwalten - eine Datei mit den Schlüssel/Wert-Paaren, wie in Hiera gefunden, und eine "exec" mit einem etwas mächtigeren Skript, um die Arbeit all Ihrer derzeitigen Führungskräfte zu übernehmen und anzuwenden alle Schlüssel/Wert-Paare. Sie benötigen wahrscheinlich ein zusätzliches Skript, um zu bestimmen, ob die Zieldatei bearbeitet werden muss, um Ihre einzige Bedingung zu erfüllen. - Je nachdem, wie wichtig die Leistung ist, kann dies nitpicking sein –

Antwort

8

ok ich gerade bestätigt, dass das, was Sie in Ihrem Manifest tun können:

define updateAppSetting { 
    # get the hashes again because outside vars aren't visible here 
    $appSettings = hiera_hash('appSettings') 

    # $name is the key $appsettingValue is the value 
    $appsettingValue = $appSettings[$name] 

    # update the web.config here! 
} 

$appSettings = hiera_hash('appSettings')  

# the keys() function returns the array of hash keys 
$appSettingKeys = keys($appSettings) 

# iterate through each appSetting key 
updateAppSetting{$appSettingKeys:} 
+0

'Hiera_hash' sollte nicht verwendet werden ** es sei denn ** Sie benötigen Hiera, um Hashwerte aus verschiedenen Hierarchieebenen zusammenzuführen. In fast allen normalen Anwendungsfällen sollten Sie Ihre Hash-Daten mit der normalen 'Hiera'-Funktion abrufen. –

+1

die Merging-Funktion von 'Hiera_hash' ist genau das, was ich brauche. –

+0

Gute Frage und Follow-up. Ich weiß nicht, warum du abgelehnt wurdest. – BillMan