我将所有节点保存在一个文件 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.yaml
osfamily
/etc/puppet/hieradata/os-debian.yaml:
apache::package_name: apache2
/etc/puppet/hieradata/os-redhat.yaml:
apache::package_name: httpd
(请注意,如果你运行的是 3.0 之前的版本,参数查找行为会有所不同,详情请参阅此处)
这样,您就可以在不同的文件中设置不同范围(所有节点、基于事实的某些节点或一个特定节点)的包含的类和参数/变量设置。