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

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

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

导入指令看起来非常有前景,但据我了解,每次更改内容时都需要重新启动 puppermaster。对我来说,这是不可接受的。

还有其他方法吗?不用使用大注释来分隔节点/组。现在我只使用 rdoc。

我很高兴接受任何建议:-)

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

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

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

答案1

我有一个网站.pp看起来像这样:

import "nodes/*.pp"

并有一个nodes/目录manifests/

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

答案2

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

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

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


Hiera 包含在 Puppet 3.0 中 - 在旧版本中需要单独安装。要设置 Hiera 来处理您的节点定义,您需要执行以下操作:

site.pp (全部内容):

hiera_include(classes)

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

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

/etc/puppet/hieradata/common.yaml:

classes:
  - ntp

/etc/puppet/hieradata/节点名.example.com.yaml:

classes:
  - apache

这个数组是聚合的——nodename.example.com节点将同时获取ntp来自公共文件的类和apache来自它自己的文件的类。

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

class apache ( $port ) {
  ...

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

/etc/puppet/hieradata/common.yaml:

classes:
  - ntp

apache::port: 80

但是您想要覆盖该设置nodename.example.com,将其设置为 8080:

/etc/puppet/hieradata/节点名.example.com.yaml:

classes:
  - apache

apache::port: 8080

或者,您可以根据文件os-%{osfamily}中关于给定节点的事实(在本例中为事实)进行设置。hiera.yamlosfamily

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

apache::package_name: apache2

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

apache::package_name: httpd

(请注意,如果你运行的是 3.0 之前的版本,参数查找行为会有所不同,详情请参阅此处

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

相关内容