Chef infra 厨师安装一系列预包装的宝石

Chef infra 厨师安装一系列预包装的宝石,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我正在尝试安装我的食谱所需的一系列gem,但我不希望在我的生产机器上安装开发工具(如gcc、gcc-c++、ruby-devel.see以了解更多上下文),因此我将相关gem文件作为参考资料包含在我的食谱中 我正在使用这个代码 node["chef_gems"].each do |pkg, attrs| gem_file = "#{pkg}-#{attrs["version"]}.gem" dest_gem_file = "#{Chef::Config['file_cache_path'

我正在尝试安装我的食谱所需的一系列gem,但我不希望在我的生产机器上安装开发工具(如gcc、gcc-c++、ruby-devel.see以了解更多上下文),因此我将相关gem文件作为参考资料包含在我的食谱中

我正在使用这个代码

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
我遇到的问题

  • 由于文件名为.exist,当前需要运行两次chef?选中,但如果不选中,它将无法编译,因为该文件在编译阶段不存在。有没有更简单的方法来实现这一点
  • 其中一些gem具有依赖性,因此排序问题似乎默认为字母顺序。我将要通过排序键(丑陋)执行命令,我想知道是否有更好的方法
  • 退一步说,这似乎过于复杂。是否有一种更简单的策略来实现安装gems及其依赖项的目标,而无需在生产服务器上安装开发工具
  • 这是没有文件的原始错误。是否存在?检查

    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 /
    
    启动Chef客户端,版本11.4.0
    解析运行列表的烹饪书:[“cis rhel”、“ec2主机名rhel”、“厨师客户端”、“cassandra”]
    同步食谱:
    编辑食谱。。。
    [2013-10-16T18:45:01-04:00]警告:正在从以前的资源(CHEF-3694)中克隆用户[]的资源属性
    [2013-10-16T18:45:01-04:00]警告:当前用户[cassandra]:/var/chef/cache/cookbooks/cassandra/recipes/user.rb:23:in“from_file”
    配方:卡桑德拉::包装
    *chef_gem[cassandra cql]动作安装
    ================================================================================
    在资源“chef_gem[cassandra cql]”上执行操作“install”时出错
    ================================================================================
    Gem::异常
    --------------
    无法在中的[/var/chef/cache/cassandra-cql-1.1.4.gem]处加载gem/
    食谱跟踪:
    ---------------
    /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'
    资源声明:
    ---------------------
    #在/var/chef/cache/cookbooks/cassandra/recipes/packages.rb中
    36:chef_gem包装店
    37:源“#{dest_gem_file}”
    38:操作:安装
    39:完
    40:#完
    汇编资源:
    ------------------
    #在/var/chef/cache/cookbooks/cassandra/recipes/packages.rb:36:in‘block in from_file’中声明
    厨师长(cassandra cql)做什么
    提供者厨师::提供者::包::Rubygems
    操作[:安装]
    重试0次
    重试\u延迟2
    包装名称“cassandra cql”
    来源“/var/chef/cache/cassandra-cql-1.1.4.gem”
    食谱名称“卡桑德拉”
    配方名称“包装”
    结束
    ================================================================================
    /var/chef/cache/cookbooks/cassandra/recipes/default.rb中的配方编译错误
    ================================================================================
    Gem::异常
    --------------
    chef_gem[cassandra cql](cassandra::packages第36行)出现错误:gem::Exception:无法在中的[/var/chef/cache/cassandra-cql-1.1.4.gem]处加载gem/
    食谱跟踪:
    ---------------
    /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'
    相关文件内容:
    ----------------------
    /var/chef/cache/cookbooks/cassandra/recipes/packages.rb:
    29:node[“cassandra”][“chef_gems”]。每个do|pkg,属性|
    30:gem_file=“#{pkg}-#{attrs[“version”]}.gem”
    31:dest#u gem_file=“#{Chef::Config['file_cache_path']}/#{gem_file}”
    32:cookbook_file“#{dest_gem_file}”do
    33:来源“gems/#{gem_文件}”
    34:完
    35:#if File.exist?(“#{dest_gem_File}”)
    36>>厨师长(gem pkg do)
    37:源“#{dest_gem_file}”
    38:操作:安装
    39:完
    40:#完
    41:完
    42:  
    43:#Cassandra的一些分布式软件包在它们的
    44:#安装后;保持它们都相等,在配置之后可以重新启动
    45:#在第一次运行时写入。增加的困难:它们还附带init
    [2013-10-16T18:45:01-04:00]错误:正在运行异常处理程序
    [2013-10-16T18:45:02-04:00]致命:将节点信息保存到/var/chef/cache/failed-run-data.json
    [2013-10-16T18:45:02-04:00]错误:异常处理程序已完成
    Chef客户端失败。0资源已更新
    [2013-10-16T18:45:02-04:00]致命:Stacktrace转储到/var/chef/cache/chef-Stacktrace.out
    [2013-10-16T18:45:02-04:00]致命:Gem::异常:chef_Gem[cassandra cql](cassandra::packages第36行)出现错误:Gem::异常:无法在中的[/var/chef/cache/cassandra-cql-1.1.4.Gem]加载Gem/
    
  • 您可以而且应该跳过
    if File.exist?(“#{dest_gem_File}”)
    段,因为前面的资源将始终创建文件或引发异常
  • 如果您能够做到这一点,那么使用能够处理依赖关系的包管理器安装这些组件可能是一个更好的选择
  • <> LI>如果不可能使用<代码> RuGuEMS 包管理器,因为它需要编译包的本机扩展,您可以考虑打包编译版本并使用系统包管理器来安装它们。
  • 您可以而且应该跳过
    if File.exist?(“#{dest_gem_File}”)
    段,因为前面的资源将始终创建文件或引发异常
  • 如果您能够做到这一点,那么使用能够处理依赖关系的包管理器安装这些组件可能是一个更好的选择
  • 如果由于需要为包编译本机扩展而无法使用
    rubygems
    包管理器,则可以