安装`mysql` gem 以便在`chef-client`中使用?

安装`mysql` gem 以便在`chef-client`中使用?

我正在尝试使用 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]到所有节点的运行列表的开头。

相关内容