0

通过我们的 cfengine 设置,我一直想要定义由主机组组成的类,并且我们有很多主机名由 4 部分组成,其中短名称是非唯一的。我反复阅读文档说不要在主机名中使用点,但有时在某些情况下,它似乎可以使用 xxx_yyy_domain_com,例如:

在角色文件中,我们定义了一个包含一堆机器的数组作为名称服务器:

bundle agent tfn_roles {

vars:

# DNS servers
"dns_servers" slist => {
    "hetzner8",     # ns-frk
    "ubiquity1",    # ns-lax
    "ns_ubi3_domain_org",
    "vps001_dfw_domain_org",   # ns-dfw
    "tagadab2",     # ns-lcy
    "atlantic1",    # ns-mco
};

然后在 bind9.cf 承诺文件中:

bundle agent service_bind9 {

meta:
    "tags" slist => { "autorun" };

classes:
    "dns_servers" or => { "@(tfn_roles.dns_servers)" };

并且对于那些具有带下划线的 FQDN 的 2 个主机,该类的一系列承诺似乎正确执行。

但是,在同一个角色文件中,我们有另一个仅由字符串定义的类:

# Server running the daily tasks - should only be one.
"daily_tasks_server" string => "vps007_dfw_domain_org";

然后在日常任务承诺文件中:

bundle agent service_daily_tasks {

meta:
    "tags" slist => { "autorun" };

classes:
    "daily_task_server" expression => "$(tfn_roles.daily_tasks_server)";

这似乎不起作用。

有人可以解释为什么,以及解决方法吗?我是否不得不说:

"daily_task_server" or => "$(tfn_roles.daily_tasks_server)"; 

如果是这样,为什么?我误解了一些基本的cfengine语法规则吗?

更新:不,进行上述更改仍然无效。

(顺便说一句,我已经阅读了 CFEngine 上的主机组- 请不要告诉我我必须阅读 Zamboni 先生的书。虽然我很想在某个时候阅读,但当我有时间时......)

4

1 回答 1

1

错误在于您使用类承诺的“表达式”属性(也是“或”属性)。您正在使用,在您的示例"$(tfn_roles.daily_tasks_server)"中评估为。"vps007_dfw_domain_org"然后 CFEngine 将其解析为一个类表达式,发现没有设置名称的类vps007_dfw_domain_org,因此将整个类表达式评估为假。由于类 promise 的表达式属性的计算结果为 false(如果您在后台查看),因此未设置"!any"该类。"daily_task_server"

"daily_task_server"老实说,我不太明白你期望在课堂上做什么。类是booleans,您似乎正在尝试将字符串填充到类中。也许您应该使用 vars 承诺?但是,如果没有看到您最终要完成的工作,我很难确定。

http://www.cfenginetutorial.org/最近上线了;您可能会发现它有助于清除 CFEngine 语法和术语定义。(全面披露:我与作者密切合作。;)


编辑:根据您的评论,您需要一个特定服务器的值和所有其他服务器的不同(默认)值,您需要如下代码:

bundle agent whatever {
  vars:
    any::
      "myvar"
        string => "Default value to apply to all servers";

      "myvar"
        string => "Value only to apply to host001.mydomain.com",
        ifvarclass => strcmp( "$(sys.fqhost)", "host001.mydomain.com" );
}

你使用什么类型的承诺并不重要。我没有使用过很多包的承诺,但是可以做类似下面的事情,同样不使用类,只使用ifvarclass属性:

bundle agent handle_packages {
  packages:
      "apache"
        policy => "present",
        package_module => "yum",
        version => "2.2.22",
        ifvarclass => strcmp( "$(sys.fqhost)", "host001.mydomain.com" ),
        comment => "Only install this on host001";

      "apache"
        policy => "absent",
        package_module => "yum",
        ifvarclass => not( strcmp( "$(sys.fqhost)", "host001.mydomain.com" )),
        comment => "...Remove it everywhere else.";
}

因为我还在 3.6.6 上,所以我没有使用过多少包 Promise,但是该ifvarclass属性可以在任何 Promise 类型中使用。

于 2016-02-09T07:53:57.630 回答