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

时间:2015-04-23 12:49:51

标签: chef

首先我要承认,我很难在整个资源创作技术堆栈中占据优势。有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 action中正确调用这些其他资源。
  2. 如何汇总所有updated_by_last_action()次调用的结果,以便在代码中正确调用updated_by_last_action()
  3. 换句话说,在这种情况下如何正确支持whyrun?
  4. 我意识到我上面使用的一些食谱(特别是来自replace_or_add食谱的line,可能execute)可能更好地通过资源进行其他方式,但我可以在以后解决。这是我最感兴趣的分散资源。

1 个答案:

答案 0 :(得分:1)

解决您的问题: 1.如果添加use_inline_resources,您可以保留代码 2.如果您添加use_inline_resources,那么这将由您负责(在这种情况下) 3.与其他两个相同。

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

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

重量

最初,这是唯一的方法。您将新类添加到库目录中,并使它们可用。传统上,每当您在这些资源中使用资源时,您都会设置这些资源。行动:没有,然后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类,他们可以定义一个" base"资源和提供者,然后从那些继承,同时仍然从LWRP获得干净的方法。对此没什么好说的。它很酷,但基本上只是HWRP和LWRP的混合。这些进入库目录

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

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

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

就个人而言,我正在做所有新的LWRP,因为我认为它是迄今为止最好的选择。