Chef infra 使用chef删除配置项

Chef infra 使用chef删除配置项,chef-infra,Chef Infra,我对Chef比较陌生,并且尝试使用它来构建一个web服务器,以此来进行概念验证。由于超出此问题范围的原因,我将创建多个Apache实例,我可能希望创建和“删除”这些实例。同样的问题也适用于在单个Apache实例中创建和删除虚拟主机配置 我目前正在使用chef client根据为该节点定义的属性创建所有Apache实例。例如,我可能有定义Instance1、Instance2和Instance3的属性。在这一点上,一切都很顺利。实例目录的创建方式如下: /opt/local/apache/Inst

我对Chef比较陌生,并且尝试使用它来构建一个web服务器,以此来进行概念验证。由于超出此问题范围的原因,我将创建多个Apache实例,我可能希望创建和“删除”这些实例。同样的问题也适用于在单个Apache实例中创建和删除虚拟主机配置

我目前正在使用chef client根据为该节点定义的属性创建所有Apache实例。例如,我可能有定义
Instance1
Instance2
Instance3
的属性。在这一点上,一切都很顺利。实例目录的创建方式如下:

/opt/local/apache/Instance1/stuff
/opt/local/apache/Instance2/stuff 
/opt/local/apache/Instance3/stuff
使用相同的
instancename
标识符创建内容目录和服务

如果我从这个节点的属性中删除
Instance3
,问题就会出现。我的chef客户端运行将确保正确配置了
Instance1
Instance2
,但
Instance3
将保留,因为chef客户端现在对此一无所知

我明白,在理想的世界里,你可以用新的配置来启动一台新机器,而这个问题甚至不会引起它的注意。但是,我需要在无法重新配置的服务器上执行此操作(这只是用于在现有服务器上配置Apache的POC)

我可以只是“删除并重新创建”,但这听起来并不是幂等的。首先,文件时间戳会有所不同。让主厨客户做所有这些事情,即使没有什么事可做,似乎也是错误的

我自己想出了一个解决办法。在上面的示例中,在Ruby中,通过globbing
/opt/local/apache/
,迭代并删除实例(如果该实例不是在属性中定义的实例),可以获得所有实例名称的列表。我把它放到一个单独的配方中,我称之为
cleanup.rb
。如果我在主安装配方之后运行它,并且没有删除配置,那么它将不会起任何作用,因此运行起来似乎是安全的


这工作得很好,但它似乎很粗糙,我担心这可能是一种反模式。从概念上讲,我是以正确的方式进行,还是应该做一些不同的事情?在你的食谱中使用定制的Ruby代码来做这样的事情被认为是正常和正确的吗?

这里的区别通常被表述为“托管对象”和“托管集合”。单个
模板
资源聚合控制文件的状态,但您需要的是一个资源(实际的自定义资源或只是概念上的资源),它是所有文件的集合。您可以查看
zap
cookbook,了解这方面的半可重用实现,尽管该实现基于挖掘资源集合,而不是使用属性。与
zap
cookbook相比,基于属性的收集方法不那么脆弱,但也更加有限。Facebook的方法(即基于属性)可能在其sysctl食谱中得到了最好的例证


在这种情况下,听起来像是执行dir glob并将其与属性数据进行区分可能是正确的方法,但要理解这有时可能是“棘手的”。比如说,如果你在配方代码中设置了在那个glob之后发生的属性,它就不会知道了。这通常会导致特殊情况的升级,但也许你可以让事情更有序,一切都会好起来:)

谢谢coderanger。我签出了Zap,我必须明确地“Zap”所有文件夹(Apache服务器目录、内容目录、systemd单元文件,如果需要的话,还要对正在运行的服务进行Zap…)。我已经用了上面的方法。它似乎工作得很好。谢谢你的建议!