我对厨师比较陌生,所以我可能会遗漏一些非常基本的东西。经过多次搜索,我找不到我需要的东西,所以这里有:
在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]是可行的,但并不理想。有多人参与其中,似乎有人会忘记将配方添加到新角色中。
在理想的世界中,像我的第一个解决方案是可能的,因为这可以让我们尽可能保持环境的一致性。我对其他选择持开放态度。
总而言之,我认为我需要的是有人告诉我如何:
如果我遗漏了有关我们的厨师设置的任何细节,请告知我们。
免责声明:以上示例实际上是我实际尝试实现的非常简化的版本。我甚至没有使用系统日志,但它所针对的公司非常注重安全性,并且对公开发布环境的细节不满意。如果我遗漏了任何东西,我将尽可能详细,我需要添加更多信息。
答案 0 :(得分:1)
扩展上述内容,创建两个角色的问题是什么。客户端和服务器
客户端角色包括基本角色和客户端功能。它将通过在所有其他角色中使用此角色替换对“base”的引用来应用于所有服务器。这意味着这些角色仍然是基础,但也可以获得客户。
服务器是一个独立的角色,它只适用于那些服务器并具有基本服务器角色,然后具有服务器角色?
这样,客户端和服务器都可以获得应用于它们的基本角色,而无需复制基本角色的定义。您仍然可以根据需要管理该基本角色,但在创建角色时使用聚合?
创建新角色时,用户不会通过添加base来启动,而是添加syslog_client角色,该角色也为其提供基础。
对我而言,感觉就像Chef通过创建角色推动你的方式。我们所拥有的是一个适用于所有服务器的角色,一些适用于1个服务器子类型但不适用于其他服务器。这样,我们在应用程序中的叶子角色实际上包含4或5个其他角色。什么是常见的模式,可以在不需要逻辑的情况下共享?
另一种选择是将客户端配方添加到每个节点,第一个执行步骤是检查节点角色,是否说服务器基本上跳过了配方执行?哪个与您想要用来添加配方的逻辑相同,但它会存在于配方中并控制执行?
unless node[:roles].include?('syslog_server')
#Do your client install
end