2017-04-19 20 views
0

我已经编写了一个自定义资源sshd_allow_groups,它是动作更改了一些节点的属性,并且这些属性用于创建/etc/sshd_config的默认配方(托管自定义资源)的模板。但是,由于自定义资源通常是从其他食谱中调用的,因此我无法保证在对属性进行更改后将调用模板资源,从而产生需要2个厨师运行来获取希望的变化。CHEF:将资源设置为在调用另一个(自定义)资源时结束运行一次

我正在寻找一种方法来触发模板资源后资源被调用,并在最后运行(以防万一资源被调用多次)。 notifies不起作用,因为模板的操作不是:nothing,也不应该是,因为如果对于某个不需要资源的节点,模板仍然需要写入。

我的自定义资源:

resource_name :sshd_allow_groups 
property :group, String, name_property: true 

default_action :append 

action :append do 
    currently = node['tom-ssh']['allow_groups'] 
    if currently 
    if !currently.include?(group) 
     node.normal['tom-ssh']['allow_groups'] = currently | [group] 
    end 
    else 
    node.normal['tom-ssh']['allow_groups'] = [group] 
    end 
end 

action :remove do 
    currently = node['tom-ssh']['allow_groups'] 
    if currently && currently.include?(group) 
    node.normal['tom-ssh']['allow_groups'] = currently - [group] 
    end 
end 

另一个配方应该说是这样的:

sshd_allow_groups "bob" do 
    action :append 
end 
+0

只是通知从您的自定义资源调用延迟,它将最终呈现模板两次,但仍然在最后得到正确的文件。也就是说,除非您确切知道自己在做什么,否则不要使用正常水平,否则当您希望从组中删除某人时会发生意外。总而言之,这听起来像一个[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),你要求修复一个无效的解决方案你真正的问题。 – Tensibai

+0

'通知'不起作用(我最终认为我需要使用它来修复:http://stackoverflow.com/questions/21176576/how-to-i-get-a-chef-custom-lwrp-到实现 - 通知 - 和不-IF)。我真正想要发生的事情不是完全需要“通知”,所以资源本身会照顾(更干的代码)。为什么你认为这是一个XY问题?你认为我的X是什么? –

+0

据我所知,你希望管理sshd_config文件。你在自定义资源和其他地方更新属性和模板之间进行分割,如果目标是缓解属性更新,然后去找一个辅助库,它将在编译时可用于每一本烹饪书,修复你的编译vs收敛实际问题,其中属性计算得太晚。 – Tensibai

回答

0

在你的食谱库目录,在helpers.rb文件(docblog post):

module Sshd_allow_groups 
    module Helpers 
    def append(group) 
     node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] | [group] 
    end 

    def remove(group) 
     node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] - [group] 
    end 
    end 
end 

在你的食谱中称之为:

Sshd_allow_group::Helpers.append("new_group") 

或者,如果你有绝对的把握(和这样一个应该重命名的方法),你可以包括你的助手方法到配方DSL:

::Chef::Recipe.send(:include, sshd_allow_groups::Helpers) 

我已经简化了一点你的代码,因为我感觉不到必要的额外检查,如果tom-ssh属性不存在,您可能仍然会引发异常。

即使您稍后删除了一个添加组的配方,我也会尝试脱离node.normal,因为它保留在节点上。更多关于属性的细节here

0

还不能评论,所以需要发布作为答案..只是一点点尼特,当我试图遵循例子时,张百依给了答案。直接调用帮助程序方法将无法与模块中定义的帮助程序方法一起使用。您需要制作append/remove方法类实例。在追加/删除前添加self.。然后,这个调用将工作:

Sshd_allow_group::Helpers.append("new_group") 

或者你可以在一个类中定义的helper方法使用实例方法,或在课堂上使用的帮手。

相关问题