Chef infra 如何从LWRP提供程序中调用资源
让我首先承认,我很难了解整个资源创作技术。有LWRP的,图书馆资源,重量级资源,我似乎找不到绳子的末端,可以说,开始解开这团纱线。因此,这是一个有点扩展性的多部分问题 关键是我有一个工作配方,可以调用一系列资源来划分、格式化和装载linux设备。现在我想把它转换成LWRP(或者如果LWRP不合适,任何合适的R/P方法),这样我就可以以参数化的方式多次调用它 以下是我的初步尝试,下面是关于它的问题:Chef infra 如何从LWRP提供程序中调用资源,chef-infra,Chef Infra,让我首先承认,我很难了解整个资源创作技术。有LWRP的,图书馆资源,重量级资源,我似乎找不到绳子的末端,可以说,开始解开这团纱线。因此,这是一个有点扩展性的多部分问题 关键是我有一个工作配方,可以调用一系列资源来划分、格式化和装载linux设备。现在我想把它转换成LWRP(或者如果LWRP不合适,任何合适的R/P方法),这样我就可以以参数化的方式多次调用它 以下是我的初步尝试,下面是关于它的问题: # Resource:: mount_drive_as # # Will idempotently
# 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'
还有我的供应商(目前大部分只是原始配方的一部分):
所以我有两个基本问题:
updated\u by\u last\u action()
调用的结果,以便在代码中正确调用updated\u by\u last\u action()
行中的替换或添加,以及可能的执行)可能更好地通过其他方式使用资源,但我可以稍后解决。在这里,我最感兴趣的是利用分散的资源 要回答您的问题:
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