chef_gem的依赖关系

时间:2012-10-31 21:28:24

标签: mysql ruby rubygems chef percona

我目前正在更新community MySQL cookbook,以便它可以用来安装Percona,它可以替代MySQL的库存,但有一些附加功能可以轻松启用HA和群集。

我想要能够在食谱中使用'红宝石'食谱,我的所有添加物都运作良好。这使用'chef_gem'提供程序来安装'mysql'rubygem。由于这是一个原生扩展,因此需要进行编译,为此,需要安装MySQL的开发文件。

如果我使用正常的MySQL二进制文件,一切都运行良好,因为MySQL已经在Centos存储库中。但是,为了能够安装Percona软件包,我需要确保repo位于'/etc/yum.repos.d'中。我遇到的问题是,在尝试安装mysql gem之前,我无法让厨师做这项工作。

因此,最终发生的是系统尝试编译mysql gem而没有安装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安装也会失败。

如果有人对如何解决这个问题有任何好主意,请告诉我。

更新

感谢Mark的建议,我现在更新了'ruby'配方,以便我调用资源将新密钥和repo添加到服务器:

resources(:yum_key => "RPM-GPG-KEY-percona").run_action(:add)
resources(:yum_repository => "Percona").run_action(:add)

现在我可以看到这些在厨师的运行中被激活了。但是,当我查看文件系统时,文件不存在,因此安装mysql客户端软件包失败。

我已经在yum cookbook中进行了一些挖掘,并且发现yum_key的提供程序尝试运行'remote_file'来按照您的预期下载密钥。但是这个'remote_file'没有运行。那么我试着将它作为上面的资源运行,但它在名称中有一个变量,所以我无法有效地调用它,例如:

remote_file "/etc/pki/rpm-gpg/#{new_resource.key}" do
    ...
end

我想我开始在这里找到一只兔子。我会继续尝试让这件事情发挥作用,但我们欢迎任何更多的想法。我不想在这个配方的回购中直接编码,因为我更愿意重用我认识的工作。

2 个答案:

答案 0 :(得分:1)

无论您需要从percona_repo食谱中获取哪些资源,只需在chef_gem之前手动调用所需的操作。

例如,如果你需要的东西是这样的:

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

然后你可以在chef_gem声明之前做到这一点:

resources(:yum_repo => 'percona-repo').run_action(:install)
不幸的是,这确实引入了两种食谱之间的紧密联系,但是没有办法说“嘿,厨师,包括这个食谱,但是马上做所有事情而不是以后,”凯?“

答案 1 :(得分:1)

好的,我一直走到兔子洞口。

这似乎有效:

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"