在Chef和系统Ruby之间共享Gems

38次阅读
没有评论

问题描述

了解到chef_gem资源,但为了保持系统卫生,他希望尽量避免重复,因此希望在Chef内嵌的Ruby和系统范围内共享Gems。此外,他意识到一个令人不安的情况:系统Ruby中的Gems来自已知的本地Yum仓库,并通过LAN上的RPM安装,而chef_gem会从公共互联网获取。最近Python社区的事件让他对此非常担忧。他尝试在食谱中设置ENV['GEM_PATH'],无论是在ruby_block之前还是之内,但似乎没有效果,require操作失败。他漏掉了什么?

解决方案

请注意以下操作可能涉及版本差异,确保在操作前做好备份。

最佳解决方案

让我们逐点来解答你的问题:

  1. 共享Gems
    为了保持系统的稳定性和可维护性,我建议不要混合使用系统范围的Ruby和Chef的Ruby。这是因为Chef的Ruby会随着Chef的版本进行更新,如果混用系统Ruby,可能会导致版本不一致的问题,从而带来兼容性问题。

  2. 使用本地仓库
    如果你担心chef_gem从公共互联网获取Gems,你可以考虑设置一个本地的Gem仓库,以确保Gem的来源可控。你可以搭建一个私有的Gem服务器,或者使用一些支持的构建工具来管理Gem的依赖关系。

  3. 设置Gem源
    如果你希望使用本地仓库,可以在Chef中设置Gem源。你可以在Chef的配置文件client.rb中使用rubygems_url选项来指定Gem源的地址。这将确保Chef在获取Gems时使用你指定的源地址,而不是默认的公共源。这个选项在Chef Client 13.0及以上版本中可用。

  4. GEM_PATH问题
    关于在食谱中设置ENV['GEM_PATH']并不适用于Chef Omnibus软件包,因为它在搜索需要require的Gem时会忽略该环境变量。这可能是为了避免影响系统范围的Ruby。考虑到这一点,我建议避免在Chef的环境中强制设置GEM_PATH

综上所述,为了避免混淆和兼容性问题,最好保持Chef和系统Ruby的独立性,并根据需要设置适当的Gem源。如果你需要使用本地仓库,确保Gem源的地址被正确设置,并充分测试以确保一切正常运行。

请注意,使用新的配置或工具可能会涉及到一些学习和调整的过程,但这将有助于确保你的环境稳定且易于管理。

其他解决方案

如果你仍然希望在食谱中强制设置GEM_PATH,可以尝试查阅Chef的官方文档或社区资源,看看是否有其他用户遇到类似的问题并找到了解决方法。但请谨慎行事,确保你的操作不会影响到系统稳定性和兼容性。

提示:请根据实际情况,谨慎选择适合你需求的解决方案。

正文完