О шаблонах
Шаблон кулинарной книги — это шаблон встроенного Ruby (ERB), используемый для динамической генерации статических текстовых файлов. Шаблоны могут содержать выражения и операторы Ruby и являются отличным способом управления файлами конфигурации. Используйте ресурс template, чтобы добавить шаблоны кулинарной книги в рецепты; поместите соответствующий файл шаблона Embedded Ruby (ERB) в директорию кулинарной книги /templates.
Примечание
Требования
Для использования шаблона необходимо выполнить два действия:
- Добавить ресурс шаблона в рецепт
- Добавить шаблон 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 Client. Оцениваются переменные, указанные в параметре variables ресурса template и в объекте узла. Chef Infra Client затем передает эти переменные в шаблон, где они будут доступны как переменные экземпляра внутри шаблона. Доступ к объекту узла можно получить так же, как если бы он был частью рецепта, используя ту же синтаксис.
Например, такой простой ресурс шаблона:
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 Client кэширует шаблон при первом запросе. При каждом последующем запросе на этот шаблон Chef Infra Client сравнивает этот запрос с шаблоном, расположенным на Chef Infra Server. Если шаблоны одинаковые, передача не происходит.
Частичные шаблоны
Шаблон может быть создан таким образом, чтобы содержать ссылки на один (или несколько) меньших файлов шаблонов. (Эти меньшие файлы шаблонов также называются частями.) К части можно обратиться из файла шаблона одним из следующих способов:
- Используя метод
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/