我写了几本LWRP食谱来安装和管理一些服务(Monit和Omnicheck)。它们提供的功能之一是为您提供一个文件,该文件将与模板或cookbook_file资源一起使用。
我发现,当我调用这两个资源中的任何一个时,我必须提供"cookbook new_resource.cookbook“,以便让它在调用给定文件的食谱中查找,而不是在LWRP的食谱中查找。
这一切都运行得很好,直到调用被嵌套。在这种情况下,如果您使用Omnicheck LWRP设置一个新实例,并选择通过Monit运行它,它将通过Monit LWRP为您更新Monit。这对于作为LWRP的食谱一部分创建的默认Omnicheck作业来说工作得很好,但是当我尝试从另一个食谱创建一个新的Omnicheck作业时,Monit LWRP就卡住了,并抱怨找不到模板资源的文件。
问题是,有问题的模板文件在Omnicheck食谱中,但Monit LWRP中的new_resource.cookbook评估为顶级食谱,而不是Omnicheck食谱。
所以路径看起来像这样:
application -> Omnicheck ->监控器
在这个例子中,在Monit LWRP中,应用程序的值是“new_resource.cookbook”而不是"Omnicheck“。
由于new_resource.cookbook似乎不是我需要/想要的,我如何确定LWRP调用者的食谱?
相关的错误如下所示:
[2014-08-21T00:46:15+00:00] ERROR: my_omnicheck_service[chef] (application::default line 30) had an error: Chef::Exceptions::FileNotFound: template[/some/path/omnicheck/etc/stage/chef.conf] (/var/chef/cache/cookbooks/my_omnicheck/providers/service.rb line 10) had an error: Chef::Exceptions::FileNotFound: Cookbook 'application' (0.1.5) does not contain a file at any of these locations:
templates/centos-5.8/omnicheck.erb
templates/centos/omnicheck.erb
templates/default/omnicheck.erb发布于 2014-08-23 04:52:35
我真的不喜欢这样,我希望有人知道更好的方法来解决这个问题,但我发现我可以询问new_resource.source_line来获得我想要的信息:
callingCookbook = new_resource.cookbook_name
if (new_resource.source_line =~ /\/cookbooks\/([^\/]+)\//) then
callingCookbook = $1
end然后,我可以在之前使用new_resource.cookbook_name的地方使用callingCookbook。
https://stackoverflow.com/questions/25452501
复制相似问题