Configuration cfengine3是否有一种简单的方法可以根据其运行的操作系统复制不同的文件

Configuration cfengine3是否有一种简单的方法可以根据其运行的操作系统复制不同的文件,configuration,cfengine,Configuration,Cfengine,我有两个不同版本的linux/unix,每个版本都运行cfengine3。是否可以在两台机器上都放一个promises.cf文件,根据客户端上的操作系统复制不同的文件?我已经在互联网上搜索了几个小时,还没有找到任何有用的东西。有几种方法可以做到这一点。最简单的情况是,您可以拥有不同的文件:承诺取决于操作系统,例如: files: ubuntu_10:: "/etc/hosts" copy_from => mycopy("$(repository)/etc.hosts

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

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

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

{ ".superman.justiceleague.com", ".superman", ".justiceleague.com", ".suse_11",
  ".linux", "" }
执行文件复制承诺时,隐式循环将导致这些字符串按顺序追加到“$(存储库)/etc/hosts”,因此将按顺序尝试以下文件名:hosts.superman.justiceleague.com、hosts.justiceleague.com、hosts.suse_11、hosts.linux和hosts。存在的第一个将通过客户端中的/etc/hosts进行复制,其余的将被跳过

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

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

我希望这有帮助


(附言和无耻的插头:这是从我即将出版的书,“”,由O'Reilly出版)

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

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

{ ".superman.justiceleague.com", ".superman", ".justiceleague.com", ".suse_11",
  ".linux", "" }
执行文件复制承诺时,隐式循环将导致这些字符串按顺序追加到“$(存储库)/etc/hosts”,因此将按顺序尝试以下文件名:hosts.superman.justiceleague.com、hosts.justiceleague.com、hosts.suse_11、hosts.linux和hosts。存在的第一个将通过客户端中的/etc/hosts进行复制,其余的将被跳过

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

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

我希望这有帮助

(附言和无耻的插头:这是从我即将出版的书,”,由O'Reilly出版)