使用" ifvarclass =>之间有什么区别吗? '类'"或" class ::"添加承诺时的符号?

时间:2017-06-14 13:40:54

标签: cfengine

ifvarclass => 'class'构造与class::构建工作的方式有什么不同吗?我可以互换使用吗?

1 个答案:

答案 0 :(得分:2)

不完全,但差不多。请注意,每次使用类表达式时 (expression::)上下文限制适用于下一个表达式或 直到下一个承诺类型,因此它可能一次适用于多个承诺 ifvarclass一次只适用于一个承诺。也是因为3.7.0那里 是if aliasifvarclass,输入恕我直言更好。

对于基于简单类的约束,是的,它们可以互换使用。

bundle agent main
{
  vars:
    "classes" slist => { "linux", "windows" };

  reports:

    "I am a Linux box"
      ifvarclass => "linux";

    linux::
      "I am still a Linux box";
}

R: I am a Linux box
R: I am still a Linux box

您也可以互换使用简单表达式。

bundle agent main
{
  vars:
    "classes" slist => { "linux", "windows" };

  reports:

    "I am a Linux box"
      ifvarclass => "linux.64_bit";

    linux.64_bit::
      "I am still a Linux box";
}

R: I am a Linux box
R: I am still a Linux box

在3.7.0之前,您无法在传统的上下文类表达式中使用变量 ($(my_variable)::)和ifvarclass对于能够使用a非常有用 将变量作为约束。

例如,直到3.7你必须这样做:

bundle agent main
{
  vars:
    "classes" slist => { "linux", "windows" };

  reports:

    "I am $(classes) box"
      ifvarclass => "$(classes)";
}

R: I am linux box

从3.7开始,您可以使用variable class expressions

bundle agent main
{
  vars:
    "classes" slist => { "linux", "windows" };

  reports:

    "$(classes)"::
      "I am $(classes) box";
}

R: I am linux box

在你的检查包含字符的列表之前,它可以正常工作 在类(如破折号)中无效。这是ifvarclass最多的地方 有用,因为它允许您动态转换字符串甚至使用函数 返回类似isvariable()的布尔值。

以下示例显示了与canonify()一起使用的ifvarclass

bundle agent main
{
  classes:
    # A class that was derived from a string containing invalid characters like special-class
    "special_class" expression => "any";

  vars:
    "classes" slist => { "linux", "windows", "special-class" };

  reports:

    "I am $(classes) box"
      ifvarclass => canonify( $(classes) );
}

R: I am linux box
R: I am special-class box