Puppet-definierter Typ und Erstellen mehrerer Vorlagen aus 1 .erb-Datei

Puppet-definierter Typ und Erstellen mehrerer Vorlagen aus 1 .erb-Datei

Ich muss eine Lösung für das Problem finden, auf das ich gestoßen bin.

Ich habe einen Hash (der später als Smart-Class-Parameter überschrieben werden soll), den ich in meiner template.erb durchlaufe, um mehrere Dateiressourcen zu generieren, die ich mithilfe eines Arrays definiert habe. Ich möchte, dass die Iteration nach dem ersten Satz von Schlüssel-Wert-Paaren endet und dann mit dem Schreiben in die nächste Datei beginnt.

Ich zeige ein Beispiel, um die Dinge klarer zu machen.

#### init.pp ####
class testing ( 
$nameid = ['alex','ben'],
$game_code = {
    alex_super_mario => {
            "type"     => "1",
            "characters" => {
                            "bowser" => "123",
                            "luigi" => "456",
                            "princess" => "789" }
    },
    ben_mega_man => {
            "type" => "2",
            "characters" => {
                            "something" => "111213",
                            "else" => "131415",
                            "lastone" => "161718" }
    },
 }
) {

define testing(
$base_path = '/var/tmp/testing',
){
file  {"${base_path}/${name}_file.xml":
  owner   => 'root',
  group   => 'root',
  ensure  => 'file',
  mode    => '0644',
  content => template("testing/template.xml.erb"),
 }
}
testing { [$nameid]: }
}
### Vorlagendatei ### template.xml.erb
  <% @nameid.each do |username| %>
<UserName><%= username %></UserName>
<% end %>
<games>
<% @game_code.sort.map do |hero, value| %>
<% value.sort.map do |game,code| %>
         <% if game == "characters" %>
                <% code.each do |k, v| %>
    <game>
        <type><%= value['type'] %></type>
        <gameid><%= v %></gameid>
        <extcharacters>
            <char>/var/tmp/<%= k %></path>
        </extcharacters>
    </game>
            <% end %>
    <% end %>
 <% end %>
<% end %>
</games>
# dies generiert wie erwartet zwei Dateien aus meinem Array $nameid = ['alex','ben'].
Notice: /Stage[main]/Testing/Testing::Testing[ben]/File[**/var/tmp/testing/ben_file.xml**]/ensure:     defined content as '{md5}21af03b1dd7427d17c2460bae323bc24'
Notice: /Stage[main]/Testing/Testing::Testing[alex]/File[**/var/tmp/testing/alex_file.xml**]/ensure:     defined content as '{md5}21af03b1dd7427d17c2460bae323bc24'
Notice: Finished catalog run in 0.34 seconds

Wenn ich mir diese Dateien jedoch ansehe, erhalte ich zwei identische Dateien mit der Ausgabe für die Schlüssel „alex_super_mario“ und „ben_mega_man“ aus meinem Hash $game_code:

Die erwartete Ausgabe, die ich erzielen möchte, besteht im Wesentlichen darin, dass der erste Satz von Iterationen, der für „alex_super_mario“ => { … durchgeführt wird, zusammen mit dem Benutzernamen Alex in die Datei „alex_file.xml“ gelangt.

und der ben_mega_man-Kram kommt in die Ben-Datei.

Ist das möglich?

    <UserName>alex</UserName>  <--- ## this should go into the alex_file.xml

<UserName>ben</UserName> <--- ## this should go into the ben_file.xml ##

<games>




    <game>                       ## <-- this should go to the ben_file.xml
        <type>2</type>
        <gameid>111213</gameid>
        <extcharacters>
            <char>/var/tmp/something</path>
        </extcharacters>
    </game>

    <game>
        <type>2</type>
        <gameid>161718</gameid>
        <extcharacters>
            <char>/var/tmp/lastone</path>
        </extcharacters>
    </game>

    <game>
        <type>2</type>
        <gameid>131415</gameid>
        <extcharacters>
            <char>/var/tmp/else</path>
        </extcharacters>
    </game>




    <game>                  ### <------ these should go into the alex_file.xml
        <type>1</type>
        <gameid>123</gameid>
        <extcharacters>
            <char>/var/tmp/bowser</path>
        </extcharacters>
    </game>

    <game>
        <type>1</type>
        <gameid>789</gameid>
        <extcharacters>
            <char>/var/tmp/princess</path>
        </extcharacters>
    </game>

    <game>
        <type>1</type>
        <gameid>456</gameid>
        <extcharacters>
            <char>/var/tmp/luigi</path>
        </extcharacters>
    </game>






</games>

Antwort1

Ihre Vorlage durchläuft explizit nameid und dann alle Schlüssel in game_code, sodass jede generierte Datei natürlich alle Daten enthält. Vielleicht würde so etwas funktionieren:

<UserName><%= @name %></UserName>
<games>
<% @game_code.sort.map do |hero, value|
if (somecondition)
value.sort.map do |game,code| 
         <if game == "characters" 
                 code.each do |k, v| %>
    <game>
        <type><%= value['type'] %></type>
        <gameid><%= v %></gameid>
        <extcharacters>
            <char>/var/tmp/<%= k %></path>
        </extcharacters>
    </game>
            <% end 
     end 
  end 
end
end %>
</games>

wobei „somecondition“ jedoch der Wert ist, für den Sie entscheiden möchten, ob der aktuelle „Wert“-Hash derjenige ist, der mit Ihrem aktuellen Heldennamen übereinstimmt (es ist schwer zu sagen, wie Sie das tun möchten, da die Schlüssel in game_code nicht mit den Zeichenfolgen in nameid übereinstimmen).

verwandte Informationen