是否有任何方法围绕主机名中没有点" CFEngine中的规则?

时间:2015-08-20 19:41:57

标签: cfengine

使用我们的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语法规则吗?

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

(顺便说一下,我已经阅读了Host group on CFEngine - 请不要告诉我必须阅读Zamboni先生的书。虽然我喜欢在某些时候,但是当我有时间......)

1 个答案:

答案 0 :(得分:1)

错误将在于您使用"表达式"你的类承诺的属性(也是"或"属性)。您正在使用"$(tfn_roles.daily_tasks_server)",在您的示例中评估为"vps007_dfw_domain_org"。然后CFEngine将其解析为类表达式,发现没有名为vps007_dfw_domain_org的类集,因此将整个类表达式计算为false。由于类promise的expression属性的计算结果为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,但ifvarclass属性可用于任何承诺类型。