我正在研究 CFEngine,但我对这个概念还很陌生。根据我的要求,我使用单个服务器并使用 10 个客户端,现在所有十个客户端都从服务器提取策略并执行策略。
但我的要求是,该策略仅适用于 10 个客户端中的一个,特定客户端如何才能仅提取策略并执行它。
请给我建议,我对此非常困惑。
谢谢
答案1
maciejmrowiec 的答案很好,但不完整;CFEngine 没有义务在所有节点上做出相同的承诺;但这是默认行为
有两种方法可以实现您想要做的事情:
- 到处都有相同的承诺(默认实现),并使用类来控制哪个主机做什么(为此,我请您参考 maciejmrowiec 的回答,该回答对这个话题相当全面)
在不同的系统上有不同的承诺。有理由不希望所有系统都具有相同的承诺:您不想共享的秘密、测试/预生产/生产环境(干扰测试承诺不应破坏生产)。因此,您可以拥有不同的承诺集,并将它们存储在策略服务器上的不同文件夹中(例如 /var/cfengine/masterfiles/folder1 和 /var/cfengine/masterfiles/folder2);并配置 cf-server 以仅将这些文件夹共享给正确的主机
bundle server access_rules() { access: "/var/cfengine/masterfiles/share/folder1" admit => { "host1", "host2", "host3" }; "/var/cfengine/masterfiles/folder2" admit => { "host55" }; }
并让 update.cf 文件从正确的位置复制承诺
host55::
"$(sys.workdir)"
copy_from =>u_rcp("/var/cfengine/masterfiles/folder2", "$(sys.policy_hub)");
!host55::
"$(sys.workdir)"
copy_from =>u_rcp("/var/cfengine/masterfiles/folder1", "$(sys.policy_hub)");
答案2
正如我正确理解的那样,您想要控制哪个策略应该转到特定节点来执行?
CFEngine 的工作方式是将所有策略分发给所有客户端并执行。为了控制在哪台机器上执行什么,cfengine 策略语言中有一种称为上下文类的机制。
上下文类只是可以具有 2 种状态的系统属性 - 存在或不存在。例如,您的机器是 Debian 系统,那么要在所有 Debian 系统上执行策略,您将使用此类来确定其适用范围。有一些硬类是由 cfengine 自动发现的,您可以自行设置。要指向特定机器,您可以使用 IP、MAC 或主机名,它们也设置为类。
为什么需要将所有策略分发给所有客户端?因为有些系统属性不像操作系统或主机名那样恒定。类别可能取决于正在运行的服务或 CPU 负载、硬盘是否已满等。然后,您需要有完整的策略来了解如何应对不断变化的环境,因为每次您想要运行策略时都会设置类别。
如何使用上下文类?以下是简单策略的示例:
bundle agent my_test
{
files:
debian:: #hardclass
"/tmp/file1"
create => "true";
redhat:: #hardclass
"/tmp/file2"
create => "true";
}
此策略将在所有 debian 系统上创建 /tmp/file1,并在所有 redhat 系统上创建 /tmp/file2。
您可以使用逻辑表达式,例如 ipv4_192_168_122_116.cpu_high,表示在 IP 为 192.168.122.116 的主机上运行并且该机器的 CPU 负载很高。
要获取更多有趣的示例,请尝试以下操作:https://github.com/cfengine/design-center/tree/master/examples
参考手册始终是一个很好的参考点:http://cfengine.com/manuals/cf3-Reference#Decisions
要列出当前机器上设置的类,可以使用“cf-promises -v”
我希望这对你有帮助。