О шаблонах
Шаблон кулинарной книги — это шаблон Embedded Ruby (ERB), используемый для динамического генерирования статических текстовых файлов. Шаблоны могут содержать выражения и операторы Ruby и являются отличным способом управления конфигурационными файлами. Используйте ресурс template для добавления шаблонов кулинарной книги в рецепты; поместите соответствующий файл шаблона Embedded Ruby (ERB) в каталог кулинарной книги /templates.
Каталог templates по умолчанию в кулинарной книге не существует. Сгенерируйте каталог templates и файл шаблона из каталога chef-repo/cookbooks с помощью команды:
chef generate template PATH_TO_COOKBOOK TEMPLATE_NAME
Например, эта команда генерирует шаблон httpd в кулинарной книге custom_web.
chef generate template cookbooks/custom_web httpd
Каталог кулинарной книги custom_web с шаблоном имеет структуру:
├ cookbooks
├ custom_web
├ .delivery
| └ project.toml
├ recipes
| └ default.rb
├ templates
| └ http.erb
├ test
| └ integration
| | └ default
| | | └ default_test.rb
├ .gitignore
├ CHANGELOG.md
├ chefignore
├ kitchen.yml
├ LICENSE
├ metadata.rb
├ Policyfile.rb
└ README.md
Требования
Для использования шаблона необходимо выполнить два действия:
- В рецепт необходимо добавить ресурс шаблона
- В кулинарную книгу необходимо добавить шаблон Embedded Ruby (ERB)
Например, следующий файл шаблона и настройки ресурса шаблона могут использоваться для управления конфигурационным файлом, названным /etc/sudoers. В кулинарной книге, использующей sudo, в /recipes/default.rb можно добавить следующий ресурс:
template '/etc/sudoers' do
source 'sudoers.erb'
mode '0440'
owner 'root'
group 'root'
variables(sudoers_groups: node['authorization']['sudo']['groups'],
sudoers_users: node['authorization']['sudo']['users'])
end
Затем создайте шаблон, названный sudoers.erb, и сохраните его в templates/default/sudoers.erb.
#
# /etc/sudoers
#
# Generated by Chef for <%= node['fqdn'] %>
#
Defaults !lecture,tty_tickets,!fqdn
# User privilege specification
root ALL=(ALL) ALL
<% @sudoers_users.each do |user| -%>
<%= user %> ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
<% end -%>
# Members of the sysadmin group may gain root privileges
%sysadmin ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
<% @sudoers_groups.each do |group| -%>
# Members of the group '<%= group %>' may gain root privileges
<%= group %> ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
<% end -%>
Затем установите атрибуты по умолчанию в attributes/default.rb:
default['authorization']['sudo']['groups'] = %w(sysadmin wheel admin)
default['authorization']['sudo']['users'] = %w(jerry greg)
Переменные
Шаблон Embedded Ruby (ERB) позволяет встраивать код Ruby в текстовый файл в специальных тегах. Код Ruby может быть встроен с помощью выражений и операторов. Выражение ограничено <%= и %>. Например:
<%= "my name is #{$ruby}" %>
Оператор ограничен модификатором, например if, elsif, и else. Например:
if false
# this won't happen
elsif nil
# this won't either
end
Использование выражения Ruby — наиболее распространенный подход к определению переменных шаблона, так как именно таким образом ссылаются на все переменные, передаваемые в шаблон. Всякий раз, когда шаблон требует использовать each, if, или end, используйте оператор Ruby.
При рендеринге шаблона выражения и операторы Ruby оцениваются клиентом Chef Infra. Переменные, указанные в параметре variables ресурса template и в объекте узла, оцениваются. Клиент Chef Infra затем передает эти переменные в шаблон, где они будут доступны как переменные экземпляра в шаблоне. Объект узла можно получить так, как если бы он был частью рецепта, используя ту же синтаксическую конструкцию.
Например, простой ресурс шаблона такой:
node['fqdn'] = 'latte'
template '/tmp/foo' do
source 'foo.erb'
variables(x_men: 'are keen')
end
И простой шаблон Embedded Ruby (ERB) такой:
The node <%= node[:fqdn] %> thinks the x-men <%= @x_men %>
Будет рендериться примерно так:
The node latte thinks the x-men are keen
Несмотря на то, что это очень простой пример, для решения даже самых сложных и сложных требований к шаблонам можно использовать все возможности Ruby.
Уточнение файлов
Кулинарная книга часто разрабатывается для работы на множестве платформ и часто должна распространять определенный шаблон на определённую платформу. Кулинарную книгу можно разработать для поддержки распространения шаблонов по платформам, гарантируя, что на каждой системе окажется правильный шаблон.
Шаблон уточнения шаблона зависит от двух вещей: пути поиска и источника. Используется первый совпадающий шаблон:
/host-$fqdn/$source/$platform-$platform_version/$source/$platform/$source/default/$source/$source
Примечание
Чтобы указать определённую версию Windows, используйте номер версии операционной системы. Например, шаблон в templates/windows-6.3 будет развернут на системах, установленных с Windows 8.1.
Используйте массив с свойством source для определения явного пути поиска. Например:
template '/test' do
source ["#{node.chef_environment}.erb", 'default.erb']
end
Следующий пример эмулирует весь шаблон уточнения файлов, определив его как явный путь:
template '/test' do
source %W(
host-#{node['fqdn']}/test.erb
#{node['platform']}-#{node['platform_version']}/test.erb
#{node['platform']}/test.erb
default/test.erb
)
end
Кулинарная книга может иметь структуру каталога /templates такого вида:
/templates/
windows-10
windows-6.3
windows
default
и ресурс, который выглядит примерно так:
template 'C:\path\to\file\text_file.txt' do
source 'text_file.txt'
mode '0755'
owner 'root'
group 'root'
end
Этот ресурс будет сопоставляться в том же порядке, что и структура каталога /templates. Для узла с именем host-node-desktop, на котором работает Windows 8.1, второй элемент будет совпадающим элементом и расположением:
/templates
windows-10/text_file.txt
windows-6.3/text_file.txt
windows/text_file.txt
default/text_file.txt
Нотация хоста
Имена папок в каталогах кулинарных книг должны буквально соответствовать нотации хоста, используемой для сопоставления уточнения шаблонов. Например, если хост имеет имя foo.example.com, то папка должна называться host-foo.example.com.
Частота передачи
Клиент Chef Infra кеширует шаблон при первом запросе. При каждом последующем запросе этого шаблона клиент Chef Infra сравнивает этот запрос с шаблоном, расположенным на сервере Chef Infra. Если шаблоны одинаковы, передача не происходит.
Частичные шаблоны
Шаблон может быть создан таким образом, чтобы содержать ссылки на один (или несколько) меньших файлов шаблонов. (Эти более мелкие файлы шаблонов также называются частями.) К части можно обратиться из файла шаблона одним из следующих способов:
- Используя метод
renderв файле шаблона - Используя ресурс template и свойство
variables.
Атрибут variables
Свойство variables ресурса template можно использовать для ссылки на частичный файл шаблона, используя хеш. Например:
template '/file/name.txt' do
variables partials: {
'partial_name_1.txt.erb' => 'message',
'partial_name_2.txt.erb' => 'message',
'partial_name_3.txt.erb' => 'message',
}
end
где каждый из файлов частичных шаблонов затем может быть объединён с использованием обычных шаблонов Ruby в файле шаблона, таких как:
<% @partials.each do |partial, message| %>
Here is <%= partial %>
<%= render partial, :variables => {:message => message} %>
<% end %>
Метод render
Используйте метод render в шаблоне для ссылки на частичный файл шаблона:
<%= render 'partial_name.txt.erb', :option => {} %>
где partial_name — имя частичного файла шаблона, а :option — один (или несколько) из следующих:
| Вариант | Описание |
|---|---|
:cookbook | По умолчанию предполагается, что частичный файл шаблона находится в кулинарной книге, содержащей основной шаблон. Используйте этот параметр для указания пути к другой кулинарной книге |
:local | Указывает, что имя частичного файла шаблона должно интерпретироваться как путь к файлу в локальной файловой системе или ищется в кулинарной книге с использованием стандартных правил для файлов шаблонов. Установите значение true для интерпретации как пути к файлу в локальной файловой системе и false для использования стандартных правил для файлов шаблонов |
:source | По умолчанию частичный файл шаблона идентифицируется по его имени файла. Используйте этот параметр для указания другого имени или локального пути для использования (вместо имени частичного файла шаблона) |
:variables | Хеш variable_name => value, который будет доступен для частичного файла шаблона. При использовании этого параметра все переменные, определённые в основном шаблоне, которые требуются частичному шаблону, должны быть явно определены с помощью этого параметра |
Например:
<%= render 'simple.txt.erb', :variables => {:user => Etc.getlogin }, :local => true %>
© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/templates/