Chef infra 如何从LWRP提供程序中调用资源

Chef infra 如何从LWRP提供程序中调用资源,chef-infra,Chef Infra,让我首先承认,我很难了解整个资源创作技术。有LWRP的,图书馆资源,重量级资源,我似乎找不到绳子的末端,可以说,开始解开这团纱线。因此,这是一个有点扩展性的多部分问题 关键是我有一个工作配方,可以调用一系列资源来划分、格式化和装载linux设备。现在我想把它转换成LWRP(或者如果LWRP不合适,任何合适的R/P方法),这样我就可以以参数化的方式多次调用它 以下是我的初步尝试,下面是关于它的问题: # Resource:: mount_drive_as # # Will idempotently

让我首先承认,我很难了解整个资源创作技术。有LWRP的,图书馆资源,重量级资源,我似乎找不到绳子的末端,可以说,开始解开这团纱线。因此,这是一个有点扩展性的多部分问题

关键是我有一个工作配方,可以调用一系列资源来划分、格式化和装载linux设备。现在我想把它转换成LWRP(或者如果LWRP不合适,任何合适的R/P方法),这样我就可以以参数化的方式多次调用它

以下是我的初步尝试,下面是关于它的问题:

# Resource:: mount_drive_as
#
# Will idempotently find a physical drive (/dev/sdb, /dev/sdc, etc), 
# create a primary partition using the entire drive and formated to ext4 
# and mount it at the specified mount point.
# An fstab entry is also created to auto mount the partition.

actions :create
default_action :create

#Path to the location where the drive will be mounted, e.g. /data
attribute :mount_point,
          :name_attribute => true,
          :kind_of => String,
          :required => true

attribute :device,
          :regex => [ /^sd[a-z]$/ ]
          :default => 'sdb'
还有我的供应商(目前大部分只是原始配方的一部分):

所以我有两个基本问题:

  • 如何从:create操作中正确调用这些其他资源
  • 如何聚合它们的所有
    updated\u by\u last\u action()
    调用的结果,以便在代码中正确调用
    updated\u by\u last\u action()
  • 换句话说,在这种情况下,我如何正确地支持whyrun
  • 我意识到我在上面使用的一些食谱(特别是
    行中的
    替换或添加
    ,以及可能的
    执行
    )可能更好地通过其他方式使用资源,但我可以稍后解决。在这里,我最感兴趣的是利用分散的资源

    要回答您的问题: 1.如果添加
    使用内联\u资源
    则可以保持代码不变 2.如果您添加
    use\u inline\u resources
    ,那么这将为您解决(在本例中) 3.和另外两个一样

    现在,对于大纱线球的问题,希望这会有所帮助

    好的,我知道有四种方法可以创建资源/提供者。按出现顺序: 1.重量级 2.LWRP 3.中等重量?? 4.泰然自若

    重量级 最初,这是唯一的办法。您将新类添加到库目录中,它们就可以使用了。传统上,每当您在这些应用程序中使用资源时,都会将这些资源的操作设置为:nothing,然后
    立即运行\u action
    以获得效果

    file 'somefile' do
      action :nothing
    end.run_action(:create)
    
    但是,这导致将虚拟资源添加到堆栈中。您还必须让他们查询资源的
    更新状态,并进行相应的设置

    f = file 'somefile' do
      action :nothing
    end.run_action(:create)
    @new_resource.updated_by_last_action f.updated_by_last_action
    
    再加上文件比实际需要的大得多,我们得到了LWRP概念

    LWRP LWRP是一组新的库,允许您将文件放入
    资源
    提供者
    。这些文件使用LWRP库进行评估,并允许您以更DSL的风格定义资源和提供者。例如,您可以通过调用方法来定义属性。最初,它们共享HWRP的许多缺点,但文件更干净、更小。主要的缺点是你不能做任何形式的继承

    最后,引入了
    使用内联资源
    的思想。通过将此方法放在LWRP提供程序中,您可以不再担心由上次操作更新的
    。它还有其他好处,您可以在文档中阅读。简而言之,提供程序中声明的所有资源都在“迷你”chef运行中执行。如果其中任何一个已更新,则LWRP资源将标记为自动更新。此外,由于这个内部厨师运行,这些资源都不会添加到外部厨师运行的资源堆栈中。(这既是好的也是坏的,我们将在《泰晤士报》中看到更多)

    MWRP 有些人希望两者兼而有之,并意识到如果他们扩展LWRPBase类,他们可以定义一个“基”资源和提供者,然后从这些资源和提供者继承,同时仍然可以从LWRP获得干净的方法。关于这一点,没什么可说的了。这很酷,但基本上只是HWRP和LWRP的混合。这些在库目录中

    泰然自若 诺亚K.认为这些都不对。如果我没记错的话,他深深地参与了LWRP的写作,但也感受到了它的一些缺点。所以大约一年前(我想)他出版了《泊思食谱》。这确实是一个用于编写新型资源/提供者的库。有了平衡,你就可以很好地平衡LWRP和MWRP。您可以在库文件中简单地
    要求平衡
    ,并在metadata.rb中依赖平衡。Poise实现了LWRP库中您最喜欢的所有方法,以及其他一些真正有用的东西

    poise使用
    通知块而不是
    使用内嵌资源
    。这两者之间的主要区别在于
    notifying_block
    资源被添加到主厨运行堆栈中。这是一件大事,因为它允许其他资源通知他们。(例如,重新启动服务)。它还允许其他资源订阅它们

    您可以在github项目中看到Poise的完整文档


    就我个人而言,我正在用poise完成所有新的LWRP,因为我认为这是迄今为止最好的选择。

    Tejay,感谢您的快速回答和所有额外信息。但仍然没有找到一个足够的东西概述。例如,这里还有一个我找不到任何信息的细节。我通过一些示例和实验发现,但不是通过任何文档发现,如果我将此LWRP移动到
    my company utils
    cookbook中,我现在必须将其引用为
    my_company utils\u mount\u drive\u as
    。LWRP似乎就是这样工作的,HWRP(库?)不需要前缀。有没有办法让LWRPs像HWRPs一样无前置桥?哈!小小的进步,我在LWRP文档中发现了
    提供的
    方法的一个神秘的注释:“不使用以前的命名约定-
    
    f = file 'somefile' do
      action :nothing
    end.run_action(:create)
    @new_resource.updated_by_last_action f.updated_by_last_action