tipo definido de marioneta y creación de múltiples plantillas a partir de 1 archivo .erb

tipo definido de marioneta y creación de múltiples plantillas a partir de 1 archivo .erb

Necesito encontrar una solución a este problema con el que me he encontrado.

Tengo un hash (se supone que se anulará como parámetro de clase inteligente más adelante) que estoy iterando en mi template.erb para generar múltiples recursos de archivo que he definido usando una matriz. Quiero que la iteración se detenga después de pasar por el primer conjunto de pares clave-valor y luego comenzar a escribir en el siguiente archivo.

Mostraré un ejemplo para aclarar las cosas.

#### 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]: }
}
### archivo de plantilla ### plantilla.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>
# esto genera dos archivos de mi matriz $nameid = ['alex','ben'] como se esperaba.
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

Sin embargo, al mirar dentro de estos archivos, obtengo dos archivos idénticos con la salida para las claves "alex_super_mario" y "ben_mega_man" de mi hash $game_code:

El resultado esperado que quiero lograr es básicamente tener el primer conjunto de iteraciones que se realizan para "alex_super_mario" => { .... para ingresar al alex_file.xml junto con el nombre de usuario de alex.

y las cosas de ben_mega_man van dentro del archivo ben.

es posible?

    <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>

Respuesta1

Su plantilla recorre explícitamente nameid y luego todas las claves en game_code, por lo que, por supuesto, cada archivo generado tendrá todos los datos. Quizás algo como esto funcionaría:

<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>

donde "alguna condición" es sin embargo quieres decidir si el hash de 'valor' actual es el que coincide con tu nombre de héroe actual (es difícil saber cómo quieres hacerlo, dado que las claves en game_code no coinciden con las cadenas en nombreid)

información relacionada