我们公司正在从Chef 12 (12.19.36)更新到Chef 14 (14.14.25)。我有一个包含助手函数库的食谱,其中包含以下代码:
require 'chef/mixin/shell_out'
module My
module Helpers
include Chef::Mixin::ShellOut
def my_method
...
end
end
end
Chef::Resource.send(:include, My::Helpers)
Chef::Recipe.send(:include, My::Helpers)然后在同一配方中的资源中调用这些帮助器方法,但也可以从包含该配方的其他配方(及其资源)中调用。因此,正如我所理解的那样,为什么我会想要发送给所有Chef::Resource和Chef::Recipe的,但我应该声明我不是Ruby程序员,所以我的理解并不是很深入。
在任何情况下,这与我们的厨师12客户端工作得很好,但现在与厨师14中断,调用‘my_ NoMethod’时出现方法错误。(在对这个配方的调用中,甚至不考虑是否有其他配方在调用它。)这是完整的错误,但有些命名不明确。
NoMethodError
-------------
undefined method `my_method' for #<#<Class:0x0000000003d9fd98>:0x0000000004c56aa8>
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/my_test_recipe/resources/default.rb:10:in `block in class_from_file'
Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/my_test_recipe/recipes/default.rb
53: call_to_my_resource propertyname
54:
Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/my_test_recipe/recipes/default.rb:53:in `from_file'我看过很多其他的内部配方,没有两个是一样的,每个人做事情的方式都不同。例如,许多示例可能会直接在资源文件中包含帮助程序,但这将不允许不需要该资源的其他方法直接调用该方法。(它们调用资源,但也需要直接调用帮助器方法。)解释这一切的在线文档很少。
发布于 2021-06-20 10:38:23
我做了更多的研究,根据一些提示,我添加了额外的一行:
Chef::Provider.send(:include, My::Helpers)这位于助手库文件的底部,以及相应的“send”to Resource和Recipe。我不能说我完全理解它,但我认为我的自定义资源是Provider类而不是resource类?我喜欢任何可以帮助我更好地理解这一点的评论。由于helper函数的使用位置,我仍然需要保留其他行。
https://stackoverflow.com/questions/68038198
复制相似问题