【发布时间】: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 属性的问题,因为我们那里有很多现有的解决方案看起来更容易,但在我们的设置中我无法使用它们。关于辅助库,您能否举例说明我如何使用它们来简化属性更新?我以前从来没有这样做过,从文档中我看不到一种简单的方法来从库中访问它们(我也不知道如果我需要它,我会如何从食谱中调用它)
-
我仍然很好奇为什么你被强制使用这种从配方代码覆盖属性的方式顺便说一句。