使用节点继承

将所有服务器都放在一个篮子里的系统管理员是勇敢的(或者说是愚蠢的)。 比方说,你将服务器托管在三个不同的提供商:WreckSpace、GoDodgy 和 VerySlow。 他们有不同的数据中心且分布在不同的地理位置,所以你需要对服务器配置做一些小的改动, 以适应每个提供商。你有几种类型的服务器,它们随机分布在三个不同的提供商。

使用 Puppet 的一种实现方法是在节点定义中设置一个变量用于告知每个节点处于哪个提供商:

node webserver127 {
    $provider = "VerySlow"
    include admin::basics
    include admin::ssh
    include admin::ntp
    include puppet::client
    include backup::client
    include webserver
}

node loadbalancer5 {
    $provider = "WreckSpace"
    include admin::basics
    include admin::ssh
    include admin::ntp
    include puppet::client
    include backup::client
    include loadbalancer
}

正如你看到的,结果中存在大量的重复行。而使用下面的方法会比上面的方法容易得多。例如: 首先简单地定义一种 WreckSpace 节点,然后使用从这个节点 继承inherit) 的方法创建新节点,在新节点中只需要包含它要执行的类:比如 loadbalancer 或 webserver 即可。

操作步骤

  1. 为所有的节点创建一个基类,它仅包含每个节点都要执行的类,例如:

    node server {
        include admin::basics
        include admin::ssh
        include admin::ntp
        include puppet::client
        include backup::client
    }
    
  2. 通过这个 server 节点创建三个不同的子类,每个子类都设置了适当的 provider 变量:

    node wreckspace_server inherits server {
        $provider = "WreckSpace"
    }
    
    node gododgy_server inherits server {
        $provider = "GoDodgy"
    }
    
    node veryslow_server inherits server {
        $provider = "VerySlow"
    }
    
  3. 现在,为了要在 VerySlow 创建一个新的 Web 服务器,仅需要从 veryslow_server 继承即可:

    node webserver904 inherits veryslow_server {
        include webserver
    }
    

工作原理

当一个节点继承自另一个节点,它会应用父节点的所有配置。 然后你可以添加任何代码,从而使得这个节点成为有别于其他节点的特殊节点。

你可以配置一个节点继承自另外一个节点,而另外一个节点也可以继承自其它节点等。 但是你不能继承自多个节点(即不能多重继承),因此不能使用如下方式定义节点:

node movable_server inherits gododgy_server, veryslow_server,
wreckspace_server {
 # This won't work
}

更多用法

与定义一个普通节点一样,你可以指定一个节点列表,这些节点都继承自相同的节点定义:

node webserver1, webserver2, webserver3 inherits wreckspace_server {
    ...
}

另外,你也可以使用正则表达式匹配多个服务器节点:

node /webserver\d+.veryslow.com/ inherits veryslow_server {
    ...
}

参见本书