1

我有两个不同版本的 linux/unix,每个版本都运行 cfengine3。是否可以在两台机器上放置一个 promises.cf 文件,该文件将根据客户端上的操作系统复制不同的文件?我已经在互联网上搜索了几个小时,但还没有找到任何有用的东西。

4

1 回答 1

4

有几种方法可以做到这一点。最简单的是,您可以简单地拥有不同的文件:promise 取决于操作系统,例如:

files:
  ubuntu_10::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.ubuntu_10");
  suse_9::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.suse_9");
  redhat_5::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.redhat_5");
  windows_7::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.windows_7");

这个例子可以很容易地通过实现内置的CFEngine变量$(sys.flavor)包含操作系统的类型和版本来简化,所以我们可以重写这个例子如下:

"/etc/hosts"
    copy_from => mycopy("$(repository)/etc.$(sys.flavor)");

实现此任务的更灵活的方法在 CFEngine 术语中称为“分层复制”。在此模式中,您可以指定一个任意变量列表,您希望通过这些变量来区分文件,以及应该考虑它们的顺序,从最具体到最一般。当执行复制承诺时,将复制找到的最具体的文件。

这种模式实现起来非常简单:

# Use single copy for all files
body agent control
{
   files_single_copy => { ".*" };
}

bundle agent test
{
vars:
  "suffixes"   slist => { ".$(sys.fqhost)", ".$(sys.uqhost)", ".$(sys.domain)",
                          ".$(sys.flavor)", ".$(sys.ostype)", "" };
files:
  "/etc/hosts"
    copy_from => local_dcp("$(repository)/etc/hosts$(suffixes)");
}

如您所见,我们正在定义一个名为 $(suffixes) 的列表变量,其中包含我们想要区分文件的标准。此列表中包含的所有变量都是由 CFEngine 自动定义的,尽管您可以使用任意 CFEngine 变量。然后我们简单地将该变量作为标量包含在我们的 copy_from 参数中。因为 CFEngine 会自动扩展列表,它会依次尝试每个变量,多次执行复制承诺(列表中的每个值一个)并复制第一个存在的文件。例如,对于名为 superman.justiceleague.com 的 Linux SuSE 11 机器,@(suffixes) 变量将包含以下值:

{ ".superman.justiceleague.com", ".superman", ".justiceleague.com", ".suse_11",
  ".linux", "" }

当执行文件复制承诺时,隐式循环将导致这些字符串依次附加到“$(repository)/etc/hosts”,因此将依次尝试以下文件名:hosts.superman.justiceleague.com, hosts.justiceleague.com、hosts.suse_11、hosts.linux 和 hosts。第一个存在的将被复制到客户端中的 /etc/hosts 上,其余的将被跳过。

为了使这项技术发挥作用,我们必须在您要处理的所有文件上启用“单一副本”。这是一个配置参数,告诉 CFEngine 最多复制每个文件一次,忽略同一目标文件的连续复制操作。代理控制正文中的 files_single_copy 参数指定正则表达式列表,以匹配应应用单副本的文件名。通过将其设置为".*"我们匹配所有文件名。

对于与任何现有文件都不匹配的主机,列表中的最后一项(空字符串)将导致复制通用主机文件。请注意,每个文件名的点都包含在 $(suffixes) 中,最后一个元素除外。

我希望这有帮助。

(ps和无耻的插件:这是摘自我即将出版的书,“学习CFEngine 3 ”,由O'Reilly出版)

于 2012-01-24T06:56:06.893 回答