我正在编写一个包含LWRP的库菜谱,该LWRP应该安装tarball并将其作为守护程序运行(teamcity代理软件)。作为本手册的一部分,我想编写一个辅助方法来检查软件是否已安装。所以我有一个具有这种结构的辅助库:
module TeamCity
module Agent_helper
def tc_agent_installed?(install_path, archive, version)
return false unless File.symlink?(install_path)
return false unless File.basename(File.readlink(install_path)) == "#{archive.match(/^[^\.]*/).to_s}-#{version}"
return false unless ::File.exist?(::File.join(install_path,'lib','agent.jar'))
true
end
end
end
我的资源如下:
actions :install, :configure
default_action :install
attribute :install_path, :kind_of => String, default: '/opt/tcbuild'
...
...
attribute :version, :kind_of => String, default: '8.1.4'
以下是关于如何从提供程序中调用辅助方法的示例
link target do
to source
owner new_resource.user
group new_resource.group
not_if { tc_agent_installed?(new_resource.install_path, new_resource.install_archive, new_resource.version) }
end
理想情况下,该方法不应该获取输入参数,而是能够从资源中提取属性,因为该方法仅用于一个目的。在上面的链接资源上,我希望能够编写一个可以加载当前资源属性的库(例如上例中的new_resource.version)。这样我就可以简单地写出这样的警卫:
not_if { tc_agent_installed? }
我尝试过多种方式来传递'版本'属于那个模块,但没有让它工作。
很容易实现将节点属性传递给帮助程序库,但它不是我想要做的事情,因为某些资源属性使用默认值并且不会被节点属性覆盖。
有什么想法吗?什么是将资源属性(而不是节点属性)传递给库的最佳方式?
答案 0 :(得分:1)
我会将此方法作为私有方法放在资源本身中。 如果您不想在该方法中传递属性,那么它必须知道资源中的私有变量,因此它必须位于该资源内。
答案 1 :(得分:0)
只需传递资源对象
即可module TeamCity
module Agent_helper
def tc_agent_installed?(resource)
return false unless File.symlink?(resource.install_path)
return false unless File.basename(File.readlink(resource.install_path)) == "#{resource.archive.match(/^[^\.]*/).to_s}-#{resource.version}"
return false unless ::File.exist?(::File.join(resource.install_path,'lib','agent.jar'))
true
end
end
end
link target do
to source
owner new_resource.user
group new_resource.group
not_if { tc_agent_installed?(new_resource) }
end