2016-10-04 33 views
1

我对厨师和我做的概念验证尝试使用它来构建Web服务器时相对陌生。由于这个问题超出范围的原因,我将创建多个Apache实例,我可能想同时创建和“删除”。同样的问题可能真的适用于在单个Apache实例中创建和删除虚拟主机配置。与厨师一起删除配置项目

我目前正在使用chef-client基于此节点的已定义属性创建所有的Apache实例。因此,例如,我可能具有定义Instance1Instance2Instance3的属性。这一切在这一点上都工作得很好。实例目录获取创建像这样:

/opt/local/apache/Instance1/stuff 
/opt/local/apache/Instance2/stuff 
/opt/local/apache/Instance3/stuff 

内容目录和服务得到相同的instancename标识符创建。

问题来了,如果我想从该节点的属性中删除Instance3。我的厨师 - 客户端运行将确保Instance1 & Instance2配置正确,但Instance3将继续作为厨师客户现在一无所知。

我明白在一个理想的世界里,你可能只是用新的配置启动一台新机器,而这个问题甚至都没有抬头。但是,我需要在无法重新配置的服务器上执行此操作(这只是在现有服务器上配置Apache的POC)。

我可以“删除并重新创建”,但这听起来对我来说不是幂等的。首先,文件时间戳会有所不同。即使没有任何东西要做,厨师客户做这些事情似乎也是错误的。

我自己想出了一个解决方案。在上面的示例中,我将在Ruby中获取所有实例名称的列表,包括/opt/local/apache/,迭代它们并删除实例,如果它不是在属性中定义的实例。我把它放在一个单独的配方中,我称之为cleanup.rb。如果我在主要安装配方之后运行此操作,并且没有删除配置,则它不会执行任何操作,因此似乎可以安全运行。

这很好,但它似乎hacky我担心这可能是一种反模式。从概念上讲,我是以正确的方式去做还是应该做一些与众不同的事情?在你的食谱中使用自定义的Ruby代码来做这样的事情是否被认为是正常和正确的?

回答

2

这里的区别通常被表述为(使用来自Facebook的Phil D的条款)作为“托管对象”与“托管集合”。一个template资源汇聚地控制文件的状态,但是您想要的是资源(实际的自定义资源或仅在概念上),即文件的所有所有的集合。你可以查看zap cookbook以获得这个的半可重用实现,尽管这是基于挖掘资源集合而不是使用属性。基于属性的收集方法比烹饪书脆弱得多,但也更加有限。 Facebook的方法(即基于属性)可能是他们的sysctl食谱https://github.com/facebook/chef-cookbooks/tree/master/cookbooks/fb_sysctl中最好的例子。

在这种情况下,听起来像做一个dir glob并且与属性数据进行比较可能是正确的方法,但是有时候可能会认为这很“棘手”。就像如果你在那个glob之后发生的配方代码中设置了属性,它也不会知道它。这通常会导致不断升级的特殊情况,但也许你可以保持更有序的事情,这将是好的:)

+0

谢谢coderanger。我检查了Zap,我必须明确地'遍历文件夹(Apache服务器目录,内容目录,systemd单元文件,并在需要的时候也切换运行的服务......)。我已经走了上面的方法。它似乎运作良好。感谢您的建议! – Tom17