问题:
我正在尝试让Puppet管理几个计划任务的一些细节,而无需管理是否启用了这些任务。为此,我宣布scheduled_task
资源没有任何明确的enabled
属性,目的是传达Puppet是否不会更改任务是否已启用。但是,Puppet在每次运行时都会重新启用任务,就像我为每个运行指定enabled => true
一样。我怎么能让它停止这样做?
已经尝试过: 我已经考虑过通过hiera为每个数据中心设置属性,但实际情况是这使得故障转移和交换机比必要的更复杂。我不想每次都需要改变我的木偶代码。我也无法关闭傀儡代理人的运行。我需要保持滚动部署系统的完整性。
提供商吗 我已经阅读了一些关于提供者的内容,似乎我可以处理那里的行为。但是,我很难弄清楚哪些文档(如果有的话)解释了如何使用它们来覆盖特定的资源属性。
通知/订阅: 我曾考虑过使用notify / subscribe来设置触发器在创建时启用。我不认为这是正确的解决方案,因为它不是一个订阅/通知另一个资源的资源,它的属性是在一个资源上设置的。如果有一些神奇的方式来做这个或类似的事情,我很想知道。
底线:我只需要木偶来创建禁用任务,让我在不改变后续运行状态的情况下打开/关闭它们。
答案 0 :(得分:2)
有没有办法完全忽略Puppet中的资源属性默认值?
仅显式声明每个资源的每个属性的值。
但这似乎不是你真正想问的问题。您似乎正在探索分配属性值的方法,而不在资源声明中将它们指定为文字,我猜您正在寻找某种分层方法,底层替换或覆盖类型和提供程序的内置默认值
正如您所想,您可以想象至少部分通过提供商这样做。您需要为资源类型编写自定义提供程序,并指定每个资源实例使用它。但不要。这种方式实施起来很复杂,而且后来必须阅读你的清单(可能包括未来你)的任何人都会感到困惑。
另一方面,通知/订阅只是工作的错误工具。他们没有做你认为他们做的事情,也许你只是没有想到这个想法。我认为你卖Hiera很短和/或不恰当地减少了任务的复杂性。可能是两者的混合 - 我倾向于猜测Hiera可以为你做的比你欣赏的更多,但是你所设想的并发症在某种程度上会以某种形式表现出来,无论你做什么。
然而,有一种方法似乎与我认为你想要的非常接近:resource default declarations(我链接到最新的文档,但是这个特征在每个Puppet版本中以基本相同的形式存在至少在过去九年中释放)。因此,您可能会导致禁用所有scheduled_task
资源,除非您通过将此资源默认声明放在适当的位置明确说明:
Scheduled_task {
enabled => false
}
在选择放置此类语句的位置时,请注意,与现代Puppet中的任何其他内容不同,资源默认语句具有动态范围。该手册更详细地讨论了这一点。
<强>回顾:强>
根据问题的澄清,我将澄清资源类型的提供者是资源管理行为所在的地方。因此,如果Puppet在目标机器上的行为不是您想要的完全缺少属性声明的行为,那么修改提供者或编写自己的行为几乎是您唯一的选择。当然,如果你有一份支持合同,那么也许你不必在内部这样做。
如果您不想破解提供商 - 一个完全合理的位置 - 那么您就可以将属性管理到所需的值。但是,假设您有效地使用Hiera,则不需要修改任何清单来控制哪些服务器启用了它们的任务。