Моя конечная цель - включить фрагмент конфигурации для конкретного сайта в общий базовый шаблон. Моей первой мыслью было вызвать функцию шаблона из базового шаблона, например:
Манифест:
...
$domain = "www.example.com"
...
Шаблон:
server {
# Common configuration items here.
...
# Load site-specific configurations here.
<%= scope.function_template("sites/$domain/config.erb") %>
}
Однако не похоже, чтобы можно было использовать переменную в вызове функции (поправьте меня, если я ошибаюсь). Также существует проблема в том, что должен существовать шаблон для конкретного сайта.
Итак, моя следующая мысль заключалась в том, чтобы использовать переменную в манифесте, содержащую контент конфигурации для конкретного сайта, загруженный из шаблона.
Манифест:
...
$domain = "www.example.com"
$site_specific_content = template("sites/$domain/config.erb")
....
Шаблон:
server {
# Common configuration items here.
...
# Load site-specific configurations here.
<%= site_specific_content %>
}
Однако мне не удалось найти способ визуализировать шаблон, если он существует, но я установил для переменной пустую строку, если шаблон не существует. (Хотя это немного неэлегантно, я полагаю, что здесь можно было бы просто создать пустой шаблон для сайта, который не требует дополнительной настройки.)
Любые идеи?
Однако не похоже, чтобы можно было использовать переменную в вызове функции (поправьте меня, если я ошибаюсь). Также существует проблема в том, что должен существовать шаблон для конкретного сайта.
Можно использовать переменную в вызове функции, но помните, что аргумент функции - это рубиновая строка, а не шаблон Puppet. Вы могли сделать это:
<%= scope.function_template("sites/" + domain + "/config.erb") %>
Или используйте подстановку строки Ruby:
<%= scope.function_template("sites/#{domain}/config.erb") %>
... но это все равно приведет к ошибке, если заданный шаблон не существует.
Чтобы предотвратить ошибку, вы можете использовать механизм обработки исключений Ruby внутри вашего шаблона, например:
<%=
begin
scope.function_template("sites/#{domain}/config.erb")
rescue
end
%>
Да да! Может быть лучший способ сделать это; Я не эксперт по Ruby и не марионеткам, и я только что придумал это.