【问题标题】:How to invoke resources from within an LWRP Provider如何从 LWRP 提供者中调用资源
【发布时间】:2015-04-23 22:25:37
【问题描述】:

首先让我承认我很难理解整个资源创作技术堆栈。有 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'

还有我的提供者(此时主要是原始配方的一个剪辑和过去):

#ensures parted is installed.
run_context.include_recipe 'parted'

def whyrun_supported?
  true
end

action :create do
  parted_disk "/dev/#{@new_resource.device}" do
    label_type "gpt"
    action :mklabel
  end

  parted_disk "/dev/#{@new_resource.device}" do
    part_type   "primary"
    file_system "ext4"
    action :mkpart
  end

  parted_disk "/dev/#{@new_resource.device}1" do
    file_system "ext4"
    action :mkfs
  end

  replace_or_add "add /dev/#{@new_resource.device}1 to /etc/fstab" do
    path "/etc/fstab"
    pattern "^/dev/#{@new_resource.device}1"
    line "/dev/#{@new_resource.device}1   #{@new_resource.mount_point}   ext4   defaults   0 0"
  end

  directory @new_resource.mount_point

  execute 'mount /dev/#{@new_resource.device}1'

end

所以我有两个基本问题:

  1. 如何从 :create 操作中正确调用这些其他资源。
  2. 如何汇总他们所有 updated_by_last_action() 调用的结果,以便在我的代码中正确调用 updated_by_last_action()
  3. 换一种说法,在这种情况下如何正确支持whyrun?

我意识到我在上面使用的一些食谱(特别是来自line 食谱的replace_or_add 和可能是execute)可能更好地从资源中以其他方式完成,但我可以稍后解决。我最感兴趣的是在这里利用的分开的资源。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    解决您的问题: 1.如果您添加use_inline_resources,您可以保留您的代码 2.如果您添加use_inline_resources,那么这会为您处理(在这种情况下) 3. 和其他两个一样。

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

    好的,我知道有四种创建资源/提供者的方法。按出场顺序: 1.重量级 2. LWRP 3. 中等体重?? 4. 风度

    重量级

    最初,这是唯一的方法。您将新类添加到库目录中,它们就可用了。传统上,任何时候你在其中使用资源,你都会将这些资源的操作设置为:nothing,然后立即run_action 来获得效果。

    file 'somefile' do
      action :nothing
    end.run_action(:create)
    

    但是,这导致虚拟资源被添加到堆栈中。您还必须让他们查询资源的 updated 状态,并进行相应设置。

    f = file 'somefile' do
      action :nothing
    end.run_action(:create)
    @new_resource.updated_by_last_action f.updated_by_last_action
    

    再加上文件比实际需要的大得多,我们得到了 LWRP 概念。

    LWRP

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

    最终,use_inline_resources 的概念被引入。通过将此方法放在您的 LWRP 提供程序中,您可以不再担心updated_by_last_action。它还有其他好处,您可以在文档中了解这些好处。简而言之,在提供者中声明的所有资源都在“迷你”厨师运行中执行。如果其中任何一个被更新,则 LWRP 资源将自动标记为已更新。此外,由于这种内部厨师运行,这些资源都不会添加到外部厨师运行的资源堆栈中。 (这有好有坏,我们将在 Poise 中看到更多内容)

    MWRP

    有些人想要两全其美,并意识到如果他们扩展 LWRPBase 类,他们可以定义一个“基础”资源和提供者,然后从它们继承,同时仍然从 LWRP 获得干净的方法。对此没有太多可说的了。这很酷,但基本上只是 HWRP 和 LWRP 的混合体。这些在库目录中

    平衡

    Noah K. 认为这些都不对。如果我没记错的话,他深深地参与了 LWRP 的编写,但也感受到了它的一些缺点。所以大约一年前(我想)他发布了 Poise 食谱。这确实是一个用于编写新型资源/提供者的库。有了平衡,你就可以很好地平衡 LWRP 和 MWRP。你在你的库文件中简单的require poise 和你的metadata.rb 中的depends poise。 Poise 实现了 LWRP 库中所有你喜欢的方法,以及其他一些非常有用的东西。

    平衡使用notifying_block,而不是use_inline_resources。两者之间的主要区别在于 notifying_block 资源 ARE 添加到主厨师运行堆栈。这很重要,因为它允许其他资源通知他们。 (例如重新启动服务)。它还允许其他资源订阅它们。

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

    就我个人而言,我在做所有新的 LWRP 时都保持镇定,因为我认为这是迄今为止最好的选择。

    【讨论】:

    • Tejay,感谢您的快速回答和所有额外信息。尽管如此,仍然没有真正找到对事物的充分概述。例如,这是另一个我找不到任何信息的细节。我通过一些示例和实验发现,但不是通过任何文档,如果我将这个 LWRP 移动到 my-company-utils 食谱中,我现在必须将其引用为 my_company_utils_mount_drive_as似乎的情况是 LWRP 以这种方式工作,而 HWRP(库?)不需要前缀。有没有办法让 LWRP 像 HWRP 一样无前缀?
    • 哈!小进步,我在 LWRP 文档中为provides 方法找到了这个神秘的注释:'不使用以前的命名约定-#{cookbook_name}_#{provider_filename}。经过一些实验后,我设法使用它来将我的资源重命名为其名称的无前缀版本。很明显,之前没有提到“以前的”命名约定。对不起,我现在在咆哮...... ;-)
    • 是的,通常预计资源将遵循 cookbook_resource 模式,但您可以绕过它。我从未见过真正更改资源名称的 LWRP,它甚至在 LWRP、MWRP 或 Poise 资源中都不是很常见,但在那里并非闻所未闻。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多