2013-10-16 1 views
1

요리법에 필요한 일련의 보석을 설치하려고합니다. 그러나 개발 도구 (gcc, gcc-C++, ruby-devel 등)를 설치하지 않을 것입니다. 자세한 내용은 this을 참조하십시오.)를 대신 사용하여 관련 보석 파일을 내 요리 책에 리소스로 포함 시켰습니다.요리사가 미리 포장 한 보석 세트를 설치합니다

나는 현재이 두 요리사가 필요

  1. 에 실행하고 문제점이 코드

    node["chef_gems"].each do |pkg, attrs| 
        gem_file = "#{pkg}-#{attrs["version"]}.gem" 
        dest_gem_file = "#{Chef::Config['file_cache_path']}/#{gem_file}" 
        cookbook_file "#{dest_gem_file}" do 
         source "gems/#{gem_file}" 
        end 
        if File.exist?("#{dest_gem_file}") 
        chef_gem pkg do 
         source "#{dest_gem_file}" 
         action :install 
        end 
        end 
    end 
    

    을 사용하고 있습니다 때문에 File.exist의 실행? 컴파일 단계에서 파일이 존재하지 않기 때문에 컴파일되지 않습니다. 이 작업을 수행하는 간단한 방법이 있습니까?

  2. 이러한 보석 중 일부는 종속성을 가지므로 기본적으로 알파벳순으로 보이는 항목을 주문합니다. 나는 (더 못생긴) 정렬 순서 키를 통해 명령 시행의 길을 내려 가고 있으며, 더 좋은 방법이 있는지 궁금해하고있다.
  3. 뒤로 물러서서, 이것은 지나치게 복잡해 보입니다. 프로덕션 서버에 개발 도구를 설치하지 않고도 보석 및 그 종속성을 설치한다는 목표를 달성하기위한보다 간단한 전략이 있습니까?

File.exist가없는 원래 오류가 있습니까? 이전 자원이 항상 파일을 만들거나 예외를 발생하므로

Starting Chef Client, version 11.4.0 
resolving cookbooks for run list: ["cis-rhel", "ec2-hostname-rhel", "chef-client", "cassandra"] 
Synchronizing Cookbooks: 
<REDACTED> 
Compiling Cookbooks... 
[2013-10-16T18:45:01-04:00] WARN: Cloning resource attributes for user[<REDACTED>] from prior resource (CHEF-3694) 
<REDACTED> 
[2013-10-16T18:45:01-04:00] WARN: Current user[cassandra]: /var/chef/cache/cookbooks/cassandra/recipes/user.rb:23:in `from_file' 
Recipe: cassandra::packages 
    * chef_gem[cassandra-cql] action install 
================================================================================ 
Error executing action `install` on resource 'chef_gem[cassandra-cql]' 
================================================================================ 


Gem::Exception 
-------------- 
Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in/


Cookbook Trace: 
--------------- 
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file' 
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `each' 
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `from_file' 
/var/chef/cache/cookbooks/cassandra/recipes/default.rb:23:in `from_file' 


Resource Declaration: 
--------------------- 
# In /var/chef/cache/cookbooks/cassandra/recipes/packages.rb 

36:  chef_gem pkg do 
37:  source "#{dest_gem_file}" 
38:  action :install 
39:  end 
40: # end 



Compiled Resource: 
------------------ 
# Declared in /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file' 

chef_gem("cassandra-cql") do 
    provider Chef::Provider::Package::Rubygems 
    action [:install] 
    retries 0 
    retry_delay 2 
    package_name "cassandra-cql" 
    source "/var/chef/cache/cassandra-cql-1.1.4.gem" 
    cookbook_name "cassandra" 
    recipe_name "packages" 
end 




================================================================================ 
Recipe Compile Error in /var/chef/cache/cookbooks/cassandra/recipes/default.rb 
================================================================================ 


Gem::Exception 
-------------- 
chef_gem[cassandra-cql] (cassandra::packages line 36) had an error: Gem::Exception: Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in/


Cookbook Trace: 
--------------- 
    /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in `block in from_file' 
    /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `each' 
    /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:29:in `from_file' 
    /var/chef/cache/cookbooks/cassandra/recipes/default.rb:23:in `from_file' 


Relevant File Content: 
---------------------- 
/var/chef/cache/cookbooks/cassandra/recipes/packages.rb: 

29: node["cassandra"]["chef_gems"].each do |pkg, attrs| 
30: gem_file = "#{pkg}-#{attrs["version"]}.gem" 
31: dest_gem_file = "#{Chef::Config['file_cache_path']}/#{gem_file}" 
32: cookbook_file "#{dest_gem_file}" do 
33:  source "gems/#{gem_file}" 
34: end 
35: # if File.exist?("#{dest_gem_file}") 
36>>  chef_gem pkg do 
37:  source "#{dest_gem_file}" 
38:  action :install 
39:  end 
40: # end 
41: end 
42: 
43: # Some distributed packages of Cassandra start the service in their 
44: # postinstall; keep them all equal and a restart can be done after the configs 
45: # are written on the first run. Added difficulty: they also come with init 



[2013-10-16T18:45:01-04:00] ERROR: Running exception handlers 
[2013-10-16T18:45:02-04:00] FATAL: Saving node information to /var/chef/cache/failed-run-data.json 
[2013-10-16T18:45:02-04:00] ERROR: Exception handlers complete 
Chef Client failed. 0 resources updated 
[2013-10-16T18:45:02-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out 
[2013-10-16T18:45:02-04:00] FATAL: Gem::Exception: chef_gem[cassandra-cql] (cassandra::packages line 36) had an error: Gem::Exception: Cannot load gem at [/var/chef/cache/cassandra-cql-1.1.4.gem] in/
+0

정확한 답을 표시하는 것을 잊지 마십시오! :) – sethvargo

답변

1
  1. 당신은 그리고, if File.exist?("#{dest_gem_file}") 세그먼트를 건너 뛰어야 할 수 확인.
  2. 종속성을 처리 할 수있는 패키지 관리자로이를 설치하는 것이 훨씬 더 좋은 방법 일 수 있습니다.
  3. rubygems 패키지 관리자에서 패키지의 네이티브 확장을 컴파일해야하기 때문에이 작업을 수행 할 수없는 경우 컴파일 된 버전을 패키징하고 시스템 패키지 관리자를 사용하여 패키지를 설치할 수 있습니다.
+0

re : 1. 나는 시도하고 싶습니다. 그러나 요리법 컴파일 오류가 발생합니다. 왜냐하면 2 단계 요리사 처리 (즉, 조리법을 컴파일하려고 시도하고 파일이 아직 존재하지 않기 때문에 실패하기 때문에, 그래서 생성 될 실행 단계에 도달하지 못한다.). if를 추가하는 것은 "고정 된"것이지만 여전히 2 명의 셰프가 필요합니다. 나는 당신이 내가 뭔가를 놓치고 있다고 생각하고 이전의 설명이 이치에 맞지 않는다면 그 오류의 세부 사항을 게시 할 수있다. – travelingsultan

+0

아니, 내 실수 - chef_gem은 레시피 컴파일 단계 전/도중에 젬을 설치하므로 레시피에서 즉시 요구 될 수 있습니다. 이것은 요리사 레시피에서 보석을 사용하고자 할 때만 유용합니다. 그렇지 않으면'gem_package' 리소스 ('File.exist?'체크가 필요 없을 것입니다)를 사용해야합니다. – borntyping

+0

나는 레시피 중에 만 필요로하고 설명했던 동작을 기대했지만 설명했던 방식대로 실패 했으므로 그 상태로 돌아가서 (조금 시간이 걸릴 수 있습니다) 오류를 게시하십시오. 아마도 그 원인을 잘못 읽었을 것입니다. – travelingsultan

관련 문제