我试图部署一个使用厨师的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]添加到所有节点的运行列表的开头。