首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从LWRP提供程序中调用资源

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

Stack Overflow用户
提问于 2015-04-23 12:49:50
回答 1查看 1.1K关注 0票数 1

让我首先承认,我很难理解整个资源创作技术栈。有LWRP的,图书馆的资源,重量级的资源,我似乎找不到绳子的末端,可以这么说,开始解开这团纱线。因此,这是一个比较宽泛的多部分问题.

关键是我有一个工作配方,它调用一系列资源,以便对linux设备进行分区、格式化和挂载。现在,我想将它转换为LWRP (或者如果LWRP不合适,任何合适的R/P方法),以便我可以以参数化的方式多次调用它。

以下是我最初的尝试,对此提出的问题如下:

代码语言:javascript
运行
复制
# 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'

而我的提供者(现在主要只是原始食谱的一部分和过去):

代码语言:javascript
运行
复制
#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. 另一种说法是,在这种情况下,我如何正确地支持为什么运行?

我意识到,我在上面使用的一些菜谱(特别是来自line食谱的line菜谱,可能还有execute)可能更好地使用了资源,但我可以在以后解决这个问题。在这里,我最感兴趣的就是分拆的资源。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-23 14:25:37

为了解决您的问题: 1.如果您添加了use_inline_resources,您可以将代码保留为2。如果您添加了use_inline_resources,那么这将为您处理(在本例中) 3。与其他两种代码相同。

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

好的,我知道有四种方法可以创建资源/提供者。外观顺序: 1.重2. LWRP 3.中等重量? 4.平衡

重重

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

代码语言:javascript
运行
复制
file 'somefile' do
  action :nothing
end.run_action(:create)

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

代码语言:javascript
运行
复制
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资源将被标记为自动更新。此外,由于这个内部厨师运行,这些资源中没有一个被添加到外部厨师运行的资源堆栈中。(这是好的,也有坏的,我们会看到更多的关于平衡)

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与平衡,因为我认为这是最好的选择到目前为止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29823974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档