【问题标题】:Deleting configuration items with chef用主厨删除配置项
【发布时间】:2016-10-04 20:24:10
【问题描述】:

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

我目前正在使用 chef-client 根据为该节点定义的属性创建我的所有 Apache 实例。例如,我可能有定义Instance1Instance2Instance3 的属性。在这一点上,这一切都很好。实例目录是这样创建的:

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

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

如果我要从该节点的属性中删除Instance3,就会出现问题。我的 chef-client 运行将确保 Instance1Instance2 配置正确,但 Instance3 将保留为 chef-client 现在对此一无所知。

我了解,在理想情况下,您可能只是启动一台具有新配置的新机器,而这个问题甚至没有引起注意。但是,我需要在无法重新配置的服务器上执行此操作(这只是在现有服务器上配置 Apache 的 POC)。

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

我自己想出了一个解决方案。在上面的示例中,我将在 Ruby 中通过通配/opt/local/apache/ 获取所有实例名称的列表,如果它不是在属性中定义的实例,则迭代它们并删除实例。我把它放在一个单独的食谱中,我称之为cleanup.rb。如果我在主安装配方之后运行它并且没有删除配置,那么它不会做任何事情,所以运行起来似乎很安全。

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

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

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

    在这种情况下,听起来像是做一个 dir glob 并根据属性数据进行比较可能是正确的方法,但要理解这有时可能是“棘手的”。就像您在该 glob 之后发生的配方代码中设置属性一样,它不会知道它。这通常会导致特殊情况升级,但也许你可以让事情变得更有条理,就可以了:)

    【讨论】:

    • 感谢 coderanger。我检查了 Zap,我必须明确地在所有文件夹中“zap”(Apache 服务器目录、内容目录、systemd 单元文件,如果需要,也可以对正在运行的服务进行 zapping ......)。我已经按照上面的方法走了。它似乎运作良好。感谢您的建议!
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多