如何使用 basenode(在 nodes.pp 中)设置变量?

如何使用 basenode(在 nodes.pp 中)设置变量?

我正在尝试 Puppet,它看起来不错。

我的问题很简单,但我无法回答。

我有一个文件“node.pp”:

node basenode {
         include "dns"
#        include "ntp"
}


node 'myserver.domain.com' inherits basenode {
        $type_server = "client"
        include "ntp"
}

我想声明我的变量“$type_server”,而不必在每个服务器上声明“include ntp”。我想“basenode”包含“ntp”,并在我的服务器节点中使用“$type_server”的值。

该变量用于 NTP 的清单中。

提前致谢。

答案1

不要使用变量 —— 正如 Shane 所说,Puppet 中的变量作用域是 FUBAR,尝试使用它只会导致疼痛、折磨、恶心、头痛,甚至心脏病。

相反,使用已定义类型。这就是它们的设计目的。因此,不要到处使用类和包含,而是使用已定义类型并向其传递所需的数据:

define ntp_server($type_server) {
    # Do all the things you'd normally do, using $type_server as needed
}

node 'myserver.domain.com' {
    ntp_server { ntp:
        type_server => "client"
    }
}

答案2

Puppet 中的作用域有点……不直观。这是一种线性求值行为——由于继承发生在变量定义之前,并且继承类中包含的类会立即被求值,因此变量被设置你需要它。

不要继承,尝试在每个节点的底部包含“基”,这样在设置必要的变量后就会对其进行评估。这不是一种非常面向对象的方法,但这种范围行为并没有留下太多选择。

node 'myserver.domain.com' {
    $type_server = "client"
    include basenode
}

答案3

我知道这已经很老了,但是当我遇到一些麻烦并发现这个线程时,它可能对其他人有用。

不要使用定义的类型或在节点中包含节点(这听起来不太好),我建议使用参数化类通过使用它,作者可以继续正常使用他的类,并且这些类只需要稍加修改就可以接收(它们已经在使用的)变量作为参数。

因此,例如,而不是:

class foo {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

它可能有:

class foo($content) {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

像这样使用它:

node 'myserver.domain.com' {
    class { 'foo':
        $content => "something pretty smart"
    }
}

相关内容