Chef infra 参数化厨师食谱

Chef infra 参数化厨师食谱,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我在chef中有一个菜谱,我想多次使用它(在多个角色中),只需要几个不同的参数。我希望能够在同一个节点上使用多个这样的角色 如何“参数化”配方?我不能使用属性,因为这些属性位于节点上,所以一个角色将覆盖另一个角色的属性。在这种情况下,建议使用轻量级资源提供程序或类似的方法 我认为,当运行列表聚合时,它会重复任何配方,因此,如果您有6个角色,都包含相同的配方,并将每个角色添加到运行列表中,那么它实际上只会运行该配方一次 可以找到LWRP的简要介绍,尽管这比创建一个新的更具执行性 在这种情况下,一

我在chef中有一个菜谱,我想多次使用它(在多个角色中),只需要几个不同的参数。我希望能够在同一个节点上使用多个这样的角色


如何“参数化”配方?我不能使用属性,因为这些属性位于节点上,所以一个角色将覆盖另一个角色的属性。

在这种情况下,建议使用轻量级资源提供程序或类似的方法

我认为,当运行列表聚合时,它会重复任何配方,因此,如果您有6个角色,都包含相同的配方,并将每个角色添加到运行列表中,那么它实际上只会运行该配方一次

可以找到LWRP的简要介绍,尽管这比创建一个新的更具执行性

在这种情况下,一旦您拥有LWRP,您可以创建一个多次调用它的配方,也可以为每次调用创建单独的配方


您可以利用节点的数据模型层次结构来构建某种对象,该对象表示您希望运行的实例,并以这种方式循环。

我发现这个答案对于帮助我处理类似的用例非常有用。我想分享一个简单的例子,创建一个对象来迭代PatrickWalker所指的对象(“…构建某种表示实例的对象..并循环…”)。我希望这能帮助一些人

  • 创建一个属性,该属性的值是一个JSON字符串,其中包含每个迭代的数组,每个数组条目包含每个迭代的参数

  • 在配方中迭代此数组,使用JSON字符串中的参数执行操作(您可以在定义或LWRP中封装可重用代码)

  • 简单例子 使用JSON中定义的特定名称和内容创建一个或多个文件:

    属性:

    default['config'] = '{"files":[{"name":"/tmp/file_1","content":"file contents 1"},{"name":"/tmp/file_2","content":"file contents 2"}]}'
    
    配方:

    config = JSON.parse("#{node['config']}")
    files = config['files']
    
    files.each do |file|
      file "#{file['name']}" do
        content "#{file['content']}"
      end
    end
    

    您可以将这个简单的示例推断到您自己的用例中。

    我使用了定义,但也将研究LWRP。谢谢。没问题,我们这样做是为了安装一些内部产品。我们需要为每个步骤执行一组通用步骤,因此我们定义了一个资源,定义了我们希望能够更改的参数,然后定义了一个:install操作,然后有一些配方为我们执行安装。我们这样做,而不是自动安装许多对象,以保持运行列表可读性和易于理解