使用我们的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先生的书。虽然我喜欢在某些时候,但是当我有时间......)
答案 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
属性可用于任何承诺类型。