У меня есть следующий код в шаблоне 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
beliy 29 Июл 2017 в 12:20

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

И тесты проходят.

См. Документы здесь.

3
Alex Harvey 29 Июл 2017 в 15:15
Его возможное использование хэшей с неизвестным ключом и именем параметров как UNKNOW_USERNAME - HIM_PARAMETER?
 – 
beliy
2 Авг 2017 в 17:23
Возможно, вам придется задать новый вопрос и попытаться подробно объяснить проблему. Опять же, я не понимаю, что вы имеете в виду.
 – 
Alex Harvey
2 Авг 2017 в 19:30