有没有办法让节点共享一组公共模块,然后向它们添加特定模块?

Is there a way to make the nodes share a common group of modules and then add specific modules to them?

有没有办法让节点共享一组公共模块,然后向它们添加特定模块?

在我的配置中,所有节点都有一个基本配置,但其中一些节点有特定的模块。

在这些通用模块中,无论是什么模块,所有配置都是完全相同的,所以"easy"路径只是将它们添加到主清单中的每个节点。

硬编码是这样的:

node default{
    include module 1
    include module 2
    include module 3
    include module 4
}

node 'www.example1.com'{
    include module 1
    include module 2
    include module 3
    include module 4

    include module 5
    include module 6
}

node 'www.example2.com'{
    include module 1
    include module 2
    include module 3
    include module 4

    include module 7
    include module 8
}
[...]

如您所见,它非常重复且效率低下,主要是因为我将添加多个节点和模块。

有没有办法仅使用 Puppet 来完成此操作?

Is there a way to make the nodes share a common group of modules and then add specific modules to them?

是的,有几种方法。在 Puppet 4 之前还有更多,但我会坚持使用保质期不受限制的机制。

一般有三种可能性:

  1. 不是为每个节点声明每个特定模块,而是定义 类 聚合常见的模块组,并在您的节点上声明 those

  2. 将要应用于节点的 类 外部化,并通过 Hiera 数组合并查找加载它们。然后,您将获得 Hiera 共享数据的所有好处。有一个标准函数可以让这变得非常简单:hiera_include().

  3. 使用 ENC [帮助] 对您的节点进行分类。在 ENC 的源语言中使用您想要的任何机制来分组 类 并将组分配给节点。

@MattSchuchard 在他的评论中引用的角色和配置文件模式是一种流行且强大的类型 (1) 方法,您一定要研究一下。但是,这对于您的示例代码来说太过分了;我可能会改写这样的例子(一种更简单的 type-1 方法):

class default_modules {
    include module 1
    include module 2
    include module 3
    include module 4
}

node default{
    include default_modules
}

node 'www.example1.com'{
    include default_modules

    include module 5
    include module 6
}

node 'www.example2.com'{
    include default_modules

    include module 7
    include module 8
}
[...]