我对厨师比较陌生,所以我可能会遗漏一些非常基本的东西。经过大量搜索,我没有找到我需要的东西,所以这里是:
在 Chef 中,我的角色相互冲突。我需要某种类型的所有服务器都具有角色 A,但具有角色 B 的服务器除外。
我能想到的最好的描述方式是举个例子:
系统日志 1、系统日志 2
网络1、网络2、网络3
数据库 1、数据库 2
邮件1,邮件2
此环境中的每台服务器(数十个)都有一个名为 syslog_client 的角色,但 syslog1 和 syslog2 除外,它们需要具有角色 syslog_server。
syslog-server 和 syslog-client 角色冲突,因为它们以不同的方式配置相同的软件。
这些是角色而不是食谱,因为它们实际上包含多个食谱。
我想过做这样的事情:
角色/base.rb:
name "base"
description "base configuration"
override_attributes(
)
default_attributes(
)
run_list(
"recipe[one]",
"recipe[two]",
"recipe[three]",
"role[uno]"
)
unless node[:roles].include?('syslog_server')
run_list('role[syslog_client]')
end
问题是此时节点对象不存在。我曾考虑将其移入食谱中,但我也想不出一个好方法来做。我能够在基本配方中使用它:
unless node[:roles].include?('syslog_server')
node[:roles]+=['syslog_client']
end
这会将 syslog_client 添加到角色属性(或不正确),但它从未实际运行 syslog_client 角色。
我已经考虑将 syslog_client 移动到一个独立的配方而不是一个角色中,并将角色属性移动到环境中。这会起作用,因为那样我就可以打电话了include_recipe "syslog::client"
。问题是我们几乎所有的食谱都是从角色分配的(而不是从其他食谱中分配的),我担心做出这种改变会造成一次性的难以跟踪。除此之外,正如我已经提到的,这些实际上是几个食谱,因此将它们作为一个食谱添加并不理想。
在我目前工作的环境中,我们有许多不同的服务器类型/角色,向它们添加角色 [syslog_client] 是可行的,但并不理想。由于有多个人在此工作,似乎有人会忘记将配方添加到新角色中。
在一个理想的世界里,像我的第一个解决方案这样的东西是可能的,因为这使我们能够尽可能地保持我们的环境一致。不过,我对其他选择持开放态度。
所以总结一下,我认为我需要有人告诉我如何:
- 使第一个解决方案起作用。仅当不存在另一个角色时才将角色添加到运行列表
- 如果我不能拥有#1,我想就使用我列出的方式或我没有想到的其他想法来实现这一目标的最佳方式提出意见
如果我遗漏了有关我们厨师设置的任何有用的详细信息,请告诉我。
免责声明:上面的示例实际上是我实际尝试实现的非常简化的版本。我什至没有使用 syslog,但它所服务的公司非常注重安全,并且不会对公开发布他们的环境细节感到满意。如果我遗漏了任何内容并且我需要添加更多信息,我将尽可能详细。