【问题标题】:CHEF: Set a resource to run once at the end upon an invocation of another (custom) resourceCHEF:将资源设置为在调用另一个(自定义)资源时运行一次
【发布时间】:2017-07-14 02:18:33
【问题描述】:

我编写了一个自定义资源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

【问题讨论】:

  • 只需通知您的自定义资源调用延迟,它最终会渲染模板两次,但最终仍会获得正确的文件。也就是说,除非您确切知道自己在做什么,否则不要使用正常级别,否则当您希望将某人从组中删除时会感到惊讶。总而言之,这听起来像是XY problem,您要求修复一个无效的解决方案来解决您的实际问题。
  • notifies 不起作用(我最终认为我需要使用它来修复:stackoverflow.com/questions/21176576/…)。我真正想要发生的是根本不需要notifies,这样资源本身就会处理(更干的代码)。在您看来,为什么这是一个 XY 问题?你觉得我的 X 是什么?
  • 据我所知,您希望管理 sshd_config 文件。您将其拆分为用于更新属性的自定义资源和其他地方的模板,如果目标是简化属性更新,则使用辅助库,它将在编译时可用于每本食谱,修复您的编译与收敛属性计算太晚的实际问题。
  • 我故意没有直接询问有关管理 sshd 属性的问题,因为我们那里有很多现有的解决方案看起来更容易,但在我们的设置中我无法使用它们。关于辅助库,您能否举例说明我如何使用它们来简化属性更新?我以前从来没有这样做过,从文档中我看不到一种简单的方法来从库中访问它们(我也不知道如果我需要它,我会如何从食谱中调用它)
  • 我仍然很好奇为什么你被强制使用这种从配方代码覆盖属性的方式顺便说一句。

标签: chef-infra chef-recipe


【解决方案1】:

在您的食谱库目录中的 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")

或者,如果您绝对确定(并且应该重命名方法),您可以将您的辅助方法包含在 Recipe DSL 中:

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

我对您的代码进行了一些简化,因为我觉得不需要额外的检查,如果tom-ssh 属性不存在,您可能仍然会引发异常。

我会尝试摆脱node.normal,因为它保留在节点上,即使您稍后删除配方添加组。更多属性详情here

【讨论】:

    【解决方案2】:

    还不能发表评论,所以需要发布作为答案.. 只是我在尝试遵循 tensibai 在答案中给出的示例时发现了一点点。直接调用辅助方法将不适用于模块中定义的辅助方法。您需要创建附加/删除方法类实例。在追加/删除前面添加self.。然后这个调用将起作用:

    Sshd_allow_group::Helpers.append("new_group")
    

    或者你可以在一个类中定义辅助方法来使用实例方法,或者在一个类中使用辅助方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2020-06-23
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多