4

我目前正在更新社区 MySQL 食谱,以便可以使用它来安装 Percona,它是现有 MySQL 的替代品,但具有一些附加功能,可以轻松启用 HA 和集群。

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

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

因此,最终发生的是系统尝试在没有安装 MySQL (Percona) 的开发头文件的情况下编译 mysql gem,即使正确引用它们,由于尚未设置存储库,因此找不到它们。

我创建了一个 '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 食谱中进行了一些挖掘,发现 yum_key 的提供者尝试运行“remote_file”来下载密钥,正如你所期望的那样。但是,此“remote_file”未运行。因此,我尝试将其作为上述资源运行,但它的名称中有一个变量,因此我无法有效地调用它,例如:

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

我想我在这里开始有点像兔子沃伦了。我将继续尝试让这件事发挥作用,但欢迎更多想法。我试图不走在这个秘籍中直接在 repo 中编码的路线,因为我更喜欢重用我知道有效的东西。

4

2 回答 2

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"
于 2013-01-24T01:28:32.563 回答
1

无论您从配方中需要什么资源percona_repo,只需在chef_gem.

例如,如果您需要的东西如下所示:

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

chef_gem然后你可以在声明之前这样做:

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

不幸的是,这确实在两个食谱之间引入了紧密耦合,但是没有办法说“嘿,厨师,包括这个食谱,但是马上做所有的事情而不是以后做,好吗?”

于 2012-11-01T02:17:46.133 回答