Spec-Zone.ru › Chef 18

О библиотеках

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

Библиотека позволяет включать произвольный Ruby-код в кулинарную книгу. Наиболее распространённое применение библиотек — написание вспомогательных функций, которые используются в рецептах и пользовательских ресурсах. Файл библиотеки — это файл Ruby, расположенный в каталоге /libraries кулинарной книги. Поскольку библиотека создаётся с использованием Ruby, в файле библиотеки можно выполнить всё, что можно сделать с Ruby, включая расширенные функции, такие как расширение встроенных классов Chef.

Используйте библиотеку для:

  • Подключения к базе данных
  • Получения секретов из облачного провайдера
  • Взаимодействия с провайдером LDAP
  • Выполнения любых действий, которые можно выполнить с помощью Ruby

Синтаксис

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

Модули-помощники для шаблонов

В библиотеке можно определить модуль-помощник для шаблонов. Это полезно, когда необходимо повторно использовать расширения в нескольких рецептах или упростить управление кодом, который в противном случае определяется в каждом рецепте.

template '/path/to/template.erb' do
  helpers(MyHelperModule)
end

Примеры

Следующие примеры демонстрируют, как использовать библиотеки кулинарных книг.

Создание пространства имён

База данных может содержать список виртуальных хостов, используемых клиентами. Можно создать пользовательское пространство имён, которое выглядит примерно так:

# Sample provided by "Arjuna (fujin)". Thank you!

require 'sequel'

class Chef::Recipe::ISP
  # We can call this with ISP.vhosts
  def self.vhosts
    v = []
    @db = Sequel.mysql(
      'web',
      user: 'example',
      password: 'example_pw',
      host: 'dbserver.example.com'
    )
    @db[
      "SELECT virtualhost.domainname,
           usertable.userid,
           usertable.uid,
           usertable.gid,
           usertable.homedir
       FROM usertable, virtualhost
       WHERE usertable.userid = virtualhost.user_name"
      ].all do |query|
      vhost_data = {
        servername: query[:domainname],
        documentroot: query[:homedir],
        uid: query[:uid],
        gid: query[:gid],
      }
      v.push(vhost_data)
    end
    Chef::Log.debug('About to provision #{v.length} vhosts')
    v
  end
end

После создания пользовательского пространства имён его можно использовать в рецепте, например, так:

ISP.vhosts.each do |vhost|
  directory vhost[:documentroot] do
    owner vhost[:uid]
    group vhost[:gid]
    mode '0755'
    action :create
  end

  directory "#{vhost[:documentroot]}/#{vhost[:domainname]}" do
    owner vhost[:uid]
    group vhost[:gid]
    mode '0755'
    action :create
  end
end

Расширение рецепта

Запись клиента хранится в файле атрибутов, который выглядит так:

mycompany_customers({
  bob: {
    homedir: '/home/bob',
    webdir: '/home/bob/web',
  },
}
)

Простой рецепт может содержать что-то вроде этого:

directory node["mycompany_customers"]["bob"]["webdir"] do
  owner 'bob'
  group 'bob'
  action :create
end

Или более краткая версия того же простого рецепта:

directory customer(:bob)[:webdir] do
  owner 'bob'
  group 'bob'
  action :create
end

Можно создать простую библиотеку, которая расширяет Chef::Recipe::, например так:

class Chef
  class Recipe
    # A shortcut to a customer
    def customer(name)
      node["mycompany_customers"][name]
    end
  end
end

Перебор записей

Запись клиента хранится в файле атрибутов, который выглядит так:

mycompany_customers({
  bob: {
    homedir: '/home/bob',
    webdir: '/home/bob/web',
  },
}
)

Если в среде есть много записей клиентов, можно использовать простой рецепт для перебора каждого клиента, например, так:

all_customers do |name, info|
  directory info[:webdir] do
    owner name
    group name
    action :create
  end
end

Можно создать простую библиотеку, которая расширяет Chef::Recipe::, например так:

class Chef
  class Recipe
    def all_customers(&block)
      node["mycompany_customers"].each do |name, info|
        block.call(name, info)
      end
    end
  end
end

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

Spec-Zone.ru

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