gpt4 book ai didi

conflict - 管理 Chef 中相互冲突的角色

转载 作者:行者123 更新时间:2023-12-02 03:55:57 25 4
gpt4 key购买 nike

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

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

我能想到的最好的描述方式是举个例子:

系统日志 1、系统日志 2

web1, web2, web3

db1,db2

邮件 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

问题是此时节点对象不存在。我考虑过将它移到 Recipe 中,但我也想不出一个好的方法。我能够在基本配方中使用它:

unless node[:roles].include?('syslog_server')
node[:roles]+=['syslog_client']
end

这会将 syslog_client 添加到角色属性(或未正确添加),但它从未实际运行 syslog_client 角色。

我考虑过将 syslog_client 移动到一个独立的配方而不是一个角色中,并将角色属性移动到环境中。这会起作用,因为这样我就可以调用 include_recipe "syslog::client"。问题是我们几乎所有的 Recipe 都是根据角色分配的(而不是其他 Recipe ),我担心进行此更改会造成难以跟踪的一次性。除此之外,正如我已经提到的,这些实际上是几个 Recipe ,因此将它们作为一个 Recipe 添加并不理想。

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

在理想情况下,像我的第一个解决方案这样的事情是可能的,因为这使我们能够尽可能保持环境的一致性。不过,我对其他选择持开放态度。

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

  1. 使第一个解决方案奏效。仅当另一个角色不存在时才将角色添加到运行列表
  2. 如果我不能获得第一名,我希望就使用我列出的方法或我没有想到的其他想法实现这一目标的最佳方式发表意见

如果我遗漏了有关 Chef 设置的任何有用信息,请告诉我。

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

最佳答案

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

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

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

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

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

对我来说,这就像 Chef 插入您创建角色的方式。我们拥有的是适用于所有服务器的 1 个角色,一些角色适用于 1 个子类型的服务器,但不适用于其他服务器。这样一来,我们的叶子角色(如被应用的角色)实际上由 4 或 5 个其他角色组成。以无需内部逻辑即可共享的方式建模是常见的吗?

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

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

关于conflict - 管理 Chef 中相互冲突的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com