3

我对厨师比较陌生,所以我可能会遗漏一些非常基本的东西。经过大量搜索,我没有找到我需要的东西,所以这里是:

在 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. 使第一个解决方案起作用。仅当不存在另一个角色时才将角色添加到运行列表
  2. 如果我不能拥有#1,我想就使用我列出的方式或我没有想到的其他想法来实现这一目标的最佳方式提出意见

如果我遗漏了有关我们厨师设置的任何有用的详细信息,请告诉我。

免责声明:上面的示例实际上是我实际尝试实现的非常简化的版本。我什至没有使用 syslog,但它所服务的公司非常注重安全,并且不会对公开发布他们的环境细节感到满意。如果我遗漏了任何内容并且我需要添加更多信息,我将尽可能详细。

4

1 回答 1

1

扩展上面所说的创建两个角色的问题。一个客户端和一个服务器

客户端角色包括基础角色和客户端功能。它将通过在所有其他角色中用此角色替换对“base”的引用来应用于所有服务器。这意味着这些角色仍然可以获得基础,但也可以获得客户。

服务器是一个独立的角色,仅适用于那些服务器并且具有基础和服务器角色?

这样,客户端和服务器都可以将基本角色应用于它们,而无需复制基本角色的定义。您仍然可以根据需要管理该基本角色,但在创建角色时使用聚合?

创建新角色时,用户不会从添加 base 开始,而是添加 syslog_client 角色,这也为他们提供了 base。

对我来说,这感觉就像 Chef 在推动你创建角色的方式。我们拥有的是适用于所有服务器的 1 个角色,其中一些适用于 1 个服务器子类型,但不适用于其他服务器。这样一来,我们应用的叶子角色实际上由 4 或 5 个其他角色组成。什么是共同的,以一种无需逻辑即可共享的方式建模?

另一种选择是将客户端配方添加到每个节点,第一个执行步骤是检查节点角色,如果它说服务器基本上只是跳过配方执行?哪个与您要用于添加配方的逻辑相同,但它会存在于配方中并控制执行?

unless node[:roles].include?('syslog_server')
   #Do your client install
end
于 2012-11-13T10:46:35.433 回答