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