
Мне нужно найти решение проблемы, с которой я столкнулся.
У меня есть хэш (он должен быть позже переопределен как параметр смарт-класса), который я перебираю в своем template.erb для генерации нескольких ресурсов File, которые я определил с помощью массива. Я хочу, чтобы итерация останавливалась после того, как она пройдет через первый набор пар ключ-значение, а затем начиналась запись в следующий файл.
Чтобы было понятнее, я покажу пример.
#### 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]: }
}
### файл шаблона ### 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>
# это генерирует два файла из моего массива $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
Однако, заглянув внутрь этих файлов, я получаю два идентичных файла с выводом для ключей "alex_super_mario" и "ben_mega_man" из моего хэша $game_code:
Ожидаемый результат, которого я хочу добиться, по сути, состоит в том, чтобы первый набор итераций, выполненных для "alex_super_mario" => { ...., вошел в alex_file.xml вместе с именем пользователя alex.
а содержимое ben_mega_man помещается в файл ben.
Это возможно?
<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>
решение1
Ваш шаблон явно циклически проходит по nameid, а затем по всем ключам в game_code, поэтому, конечно, каждый сгенерированный файл будет содержать все данные. Возможно, подойдет что-то вроде этого:
<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>
где «somecondition» — это то, что вы хотите решить, соответствует ли текущий хэш «value» вашему текущему имени героя (трудно сказать, как вы хотите это сделать, учитывая, что ключи в game_code не соответствуют строкам в nameid)