管理厨师中的冲突角色

时间:2012-09-28 14:35:19

标签: conflict roles chef

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

在Chef中,我的角色是冲突的。我需要某个类型的所有服务器都有roleA,但具有roleB的服务器除外。

我能想到的最佳方式是用一个例子来说明:

syslog1,syslog2

web1,web2,web3

db1,db2

mail1,mail2

此环境中的每个服务器(数十个)都有一个名为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正确添加到roles属性(或不正确),但它实际上从未运行syslog_client角色。

我考虑将syslog_client移动到一个独立的配方而不是角色,并将角色属性移动到环境中。这样可行,因为我可以调用include_recipe "syslog::client"。问题在于,几乎所有的食谱都是从角色(而不是其他食谱)中分配出来的,我担心做出这样的改变会产生难以跟踪的一次性。除此之外,正如我已经提到的,这些实际上是几个食谱,因此将它们作为单一食谱添加并不理想。

我们目前正在处理的环境中有许多不同的服务器类型/角色,向它们添加角色[syslog_client]是可行的,但并不理想。有多人参与其中,似乎有人会忘记将配方添加到新角色中。

在理想的世界中,像我的第一个解决方案是可能的,因为这可以让我们尽可能保持环境的一致性。我对其他选择持开放态度。

总而言之,我认为我需要的是有人告诉我如何:

  1. 让第一个解决方案有效。仅当另一个角色不存在时,才将角色添加到运行列表
  2. 如果我不能拥有#1,我希望通过我列出的方式或其他我没有想过的方法来达到最佳方法的意见
  3. 如果我遗漏了有关我们的厨师设置的任何细节,请告知我们。

    免责声明:以上示例实际上是我实际尝试实现的非常简化的版本。我甚至没有使用系统日志,但它所针对的公司非常注重安全性,并且对公开发布环境的细节不满意。如果我遗漏了任何东西,我将尽可能详细,我需要添加更多信息。

1 个答案:

答案 0 :(得分:1)

扩展上述内容,创建两个角色的问题是什么。客户端和服务器

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

服务器是一个独立的角色,它只适用于那些服务器并具有基本服务器角色,然后具有服务器角色?

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

创建新角色时,用户不会通过添加base来启动,而是添加syslog_client角色,该角色也为其提供基础。

对我而言,感觉就像Chef通过创建角色推动你的方式。我们所拥有的是一个适用于所有服务器的角色,一些适用于1个服务器子类型但不适用于其他服务器。这样,我们在应用程序中的叶子角色实际上包含4或5个其他角色。什么是常见的模式,可以在不需要逻辑的情况下共享?

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

unless node[:roles].include?('syslog_server')
   #Do your client install
end