如何维护多节点的site.pp?

Tom*_*ski 3 linux puppet puppetmaster

我将所有节点保存在一个文件 site.pp 中 - 但是随着我添加越来越多的节点,维护它们变得非常困难。

导入指令看起来很有前途,但据我了解文档,每次发生变化时都必须重新启动 puppermaster。对我来说这是不可接受的。

有没有其他方法可以做到这一点?而不是使用大注释来分隔节点/组。现在我只使用 rdoc。

我会很高兴有任何建议:-)

我当前的 puppet 目录结构如下所示:

  • 清单/site.pp
  • manifests/extdata/(用于 extlookup)
  • 模块/模块 1
  • 模块/模块 2
  • 文件/公钥...

我使用 git/rsync 部署 puppet 配置以仅覆盖更改的文件。

Tom*_*nor 7

我有一个看起来像这样的site.pp

import "nodes/*.pp"
Run Code Online (Sandbox Code Playgroud)

并有一个nodes/目录manifests/

这样我就有了一组节点"workstations.pp" "webservers.pp"等等..

  • 请记住,[`import 'nodes/*.pp'` 在 Puppet 3.5 中已弃用](http://docs.puppetlabs.com/puppet/latest/reference/lang_import.html#deprecation-notice) 并将被删除在人偶4中。 (4认同)
  • @Felipe 据我所知,没有简单的替代方案。使用“site.pp”或“import 'nodes/*.pp”等文件对节点进行分类已在 Puppet 社区(尤其是 PuppetLabs)中失宠。我仍然不清楚最好的替代方案是什么,但似乎首选的解决方法是 Heira 或使用 ENC,例如 The Foreman 或 Puppet Enterprise。对这些替代方案的讨论相当详细,值得进行全面讨论。我确实尝试过:http://ask.puppetlabs.com/question/10975/for-node-definitionclassification-what-is-the-successor-to-import-nodespp-now-that-import-is-deprecated/ (2认同)

Sha*_*den 5

在清单之外定义您的节点。我推荐 extlookup 的继任者 Hiera,但实际上任何外部节点分类器都足以将您的节点数据移出清单。

这是目前处理节点定义的推荐方法 - 来自文档

大多数情况下,大多数用户应该使用类似包含的声明并在其外部数据中设置参数值。但是,与早期版本的 Puppet 的兼容性可能需要妥协。


Hiera 包含在 Puppet 3.0 中 - 它需要在旧版本中单独安装。要设置 Hiera 来处理您的节点定义,您需要按照以下方式做一些事情:

site.pp(整个事情):

hiera_include(classes)
Run Code Online (Sandbox Code Playgroud)

hiera.yaml:

:backends:
  - yaml

:hierarchy:
  - %{clientcert}
  - os-%{osfamily}
  - common

:yaml:
   :datadir: /etc/puppet/hieradata
   # A good alternative if you want different node data based on environments:
   #:datadir: /etc/puppet/environments/%{environment}/hieradata

:puppet:
   :datasource: data
Run Code Online (Sandbox Code Playgroud)

现在,Puppet 将查看在/etc/puppet/hieradata您的节点上提取数据。假设你有一个ntp你想要的类,一个apache你只想要一个特定节点的类:

/etc/puppet/hieradata/common.yaml:

classes:
  - ntp
Run Code Online (Sandbox Code Playgroud)

/etc/puppet/hieradata/nodename.example.com.yaml:

classes:
  - apache
Run Code Online (Sandbox Code Playgroud)

这个数组是聚合的——nodename.example.com节点将从ntp公共文件中获取apache类,从自己的文件中获取类。

Hiera 还为您处理类参数。假设您的apache班级需要一个port参数:

class apache ( $port ) {
  ...
Run Code Online (Sandbox Code Playgroud)

您也可以在 Hiera 数据文件中进行设置。如果您希望它默认为端口 80..

/etc/puppet/hieradata/common.yaml:

classes:
  - ntp

apache::port: 80
Run Code Online (Sandbox Code Playgroud)

但是你想覆盖它nodename.example.com,将它设置为 8080:

/etc/puppet/hieradata/nodename.example.com.yaml:

classes:
  - apache

apache::port: 8080
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用os-%{osfamily}hiera.yaml文件基于关于给定节点的事实设置-osfamily在这种情况下的事实。

/etc/puppet/hieradata/os-debian.yaml:

apache::package_name: apache2
Run Code Online (Sandbox Code Playgroud)

/etc/puppet/hieradata/os-redhat.yaml:

apache::package_name: httpd
Run Code Online (Sandbox Code Playgroud)

(请注意,如果您运行的版本早于 3.0,则参数查找行为会有所不同,请参阅此处了解详细信息

这样,您就可以在不同的文件中设置不同范围(所有节点、某些基于事实的节点或一个特定节点)的包含类和参数/变量设置。