【问题标题】:How would I include and configure a ruby library in a Chef recipe?如何在 Chef 食谱中包含和配置 ruby​​ 库?
【发布时间】:2023-04-24 21:01:01
【问题描述】:

我想在我的 Chef 食谱中包含 Diplomat gem,以便我可以在 .erb 模板中执行 Consul 变量查找。

我需要配置 Consul URL:

irb(main):015:0> require 'diplomat'
irb(main):016:0> Diplomat.configure do |config|
irb(main):017:1*   config.url = "consulurl:80"
irb(main):018:1> end

设置一个变量作为 URL 路径:

irb(main):020:0> kv_path = "path/to/variable"
=> "path/to/variable"

最后,在模板中执行查找。

irb(main):022:0> foo = Diplomat::Kv.get(kv_path + '/test_foo_123')
=> "bar"

我需要在说明书的什么地方编写上面的配置代码,以便我可以在 .erb 模板中执行变量查找?

【问题讨论】:

    标签: ruby chef-infra cookbook


    【解决方案1】:

    您想使用chef_gem 资源,但请确保在编译阶段运行它:

    chef_gem 'diplomat' do
      action :nothing
      compile_time false
    end.run_action(:install)
    require 'diplomat'
    

    【讨论】:

    • 这保存了我的厨师食谱,因为 require 没有加载系统 gem。我已经使用上述命令专门为厨师下载了 gem。然后使用下面的行使其加载 chef_gem "down" require 'down'
    • @coderanger 谢谢,但你说'确保在'编译阶段'运行它,但你有compile_time false。这是一个错字还是我误解了?
    【解决方案2】:

    使用 Chef 安装 gems 相对轻松。大多数情况下,您可以使用 gem_package 资源,其行为与原生包资源非常相似:

    gem_package 'httparty'

    您甚至可以指定要安装的 gem 版本:

    gem_package 'httparty' do version '0.12.0' end

    您可能还看到了 chef_gem 资源。有什么区别?

    chef_gem 和 gem_package 资源都用于安装 Ruby 宝石。对于安装了 chef-client 的任何机器,有 Ruby 的两个实例。一种是标准的、系统范围的实例 Ruby 和另一个是专用实例,仅适用于 厨师客户。使用 chef_gem 资源将 gems 安装到 专用于厨师客户的 Ruby 实例。使用 gem_package 资源来安装所有其他 gem(即安装 gems 系统范围)。

    来源:https://sethvargo.com/using-gems-with-chef/

    【讨论】:

    • 正如您在 2013 年所想象的那样,该帖子已经过时了。请忽略大部分内容。
    最近更新 更多