Spec-Zone.ru › Chef 16

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

[править на 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