我目前正在更新
community MySQL cookbook,以便它可以用来安装Percona,这是一个替代MySQL的库存,但有一些附加的功能,可以轻松启用HA和群集.
我所有的添加都很有效,直到我想能够在食谱中使用’ruby’食谱.这使用’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
我想我开始在这里找到一只兔子.我会继续尝试让这件事情发挥作用,但我们欢迎任何更多的想法.我不想在本文中的回购中直接编码,因为我更喜欢重用我知道工作的东西.
最佳答案 无论您需要从percona_repo配方中获得哪些资源,只需在chef_gem之前手动调用所需的操作/它们.
例如,如果你需要的东西看起来像这样:
yum_repo "percona-repo" do
action :install
...
end
然后你可以在chef_gem声明之前做到这一点:
resources(:yum_repo => 'percona-repo').run_action(:install)
不幸的是,这确实引入了两种食谱之间的紧密联系,但没有办法说“嘿,厨师,包括这个食谱,但是马上就做了所有事情而不是以后,”凯?