【发布时间】:2016-10-04 20:24:10
【问题描述】:
我对 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-client 运行将确保 Instance1 和 Instance2 配置正确,但 Instance3 将保留为 chef-client 现在对此一无所知。
我了解,在理想情况下,您可能只是启动一台具有新配置的新机器,而这个问题甚至没有引起注意。但是,我需要在无法重新配置的服务器上执行此操作(这只是在现有服务器上配置 Apache 的 POC)。
我可以“删除并重新创建”,但这对我来说听起来不是幂等的。一方面,文件时间戳会有所不同。即使没有什么可做,让厨师-客户做所有这些事情似乎也是错误的。
我自己想出了一个解决方案。在上面的示例中,我将在 Ruby 中通过通配/opt/local/apache/ 获取所有实例名称的列表,如果它不是在属性中定义的实例,则迭代它们并删除实例。我把它放在一个单独的食谱中,我称之为cleanup.rb。如果我在主安装配方之后运行它并且没有删除配置,那么它不会做任何事情,所以运行起来似乎很安全。
这很好用,但似乎 hacky 我担心这可能是一种反模式。从概念上讲,我是以正确的方式去做还是应该做一些不同的事情?在你的食谱中使用自定义 Ruby 代码来做这样的事情是否被认为是正常和正确的?
【问题讨论】:
标签: chef-infra