让我首先承认,我很难理解整个资源创作技术栈。有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()
。我意识到,我在上面使用的一些菜谱(特别是来自line
食谱的line
菜谱,可能还有execute
)可能更好地使用了资源,但我可以在以后解决这个问题。在这里,我最感兴趣的就是分拆的资源。
发布于 2015-04-23 14:25:37
为了解决您的问题: 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是一组新的库,允许您将文件放在resources
和providers
中。这些文件使用LWRP库进行评估,并允许您以更多的DSL样式定义资源和提供程序。因此,您可以定义属性,例如,通过调用一个方法。最初,他们共享了HWRP的许多缺点,但文件更干净、更小。主要的缺点是你不能做任何形式的继承。
最后,引入了use_inline_resources
的思想。通过将此方法放入您的LWRP提供程序中,您可以不再担心updated_by_last_action
。它还有其他的好处,你可以在文档中读到。简而言之,在提供者中声明的所有资源都是在“迷你”主厨运行时执行的。如果其中任何一个被更新,那么LWRP资源将被标记为自动更新。此外,由于这个内部厨师运行,这些资源中没有一个被添加到外部厨师运行的资源堆栈中。(这是好的,也有坏的,我们会看到更多的关于平衡)
MWRP
有些人想要这两个世界中的最好的,并意识到如果他们扩展LWRPBase类,他们可以定义一个“基本”资源和提供程序,然后继承这些资源,同时仍然从LWRP获得干净的方法。关于那件事没什么可说的了。它很酷,但基本上只是混合了HWRP和LWRP。这些都在库目录中。
稳重
诺亚·K.认为这些都不是正确的。如果我没记错的话,他深深地参与了LWRP的写作,但也感受到了其中的一些缺点。因此,大约一年前(我想),他发布了平衡食谱。这实际上是一个用于编写一种新的资源/提供者的库。有了平衡,你就可以得到一个很好的平衡LWRP和MWRP。在库文件中使用简单的require poise
,在metadata.rb中使用depends poise
。Poise实现了LWRP库中您最喜欢的所有方法,以及其他一些非常有用的东西。
poise使用的不是use_inline_resources
,而是notifying_block
。两者的主要区别在于,notifying_block
资源被添加到主厨运行堆栈中。这是一件大事,因为它允许其他资源通知他们。(例如,重新启动服务)。它还允许其他资源订阅它们。
您可以在github项目中看到完整的平衡文档。
就我个人而言,我正在做我所有的新LWRP与平衡,因为我认为这是最好的选择到目前为止。
https://stackoverflow.com/questions/29823974
复制相似问题