我正在尝试使用 chef 部署 rails 应用程序,为了让 mysql cookbook 创建数据库,它需要 gem。gemmysql
是使用 Ubuntu 包在系统范围内安装的,但从运行的程序mysql
无法使用它。chef-client
/opt/chef/embedded
我尝试添加这个:
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
失败。
这些“黑客”看起来很丑陋,我无法找到apt-get update
在正确的时间运行它们的方法。
有人可以帮我找到正确的(最像厨师的)方法来解决我的问题吗(实际的问题是使用食谱创建数据库application
)?
更新
我已经能够通过这个丑陋的黑客修复该配方的问题......我仍在寻找更好的解决方案:
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)
答案1
该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"]
答案2
Debian 包管理系统和 gem 之间实际上没有联系,所以答案可能是这样的:
package "libmysqlclient-dev" do
action :install
end
gem_package "mysql" do
action :install
end
(该chef_gem
资源确实安装了一个 gem,但它仅用于安装在 Chef 菜谱中使用。查看所有详细信息厨师资源页面)。
为了控制 apt,我建议使用apt Opscode 社区手册并将其添加recipe[apt]
到所有节点的运行列表的开头。