У меня есть следующий код в шаблоне erb:
<% if @proxy_cache_path.is_a?(Hash) -%>
<% @proxy_cache_path.sort_by{|k,v| k}.each do |key,value| -%>
proxy_cache_path <%= key %> keys_zone=<%= value %> levels=<%= @proxy_cache_levels %> max_size=<%= @proxy_cache_max_size %> inactive=<%= @proxy_cache_inactive -%>
<% end -%>
Как его портировать под шаблон epp? Я нахожу очень мало информации об этом. Пожалуйста помоги.
1 ответ
Вот как это сделать:
Демонстрация примера класса и того, как объявить шаблон ERB и EPP для сравнения:
# manifests/init.pp
class foo () {
$proxy_cache_path = {
'apples' => 1,
'bananas' => 2,
}
$proxy_cache_levels = 2
$proxy_cache_max_size = 2
$proxy_cache_inactive = 2
# Showing use of ERB:
file { '/foo':
ensure => file,
content => template('foo/mytemplate.erb')
}
# Showing use of EPP, which requires an explicit parameters hash:
file { '/bar':
ensure => file,
content => epp('foo/mytemplate.epp', {
'proxy_cache_path' => $proxy_cache_path,
'proxy_cache_levels' => $proxy_cache_levels,
'proxy_cache_max_size' => $proxy_cache_max_size,
'proxy_cache_inactive' => $proxy_cache_inactive,
}),
}
}
Исправлено * содержимое файла ERB для сравнения:
# templates/mytemplate.erb
<% if @proxy_cache_path.is_a?(Hash) -%>
<% @proxy_cache_path.sort_by{|k,v| k}.each do |key,value| -%>
proxy_cache_path <%= key %> keys_zone=<%= value %> levels=<%= @proxy_cache_levels %> max_size=<%= @proxy_cache_max_size %> inactive=<%= @proxy_cache_inactive -%>
<% end -%>
<% end -%>
(* В коде вопроса отсутствует закрывающий end
.)
Содержание файла EPP:
# templates/mytemplate.epp
<%- | Hash[String, Integer] $proxy_cache_path, Integer $proxy_cache_levels, Integer $proxy_cache_max_size, Integer $proxy_cache_inactive | -%>
<% include stdlib -%>
<% $proxy_cache_path.keys.sort.each |$key| { -%>
proxy_cache_path <%= $key %> keys_zone=<%= $proxy_cache_path[$key] %> levels=<%= $proxy_cache_levels %> max_size=<%= $proxy_cache_max_size %> inactive=<%= $proxy_cache_inactive -%>
<% } -%>
Обратите внимание на содержимое файла шаблона EPP:
1) Параметры и их типы определяются в первой строке шаблона. Использование этой строки необязательно, но это хорошая практика.
2) Поскольку мы объявили типы в первой строке, нет необходимости и излишне проверять, является ли $proxy_cache_path
хешем.
3) Нам нужно включить stdlib для доступа к функциям keys
и sort
. Это отличается от Ruby (ERB), где эти методы встроены в язык.
4) Я упростил код по сравнению с Ruby (ERB), потому что Puppet (EPP) не имеет функции sort_by
- и на самом деле не было необходимости использовать его в ERB, что можно было бы переписать как:
<% if @proxy_cache_path.is_a?(Hash) -%>
<% @proxy_cache_path.sort.each do |key,value| -%>
proxy_cache_path <%= key %> keys_zone=<%= value %> levels=<%= @proxy_cache_levels %> max_size=<%= @proxy_cache_max_size %> inactive=<%= @proxy_cache_inactive -%>
<% end -%>
<% end -%>
Напоследок несколько тестов:
# spec/classes/test_spec.rb:
require 'spec_helper'
describe 'foo', :type => :class do
it 'content in foo should be the same as in bar' do
foo = catalogue.resource('file', '/foo').send(:parameters)[:content]
bar = catalogue.resource('file', '/bar').send(:parameters)[:content]
expect(foo).to eq bar
end
end
И тесты проходят.
См. Документы здесь.
Похожие вопросы
Связанные вопросы
Новые вопросы
puppet
Puppet - это система управления конфигурацией на основе ruby, включающая управляемый моделями DSL. Его целью является обеспечение применения файла конфигурации, мониторинг состояния сервиса, установка пакетов и другое управление на стороне сервера.