【问题标题】:chef how to overwrite attribtues in json file厨师如何覆盖json文件中的属性
【发布时间】:2014-01-20 10:31:49
【问题描述】:

我正在尝试使用不同的属性两次运行相同的配方。 有没有办法在运行列表中指定它? 示例:

"myRecipe":{
"run-list": "recipe[test], recipe[test]"
}

第一个应该有 flag=false 而第二个应该用 flag=true 执行。

【问题讨论】:

  • 您是独立厨师还是独立厨师?其次,你明白厨师被设计成无能的吗?换句话说,你想运行多少次,结果应该是一样的。我想也许你想要的结果最好在同一个食谱中使用两个食谱。

标签: attributes chef-infra recipe


【解决方案1】:

在我看来,某些 Chef 食谱写得非常好,例如 https://github.com/daptiv/visualstudio 的 visualstudio 食谱。

我确实有需要运行此食谱两次的情况。我必须在机器上安装 Visual Studio 2012 和 2013 才能编译不同的源代码。这些版本的 Visual Studio 通过指向 XML 文件具有完全相同的静默安装过程,因此很容易使其适用于 2012 年和 2013 年。

我能够创建一个 Chef 角色文件来覆盖 visualstudio 食谱的属性,以指向我的私有 Visual Studio 2012 ISO。那很简单。然后我创建了另一个用于安装 2013 的 Chef 角色文件以指向单独的 Visual Studio 2013 ISO。由于 Chef 没有两次运行该配方,因此最终只安装了 Visual Studio 2013。:(

如果我必须制作两本“visualstudio”食谱的本地副本,那就太糟糕了。

【讨论】:

    【解决方案2】:

    I answered a similar question previously: 简短的版本是,你需要修改你的想法。如果您需要安装和配置软件,最好考虑将其拆分为两部分。

    更长的答案:你看过opscode community site上的任何食谱吗?许多模式重复出现,其他人发表的工作肯定会很有用......尤其是当你似乎刚刚开始接触厨师时。

    【讨论】:

    • 将我引至 opscode 页面是没有用的,因为我下面的示例直接来自他们的官方文档,并且正如我所提到的那样失败了;如果您认为我在尝试文档之前就来到了这个站点,那么您就大大低估了我。无论如何,谢谢。
    【解决方案3】:

    我也尝试过使用资源:

    define :installx, :cmd=>'good', :upgrade=>true do
      Chef::Log.info('cmd = #{params[:cmd]}')
      if params[:upgrade]
        Chef::Log.info('upgrading...')
      else
        Chef::Log.info('installing...')
      end
    end
    
    installx resource
    installx "name" do
      cmd "install 1"
      upgrade true
    end
    

    它会出错:“错误:找不到用于定义的资源” 这几乎完全出自官方文档。如果有人知道这是什么原因,请告诉我。

    【讨论】:

    • Ruby 函数用def 声明,而不是define。我想你想要两个写一个 LWRP,这就是模式的样子。以下是如何编写自定义 LWRP:docs.opscode.com/lwrp_custom.html
    【解决方案4】:

    不,这是不可能的。你必须在你的配方中实现这样的逻辑,例如遍历一个数组。

    【讨论】:

    • 我是这么认为的。那么如何调用具有给定属性的另一个配方呢?我猜我需要先使用 override_attributes 来设置属性,然后使用 include_recipe 调用配方,然后使用不同的属性重复这两个步骤。这听起来对吗?
    • 我试过了,但失败了。如果您在 run_list 中包含两次配方名称,Chef 不会运行两次配方。这里还有什么想法吗?
    • 从 learnchef.com 开始。我相信你很快就会学到所需的知识。如果没有您想要实现的具体信息(除了测试真和测试假),帮助您并不容易。
    • 只是为了对其他人有所帮助,我不得不说不可能两次执行厨师食谱(除非您运行多个厨师)。如果你需要做两次,你必须在一个脚本中做,然后你可以从你的食谱中调用它。这告诉我厨师框架有很大的缺点。
    • 我会反驳说,您只会在配方中实现一个循环,例如遍历属性中定义的数组。您仍然没有提供有关您的用例的详细信息,也许我们可以让您更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多