首先我要承认,我很难在整个资源创作技术堆栈中占据优势。有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
所以我有两个基本问题:
updated_by_last_action()
次调用的结果,以便在代码中正确调用updated_by_last_action()
。我意识到我上面使用的一些食谱(特别是来自replace_or_add
食谱的line
,可能execute
)可能更好地通过资源进行其他方式,但我可以在以后解决。这是我最感兴趣的分散资源。
答案 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是一组新的库,允许您将文件放入resources
和providers
。这些文件使用LWRP库进行评估,并允许您以更多DSL样式定义资源和提供程序。因此,您可以定义属性,例如,通过调用方法。最初他们分享了HWRP的许多缺点,但文件更清晰,更小。主要的缺点是你不能做任何形式的继承。
最终,引入了use_inline_resources
的想法。通过将此方法放在LWRP提供程序中,您可以不再担心updated_by_last_action
。它还具有您可以在文档中阅读的其他好处。简而言之,提供商中声明的所有资源都在“迷你”中执行。厨师跑。如果更新了其中任何一个,则LWRP资源会自动标记为已更新。此外,由于这个内部厨师运行,这些资源都没有添加到外部厨师运行的资源堆栈中。 (这既好又坏,因为我们会在Poise中看到更多信息)
有些人想要两全其美,并意识到如果他们扩展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,因为我认为它是迄今为止最好的选择。