ruby - 如何使用 rvmsudo 运行 Chef 命令(使用 rvm 安装乘客)

标签 ruby rvm chef-infra vagrant

我正在将 Chef 与 Vagrant 结合使用,并希望使用 RVM 构建 Rails 堆栈。

这是迄今为止我的 Vagrantfile 配置的片段:

...
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "cookbooks"

  chef.add_recipe "apt"
  chef.add_recipe "build-essential"
  chef.add_recipe "ntp"
  chef.add_recipe "openssl"
  chef.add_recipe "apache2"
  chef.add_recipe "mysql"
  chef.add_recipe "mysql::server"
  chef.add_recipe "redis"
  chef.add_recipe "git"
  chef.add_recipe "rvm::system"
  chef.add_recipe "rvm::gem_package"
  chef.add_recipe "passenger_apache2"

  chef.json = { 
    :mysql => { 
      :server_root_password => 'root',
      :bind_address => '127.0.0.1'
    },
    :redis => {
      :daemonize => 'yes',
      :port => '6379'
    },
    :rvm => {
      :rubies => 'ruby-1.9.3-p194',
      :global_gems => [
        {:name => 'bundler'},
        {:name => 'rake'},
        {:name => 'passenger',
         :version => '3.0.17'
        }
      ]
    },
    :passenger => {
      :version => '3.0.17'
    }
  }
end

启动 vagrant,配置一直有效,直到它尝试安装乘客,然后我收到此错误:

...
ERROR: gem_package[passenger] (passenger_apache2::default line 48) has had an error
ERROR: gem_package[passenger] (/tmp/vagrant-chef-1/chef-solo-1/cookbooks/passenger_apache2/recipes/default.rb:48:in `from_file') had an error:
gem_package[passenger] (passenger_apache2::default line 48) had an error: NoMethodError: undefined method `join' for nil:NilClass
...

通过 sshing 进入 vagrant,我可以看到 RVM 和 gems 安装得很好:

vagrant@lucid32:~$ rvm list

rvm rubies

=* ruby-1.9.3-p194 [ i686 ]

# => - current
# =* - current && default
#  * - default

vagrant@lucid32:~$ gem list

*** LOCAL GEMS ***

bundler (1.2.1)
daemon_controller (1.0.0)
fastthread (1.0.7)
passenger (3.0.17)
rack (1.4.1)
rake (0.9.2.2)
rubygems-bundler (1.1.0)
rvm (1.11.3.5)

手动运行rvmsudo Passenger-install-apache2-module工作正常

所以我很确定问题是 Chef 在未加载 RVM 的情况下运行其命令

这里是 Cookbooks/passenger_apache2/recipes/default.rb 的命令:第 48-55 行

...
gem_package "passenger" do
  version node[:passenger][:version]
end

execute "passenger_module" do
  command 'passenger-install-apache2-module --auto'
  creates node[:passenger][:module_path]
end

我用于 RVM 和 passaenger_apache 的 Recipe 是:

我尝试将 passenger-install-apache2-module --auto 替换为 rvmsudo Passenger-install-apache2-module --auto 但没有成功...

有人知道如何让 rvm 和 rvmsudo 在 Chef 中工作吗?

最佳答案

我相信您认为 Chef 在未加载 rvm 的情况下执行命令是正确的。也许您可以使用 rvm_shell Chef-rvm 命令用于安装乘客。像这样的东西可能会起作用:

rvm_shell "passenger_module" do
  ruby_string "ruby-1.9.3-p194"
  code        "passenger-install-apache2-module --auto"
  creates node[:passenger][:module_path]
end

关于ruby - 如何使用 rvmsudo 运行 Chef 命令(使用 rvm 安装乘客),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550603/

相关文章:

mysql - 为什么 ruby​​ 检测不到无效编码而 mysql 检测到?

ruby - 由于符号链接(symbolic link)错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

Git 使用 Chef git 资源部署主分支或特定提交或标记

ruby-on-rails - 运行 "bundle install"失败,让我运行 "bundle install"

solr - solr 查询中哪些特殊字符需要转义?

ruby - Vagrant with Chef - 配置 VM 时出错

mysql - 嵌套模型的新建和创建操作不保存 user_id

ruby - 如何为 gem 创建模块?

ruby-on-rails - 如何获取铁路中所有国家和城市的列表?

ruby-on-rails - 安装rails报错: Operation not permitted