О библиотеках
Библиотека позволяет включать произвольный код 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/