gpt4 book ai didi

ruby - 如何在 Chef LWRP 定义中实现动态属性默认值

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:05 26 4
gpt4 key购买 nike

我希望能够使用比方说 3 个参数来定义轻量级资源,其中两个是基本/基本参数,第三个是这两个参数的组合。我还想提供定制第三个参数的可能性。例如:

如何修改以下代码以实现 full_name 属性的上述行为:

资源定义:

actions :install

attribute :name, :kind_of => String, :name_attribute => true
attribute :version, :kind_of => String
attribute :full_name, :kind_of => String

提供商定义:

action :install do
Chef::Log.info "#{new_resource.full_name}"
end

我希望看到不同资源指令的不同输出,例如:

resource "abc" do
version "1.0.1"
end

将导致 abc-1.0.1,但是:

resource "def" do
version "0.1.3"
full_name "completely_irrelevant"
end

将导致completely_irrelevant

是否有可能在资源定义中定义此行为(可能通过 default 参数),或者我只能在提供者定义中进行定义?如果第二个为真,那么我可以将计算出的值存储在 new_resource 对象的 full_name 属性中吗(该类似乎缺少 full_name= 方法定义)还是必须将其存储在局部变量中?

更新

感谢 Draco 的提示,我意识到我可以在资源文件中创建一个访问器方法,并在请求时即时计算 full_name 值。我更喜欢一个更简洁的解决方案,但它比在行动实现中计算它要好得多。

Chef 版 Chef :10.16.4

最佳答案

在构造函数中设置@full_name,类似于在 chef < 0.10.10 中提供默认操作,如 written in wiki , 不起作用,因为此时尚未设置@version。

def initialize( name, run_context=nil )
super
@full_name ||= "%s-%s" % [name, version]
end

所以我们必须通过添加覆盖资源中的 full_name 方法

def full_name( arg=nil )
if arg.nil? and @full_name.nil?
"%s-%s" % [name, version]
else
set_or_return( :full_name, arg, :kind_of => String )
end
end

进入资源定义。这样可行。已测试。

关于ruby - 如何在 Chef LWRP 定义中实现动态属性默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14169557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com