在 Puppet 中,指定一对类是互斥的最好方法是什么?

在 Puppet 中,指定一对类是互斥的最好方法是什么?

我有一个像这样的默认节点:

node default {
    include test_server
    # A bunch of other irrlevant includes
}

然后我有一个像这样的节点规范:

node linus inherit default {
    include production_server
}

我想取消包含test_server并且production_server因为它们是互相排斥的。

我如何实现这个目标?

答案1

最好创建一个名为“servertype”的类并根据参数进行区分。

class servertype($testing = false) {
  if ($testing) {
     ... resources from your testing class ...
  } else {
     ... resources from your production class ...
  }
}

答案2

一般来说,使用电子海图(外部节点分类器)是将类应用于主机(而不是节点文件)的最佳选择。您可以创建“主机组”,其中每个组都有多个类。这样您就可以避免继承。有几种可用的 ENC,因此您不必自己创建。

答案3

Puppet 中没有“取消包含”的概念;一旦您包含了某个内容,它就被包含了。您能做的最好的事情就是创建一个包含的类,该类在内部执行分派以包含 或test_serverproduction_server具体取决于情况(查看事实、查看传入的变量等)。

除此之外,如果同时包含两个类,则可能会导致错误。一个简单的方法是简单地在每个类中包含一个标记资源,其中资源在两个位置具有相同的名称:

notice { unused:
  loglevel => debug,
}

尝试包含这两个类将导致编译器失败,从而阻止目录进行编译。

另一个选择是使用defined每个类中的函数来测试另一个类是否已经定义。如果是,则fail

if defined(Class["test_server"]) {
  fail "Can't include test_server and production_server at the same time"
}

defined但是,它具有一些特殊的语义,因为它依赖于顺序,而 Puppet 在解析/评估顺序方面并没有真正提供那么多保证。

相关内容