安装宝石时厨师崩溃了

时间:2017-10-25 09:44:38

标签: ruby vagrant chef

我使用厨师和流浪汉作为供应者。

当我尝试按如下方式安装gem时,应用程序崩溃了:

metadata.rb

gem 'faraday'
gem 'json'

default.rb

require 'faraday'
require 'json'

conn = Faraday.new(:url => 'http://127.0.0.1:8200')

此错误引发:

==> default: Running handlers:
==> default: [2017-10-25T09:42:43+00:00] ERROR: Running exception handlers
==> default: Running handlers complete
==> default: [2017-10-25T09:42:43+00:00] ERROR: Exception handlers complete
==> default: Chef Client failed. 0 resources updated in 19 seconds
==> default: [2017-10-25T09:42:43+00:00] INFO: Sending resource update report (run-id: 7f4593f5-1c86-409c-95fe-988f09501740)
==> default: [2017-10-25T09:42:43+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> default: [2017-10-25T09:42:43+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
==> default: [2017-10-25T09:42:43+00:00] ERROR: Expected process to exit with [0], but received '5'
==> default: ---- Begin output of bundle install ----
==> default: STDOUT: Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
==> default: installing your bundle as root will break this application for all non-root
==> default: users on this machine.
==> default: Fetching gem metadata from https://rubygems.org/
==> default: Fetching version metadata from https://rubygems.org/
==> default: Resolving dependencies...
==> default: Installing multipart-post 2.0.0
==> default: Installing json 2.1.0 with native extensions
==> default:
==> default: Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
==> default:
==> default:     current directory: /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.1.0/ext/json/ext/generator
==> default: /opt/chef/embedded/bin/ruby -r ./siteconf20171025-3434-1qh8whd.rb extconf.rb
==> default: creating Makefile
==> default:
==> default: current directory: /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.1.0/ext/json/ext/generator
==> default: make "DESTDIR=" clean
==> default:
==> default: current directory: /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.1.0/ext/json/ext/generator
==> default: make "DESTDIR="
==> default: compiling generator.c
==> default: make: gcc: Command not found
==> default: make: *** [generator.o] Error 127
==> default:
==> default: make failed, exit code 2
==> default:
==> default: Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.1.0 for inspection.
==> default: Results logged to /opt/chef/embedded/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/json-2.1.0/gem_make.out
==> default: Using bundler 1.12.5
==> default: Installing faraday 0.13.1
==> default: An error occurred while installing json (2.1.0), and Bundler cannot continue.
==> default: Make sure that `gem install json -v '2.1.0'` succeeds before bundling.
==> default: STDERR:
==> default: ---- End output of bundle install ----
==> default: Ran bundle install returned 5
==> default: [2017-10-25T09:42:43+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

似乎缺少gcc,但我无法安装它,因为它首先尝试安装gems然后执行配方,所以它在我可以做任何事情之前崩溃。

- 编辑 -

我添加了这些行并且正在运行:

metadata.rb :(从这里删除gem依赖)

depends 'hashicorp-vault', '~> 2.5.0'
depends 'build-essential', '~> 8.0.3'

default.rb:

include_recipe 'hashicorp-vault::default'
chef_gem 'faraday'
chef_gem 'json'
require 'faraday'
require 'json'

3 个答案:

答案 0 :(得分:2)

Chef-y安装gcc的方法是使用build-essential食谱。

答案 1 :(得分:0)

在自定义主厨配置之前添加shell配置程序?

例如,在您的Vagrant文​​件中:

Vagrant.configure("2") do |config|
    config.vm.provision :shell, inline: 'yum install -y gcc'
    config.vm.provision :chef, inline: '...'
end

答案 2 :(得分:0)

食谱完全能够运行任意命令,所以如果你知道如何手动操作,你可以在厨师的帮助下完成。话虽如此,你应该保护任何任意命令,这样它们就不会在每次配方运行时运行,只有在需要它们时才会运行。

execute 'sudo yum groupinstall \'Development Tools\'' unless <your logic for 
detecting gcc goes here>

Chef还有Ohai在开始运行之前收集有关运行的元数据,包括您正在运行的操作系统,因此您可以通过利用它来使您的配方成为多平台。

https://docs.chef.io/dsl_recipe.html

include_recipe 'mycookbook::debian' if node['platform_family'] == 'debian'
include_recipe 'mycookbook::rhel' if node['platform_family'] == 'rhel'

或者,如果您计划拥有多种平台类型,那么为您提供更多灵活性

possible_platforms = ['debian', 'rhel']
if possible_platforms.contains? node['platform_family']
   include_recipe "mycookbook::node['platform_family']"
else
    puts 'This platform isn't valid'
end