【问题标题】:Order of executing Chef recipes in a single cookbook在单个食谱中执行 Chef 食谱的顺序
【发布时间】:2014-07-16 22:26:18
【问题描述】:

我有一本包含两个食谱的食谱:recipe/install.rbrecipe/configure.rb

install.rb 中,我安装了所有包,gem_packages 和configure,在configure.rb 中使用它们。我在install.rb 中安装了一个gem_package,并在configure.rb 中将其用作require <that-gem>

无论 runlist 的顺序如何,chef-client 执行都会失败,并指出缺少 <that-gem>。如果我先运行install recipe 然后运行configure recipe,一切正常。有没有一种方法可以让一个厨师按顺序运行两个食谱?我尝试提及include_recipe 和所有可能的解决方案。

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    Chef 客户端运行分为两个阶段。

    • 首先是资源编译阶段,所有的 ruby​​ 都在这个阶段 加载后,解析节点属性并生成运行列表。

    • 接下来是执行阶段,其中运行列表中的配方 被执行。

    您的配方所依赖的 Gem 需要在执行阶段可用,这会带来一些先有鸡还是先有蛋的问题,因此您需要先使用一些技巧来安装 gem。

    安装 gem 供 Chef 使用时,使用 chef_gem 安装它们。

    chef_gem "your_gem"
    
    require 'your_gem'
    

    如果您开始在 libraries 中使用 gem,这可能会有点棘手,因为编译时需要库,并且您无法在编译前执行操作。在这种情况下,您需要在加载时很好地失败,以便可以安装 gem。

    begin
      require 'your_gem'
    rescue LoadError
      warn "Load of [your_gem] failed. Should be installed by install.rb"
    end
    

    然后确保在安装开始之前不要使用 gem 在 Chef 运行中提供的任何对象。

    【讨论】:

    • 这不是真的。 chef_gem 资源在编译时自动运行(无需使用run_action)。它还清除了宝石路径。你确实仍然需要它。
    • 谢谢。正在从gem_package 变形它。
    猜你喜欢
    • 2014-11-06
    • 2012-10-31
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多