В настоящее время я обновляю поваренную книгу сообщества MySQL, чтобы ее можно было использовать для установки Percona, которая является вместо стандартного MySQL, но имеет некоторые дополнительные функции, позволяющие легко включить высокую доступность и кластеризацию.
Все мои дополнения работали хорошо, пока я не захотел использовать «рубиновый» рецепт в поваренной книге. Это использует поставщика «chef_gem» для установки rubygem «mysql». Поскольку это собственное расширение, его необходимо скомпилировать, а для этого необходимо установить файлы разработки для MySQL.
Если я использую обычные двоичные файлы MySQL, все работает хорошо, поскольку MySQL уже находится в репозиториях Centos. Однако, чтобы я мог установить пакеты Percona, мне нужно убедиться, что репозиторий находится в «/etc/yum.repos.d». Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить шеф-повара выполнить эту работу, прежде чем пытаться установить гем mysql.
Итак, что в конечном итоге происходит, так это то, что система пытается скомпилировать гем mysql без установленных файлов заголовков разработки для MySQL (Percona), и даже если на них ссылаются правильно, они не найдены, поскольку репозиторий не был настроен.
Я создал рецепт «percona-repo», который выполняет эту работу с использованием провайдера «yum», но он не запускается раньше, чем «chef_gem». Я знаю, что у шеф-повара есть две фазы для запуска, и я предполагаю, что '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
Я думаю, что начинаю спускаться в кроличью нору. Я буду продолжать пытаться заставить эту вещь работать, но любые другие идеи приветствуются. В этом рецепте я стараюсь не идти по пути прямого кодирования в репозитории, поскольку предпочитаю повторно использовать то, что, как я знаю, работает.