Зависимости для chef_gem

В настоящее время я обновляю поваренную книгу сообщества 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

Я думаю, что начинаю спускаться в кроличью нору. Я буду продолжать пытаться заставить эту вещь работать, но любые другие идеи приветствуются. В этом рецепте я стараюсь не идти по пути прямого кодирования в репозитории, поскольку предпочитаю повторно использовать то, что, как я знаю, работает.


person Russell Seymour    schedule 31.10.2012    source источник
comment
Вы обсуждали это с [mysql (кстати, последнее, что я проверял, mysql2 — жемчужина выбора в наши дни, так что это может иметь значение.) Хотя Stack Overflow — это широкий спектр знаний в области программирования, вам могут понадобиться некоторые реальные вертикально ориентированное знание, а не горизонтальное.   -  person the Tin Man    schedule 01.11.2012
comment
Кстати, +1 за упоминание Перконы. Я посмотрю на это!   -  person the Tin Man    schedule 01.11.2012
comment
это определенно кроличья нора. я смотрю на то же самое. По сути, вам нужно немедленно запустить все, что нужно провайдеру репозитория. ИМО, это одна из сломанных вещей о шеф-поваре :/   -  person Aaron Jensen    schedule 24.01.2013
comment
Пожалуйста, не забудьте отметить ответ как правильный! :)   -  person sethvargo    schedule 01.01.2014


Ответы (2)


Какой бы ресурс(ы) вам ни понадобился из вашего percona_repo рецепта, просто вызовите нужное действие над ним/ними вручную перед chef_gem.

Например, если нужная вам вещь выглядит так:

yum_repo "percona-repo" do
  action :install
 ...
end

Тогда вы могли бы сделать это прямо перед объявлением chef_gem:

resources(:yum_repo => 'percona-repo').run_action(:install)

Это, к сожалению, вводит тесную связь между двумя рецептами, но нельзя сказать: «Эй, Шеф, включи этот рецепт, но сделай все в нем сразу, а не позже, ладно?»

person Mark Reed    schedule 01.11.2012
comment
Спасибо, почти сработало. Теперь я вижу, что репозиторий пытается добавиться из запуска шеф-повара, но на диск ничего не записывается, поэтому у меня нет нового репозитория в «/etc/yum.repos.d». Я явно упускаю здесь что-то фундаментальное, так как это продвинуло меня намного дальше, чем раньше. - person Russell Seymour; 01.11.2012

Хорошо, я прошел весь путь вниз по кроличьей норе.

Похоже, это работает:

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"
person Aaron Jensen    schedule 24.01.2013