Зависимости для chef_gem
В настоящее время я обновляю кулинарную книгу сообщества MySQL, чтобы ее можно было использовать для установки Percona, которая является заменой стандартного MySQL, но имеет некоторые дополнительные функции, позволяющие легко включить HA и кластеризацию.
Все мои дополнения работали хорошо, пока я не захотел использовать рецепт "ruby" в кулинарной книге. Для этого используется поставщик 'chef_gem', чтобы установить 'mysql' rubygem. Поскольку это собственное расширение, его необходимо скомпилировать, и для этого необходимо установить файлы разработки для MySQL.
Если я использую обычные двоичные файлы MySQL, все работает хорошо, поскольку MySQL уже находится в репозиториях Centos. Однако, чтобы я мог установить пакеты Percona, мне нужно убедиться, что репозиторий находится в /etc/yum.repos.d. Проблема, с которой я столкнулся, заключается в том, что я не могу заставить шеф-повара выполнить эту работу, прежде чем пытаться установить самоцвет mysql.
Таким образом, в конечном итоге происходит попытка системы скомпилировать гем mysql без установленных файлов заголовков разработки для MySQL (Percona), и, даже если на них правильно ссылаются, они не найдены, так как хранилище не было настроено.
Я создал рецепт percona-repo, который выполняет эту работу с использованием провайдера yum, но он не запускается раньше, чем chef_gem. Я знаю, что у chef есть два этапа запуска, и я предполагаю, что chef_gem собирает все гемы на этапе компиляции, независимо от того, где они находятся в общем списке выполнения, и затем устанавливает все элементы, запрошенные в начале. Рецепт хранилища будет запущен впоследствии.
Я попытался поиграть с рецептом Ruby, чтобы сделать что-то вроде:
include_recipe "mysql::percona_repo"
node['mysql']['client']['packages'].each do |mysql_pack|
package mysql_pack do
action :nothing
end.run_action(:install)
end
chef_gem "mysql" do
action :nothing
end.run_action(:install)
Но это не работает. Chef_gem всегда запускается раньше, чем мой рецепт precona_repo, поэтому установка пакета не удалась, что, если бы оно зашло так далеко, означало бы, что установка ruby gem также не удалась.
Если у кого-то есть какие-нибудь яркие идеи, как я могу решить эту проблему, пожалуйста, дайте мне знать
Обновить
Благодаря предложению Марка, я теперь обновил рецепт 'ruby', чтобы я вызывал ресурсы для добавления нового ключа и репо на сервер:
resources(:yum_key => "RPM-GPG-KEY-percona").run_action(:add)
resources(:yum_repository => "Percona").run_action(:add)
И теперь я вижу, как они активируются в шеф-поваре. Однако, когда я смотрю на файловую систему, файлов там нет, поэтому установка клиентских пакетов mysql завершается неудачно.
Я покопался в кулинарной книге yum и обнаружил, что провайдер для yum_key пытается запустить 'remote_file', чтобы загрузить ключ, как и следовало ожидать. Однако этот 'remote_file' не работает. Затем я попытался запустить его как ресурс, подобный описанному выше, но у него есть переменная в имени, поэтому я не могу вызвать его эффективно, например:
remote_file "/etc/pki/rpm-gpg/#{new_resource.key}" do
...
end
Я думаю, что я начинаю спускаться немного кроличьей Уорни здесь. Я буду продолжать пытаться заставить вещь работать, но больше идей приветствуются. Я стараюсь не идти по пути прямого кодирования в репо в этом рецепте, так как я предпочитаю повторно использовать вещи, которые, как я знаю, работают.
2 ответа
Какой бы ресурс (ы) вам нужен от вашего percona_repo
рецепт, просто вызвать нужное действие на него / них вручную, прежде чем chef_gem
,
Например, если нужная вещь выглядит так:
yum_repo "percona-repo" do
action :install
...
end
Тогда вы могли бы сделать это прямо перед chef_gem
объявление:
resources(:yum_repo => 'percona-repo').run_action(:install)
Это, к сожалению, создает тесную связь между двумя рецептами, но нет никакого способа сказать "эй, шеф, включи этот рецепт, но делай все в нем сразу, а не позже, ладно?"
Хорошо, я прошел весь путь вниз по кроличьей норе.
Это похоже на работу:
include_recipe "percona::client"
resources(:yum_key => "RPM-GPG-KEY-percona").run_action(:add)
begin
resources(:remote_file => "/etc/pki/rpm-gpg/RPM-GPG-KEY-percona").run_action(:create)
rescue Chef::Exceptions::ResourceNotFound
end
resources("yum_repository[CentOS-Percona]").run_action(:add)
begin
resources(:template => "/etc/yum.repos.d/CentOS-Percona.repo").run_action(:create)
rescue Chef::Exceptions::ResourceNotFound
end
%w(
Percona-Server-shared-compat
Percona-Server-client-55
Percona-Server-devel-55
).each do |package|
package(package).run_action(:install)
end
chef_gem "mysql"