Spec-Zone.ru › Chef 16

О шаблонах

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

Шаблон кулинарной книги — это шаблон встроенного Ruby (ERB), используемый для динамической генерации статических текстовых файлов. Шаблоны могут содержать выражения и операторы Ruby и являются отличным способом управления файлами конфигурации. Используйте ресурс template, чтобы добавить шаблоны кулинарной книги в рецепты; поместите соответствующий файл шаблона Embedded Ruby (ERB) в директорию кулинарной книги /templates.

Примечание

Chef Infra Client использует Erubis для шаблонов, что является быстрым, безопасным и расширяемым реализацией встроенного Ruby. Erubis должен быть знаком участникам сообществ Ruby on Rails, Merb или Puppet. Дополнительную информацию об Erubis можно найти по адресу: http://www.kuwata-lab.com/erubis/.

Требования

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

  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 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.

Специфика файлов

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

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

  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 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/

Spec-Zone.ru

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