Spec-Zone.ru › Chef 18

О шаблонах

[править на GitHub]

Шаблон кулинарной книги — это шаблон 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

Требования

Для использования шаблона необходимо выполнить два действия:

  1. В рецепт необходимо добавить ресурс шаблона
  2. В кулинарную книгу необходимо добавить шаблон 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.

Уточнение файлов

Кулинарная книга часто разрабатывается для работы на множестве платформ и часто должна распространять определенный шаблон на определённую платформу. Кулинарную книгу можно разработать для поддержки распространения шаблонов по платформам, гарантируя, что на каждой системе окажется правильный шаблон.

Шаблон уточнения шаблона зависит от двух вещей: пути поиска и источника. Используется первый совпадающий шаблон:

  1. /host-$fqdn/$source
  2. /$platform-$platform_version/$source
  3. /$platform/$source
  4. /default/$source
  5. /$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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API