在`chef-client`中安装`mysql` gem?

我试图部署一个使用厨师的rails应用程序,为mysql cookbook创build一个数据库,它需要mysql gem。 mysql gem通过使用Ubuntu软件包在系统范围内安装,但是这不适用于从/opt/chef/embedded运行的chef-client

我曾尝试添加这个:

 chef_gem 'mysql' do action :nothing end.run_action(:install) 

但是这需要安装libmysqlclient-dev Ubuntu软件包。 所以我也在前面加了这个:

 package 'libmysqlclient-dev' do action :nothing end.run_action(:install) 

但是,这是在apt配方更新apt存储库之前完成的,因此安装libmysqlclient-dev失败。

这些“黑客”看起来很丑,我无法find一个在适当的时候运行apt-get update的方法。

有人可以帮助我find解决我的问题的正确(最厨师般的方式)(实际的问题是使用application食谱创build数据库)吗?

更新

我已经能够解决这个问题,作为一个丑陋的黑客…我仍然在寻找一个更好的解决scheme:

 execute "apt-get update" do ignore_failure true action :nothing end.run_action(:run) node.set['build_essential']['compiletime'] = true include_recipe "build-essential" %w{build-essential mysql-client libmysqlclient-dev}.each do |p| package p do action :nothing end.run_action(:install) end chef_gem 'mysql' do action :nothing end.run_action(:install) 

mysql::ruby配方允许通过node["mysql"]["client"]["packages"]安装包:

因此将其包含在您的运行列表中:

 run_list( #... "recipe[mysql::ruby]", #... ) 

并在属性中指定您的依赖关系:

 # this is needed for debian based systems node["mysql"]["client"]["packages"] = ["build-essential","mysql-client","libmysqlclient-dev"] 

Debian软件包pipe理系统和gem之间并没有真正的联系,所以答案可能是这样的:

 package "libmysqlclient-dev" do action :install end gem_package "mysql" do action :install end 

chef_gem资源确实安装了一个gem,但是它仅仅用于安装在Chef食谱中使用的gem,查看Chef Resources页面上的所有血腥详细信息)。

为了保持适当的控制,我build议使用apt Opscode社区食谱 ,并将recipe[apt]添加到所有节点的运行列表的开头。