gpt4 book ai didi

ruby - Chef::Node 在从 Recipe 调用的库中可用,但在通过 Singleton 类调用时不可用

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:36 25 4
gpt4 key购买 nike

我编写了一个服务中心,允许我停止和启动服务,下面是一个非常简化的结构版本,没有添加服务依赖项。

class Otbo
class Services (requires Singleton)
SERVICE_WEBLOGIC = {
:start => lambda { Otbo::Services.instance._WLStart() },
:stop => lambda { Otbo::Services.instance._WLStop() }
}
module Controller
def control(service, command)
service[command].call()
end
end
include Otbo::Services::Controller
include Singleton
end
end

Chef::Recipe.send(:include, Otbo::Services::Controller)
Chef::Resource.send(:include, Otbo::Services::Controller)

在另一个 cookbook 库中,为了避免循环依赖,我通过 send 方法添加了 include - 它绑定(bind)了下面的 _WLStart()_WLStop() 方法上面代码中的 lambda。

module OtboDomain
module Util
def _WLStart()
if has_role?(node, 'weblogic_adminserver') or has_role?(node, 'otbo_weblogic')
puts 'Starting WebLogic...'
end
end
def _WLStop()
if has_role?(node, 'weblogic_adminserver') or has_role?(node, 'otbo_weblogic')
puts 'Stopping WebLogic...'
end
end
end
end

Otbo::Services.send(:include, OtboDomain::Util)

当通过extend OtboDomain::Util 直接从配方访问_WLStop()_WLStart() 时,我能够访问node属性愉快。一切顺利。

当我通过 Otbo::Service.control(service, command) 方法调用时,我丢失了节点上下文并且它在 _WLStart() 中不可用>_WLStop(),所以我得到一个错误。

node01 ================================================================================
node01 Recipe Compile Error in c:/chef/cache/cookbooks/otbo_weblogic/recipes/default.rb
node01 ================================================================================
node01
node01 NameError
node01 ---------
node01 undefined local variable or method `node' for #<Otbo::Services:0x000000000819d018>
node01
node01 Cookbook Trace:
node01 ---------------
node01 c:/chef/cache/cookbooks/otbo_domain/libraries/util.rb:200:in `_WLStop'
node01 c:/chef/cache/cookbooks/otbo_services/libraries/control.rb:36:in `block in <class:Services>'
node01 c:/chef/cache/cookbooks/otbo_services/libraries/control.rb:74:in `block in control'
node01 c:/chef/cache/cookbooks/otbo_services/libraries/control.rb:69:in `each'
node01 c:/chef/cache/cookbooks/otbo_services/libraries/control.rb:69:in `control'
node01 c:/chef/cache/cookbooks/otbo_weblogic/recipes/setup.rb:114:in `from_file'
node01 c:/chef/cache/cookbooks/otbo_weblogic/recipes/default.rb:12:in `from_file'

通过 Otbo::Service.control(service, command) 调用时是否可以使 node 属性可用?

最佳答案

我改变了创建 custom resource 的方法.

resource_name :otbo_service
actions [:stop, :start, :restart, :nothing]
default_action :nothing

property :service, Hash, required: true

action_class do
def control(commands)
handle(new_resource.service, commands)
end
end

def handle(service, commands)
name = service[:name]

for command in commands
service[command].call()
end
end

action :nothing do
Chef::Log.info('Nothing to do.')
end

action :stop do
control([:stop])
end

action :start do
control([:start])
end

action :restart do
control([:stop, :start])
end

我添加了一个可以访问节点变量的库函数。

module Common
module Util
def _WLStart()
Chef::Log.info("<< Starting WebLogic Server on Host: #{node['hostname']} >>")
end

def _WLShutdown()
Chef::Log.info("<< Stopping WebLogic Server on Host: #{node['hostname']} >>")
end
end
end

Chef::Recipe.send(:include, Common::Util)
Chef::Resource.send(:include, Common::Util)

在配方中,我可以通过如下代码调用自定义资源。

extend Common::Util

weblogic = {
:name => 'weblogic',
:start => lambda { _WLStart() },
:stop => lambda { _WLShutdown() }
}

otbo_service 'Restart WebLogic' do
action :restart
service weblogic
end

关于ruby - Chef::Node 在从 Recipe 调用的库中可用,但在通过 Singleton 类调用时不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225139/

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