Puppet 外部工具与生态系统实用指南
1. 添加外部事实
1.1 准备工作
要在系统中添加外部事实,需完成以下准备:
1. 确保使用 Facter 1.7 或更高版本,可通过以下命令查看版本:
[root@cookbook ~]# facter facterversion
2.3.0
[root@cookbook ~]# facter -v
2.3.0
- 创建外部事实目录:
[root@cookbook ~]# mkdir -p /etc/facter/facts.d
1.2 操作步骤
以下是创建简单外部事实的步骤:
1. 创建
/etc/facter/facts.d/local.txt
文件,内容如下:
model=ED-209
-
运行
facter命令查看结果:
[root@cookbook ~]# facter model
ED-209
若要计算动态事实,如登录用户数量,可创建可执行事实:
1. 创建
/etc/facter/facts.d/users.sh
文件,内容如下:
#!/bin/sh
echo users=`who |wc -l`
- 使文件可执行:
[root@cookbook ~]# chmod a+x /etc/facter/facts.d/users.sh
-
检查
users值:
[root@cookbook ~]# facter users
2
1.3 工作原理
-
Facter 会在
/etc/facter/facts.d目录中查找.txt、.json或.yaml文件。 -
对于文本文件,Facter 会解析
key=value对并添加为新事实。 -
对于 YAML 或 JSON 文件,Facter 会按相应格式解析
key=value对。例如,YAML 文件内容如下:
---
registry: NCC-68814
class: Andromeda
shipname: USS Prokofiev
运行
facter registry class shipname
命令,输出结果为:
class => Andromeda
registry => NCC-68814
shipname => USS Prokofiev
-
对于可执行文件,Facter 会执行并将输出的
key=value对添加到内部事实哈希中。 - 若存在多个匹配的键,Facter 会根据权重属性确定返回的事实。外部事实的权重为 10,000,可覆盖默认事实。例如:
[root@cookbook ~]# facter architecture
x86_64
[root@cookbook ~]# echo "architecture=ppc64">>/etc/facter/facts.d/myfacts.txt
[root@cookbook ~]# facter architecture
ppc64
1.4 更多信息
由于所有外部事实的权重均为 10,000,它们在
/etc/facter/facts.d
目录中的解析顺序决定了优先级,最后解析的事实优先级最高。若要创建优先级更高的事实,可将其放在按字母顺序排列较后的文件中。例如:
[root@cookbook ~]# facter architecture
ppc64
[root@cookbook ~]# echo "architecture=r10000" >>/etc/facter/facts.d/z-architecture.txt
[root@cookbook ~]# facter architecture
r10000
1.5 调试外部事实
若 Facter 无法识别外部事实,可使用调试模式查看情况:
ubuntu@cookbook:~/puppet$ facter -d robin
Fact file /etc/facter/facts.d/myfacts.json was parsed but returned an empty data set
此错误表示 Facter 在文件或可执行事实的输出中未找到
key=value
对。
1.6 在 Puppet 中使用外部事实
创建的外部事实可同时供 Facter 和 Puppet 使用。在 Puppet 清单中引用外部事实,可直接使用事实名称,就像使用内置或自定义事实一样。例如:
notify { "There are $::users people logged in right now.": }
除非特意覆盖已定义的事实,否则应避免使用预定义事实的名称。
2. 将事实设置为环境变量
2.1 操作步骤
以下是通过环境变量设置事实的示例:
1. 保持节点定义如下:
node cookbook {
notify {"$::hello": }
}
- 运行以下命令:
[root@cookbook ~]# FACTER_hello="Hallo Welt" puppet agent -t
Info: Caching catalog for cookbook.example.com
Info: Applying configuration version '1416212026'
Notice: Hallo Welt
Notice: /Stage[main]/Main/Node[cookbook]/Notify[Hallo Welt]/message: defined 'message' as 'Hallo Welt'
Notice: Finished catalog run in 0.27 seconds
3. 使用 Puppet resource 命令生成清单
3.1 操作示例
以下是使用
puppet resource
从运行中的系统获取数据的示例:
1. 生成特定用户的清单:
[root@cookbook ~]# puppet resource user thomas
user { 'thomas':
ensure => 'present',
comment => 'thomas Admin User',
gid => '1001',
groups => ['bin', 'wheel'],
home => '/home/thomas',
password => '!!',
password_max_age => '99999',
password_min_age => '0',
shell => '/bin/bash',
uid => '1001',
}
- 生成特定服务的清单:
[root@cookbook ~]# puppet resource service sshd
service { 'sshd':
ensure => 'running',
enable => 'true',
}
- 生成特定包的清单:
[root@cookbook ~]# puppet resource package kernel
package { 'kernel':
ensure => '2.6.32-431.23.3.el6',
}
3.2 更多信息
可使用
puppet resource
检查 Puppet 中可用的各种资源类型。对于可枚举资源,可输出系统中每个资源的状态;对于不可枚举资源,会返回错误信息。例如:
[root@cookbook ~]# puppet resource service
service { 'abrt-ccpp':
ensure => 'running',
enable => 'true',
}
service { 'abrt-oops':
ensure => 'running',
enable => 'true',
}
# 其他服务...
[root@cookbook ~]# puppet resource file
Error: Could not run: Listing all file instances is not supported.
Please specify a file or directory, e.g. puppet resource file /etc
4. 使用其他工具生成清单
4.1 准备工作
使用 Blueprint 工具前,需完成以下准备:
1. 安装
python-pip
包:
[root@cookbook ~]# puppet resource package python-pip ensure=installed
- 安装 Blueprint:
[root@cookbook ~]# pip install blueprint
若系统未安装 Git,可能需要先安装。
4.2 操作步骤
运行 Blueprint 的步骤如下:
1. 执行以下命令:
[root@cookbook ~]# mkdir blueprint && cd blueprint
[root@cookbook blueprint]# blueprint create -P blueprint_test
- 查看生成的代码:
#
# Automatically generated by blueprint(7). Edit at your own risk.
#
class blueprint_test {
Exec {
path => '/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin',
}
Class['sources'] -> Class['files'] -> Class['packages']
class files {
file {
'/etc':
ensure => directory;
'/etc/aliases.db':
content => template('blueprint_test/etc/aliases.db'),
ensure => file,
group => root,
mode => 0644,
owner => root;
# 其他文件...
}
}
}
4.3 更多信息
Blueprint 会捕获系统的完整状态,但生成的配置可能比实际需要的大。例如,它会捕获所有包及其依赖项,并锁定当前安装的版本。此外,Blueprint 会将
/etc
目录中的所有文件作为资源添加到清单中,即使这些文件未发生更改。因此,虽然 Blueprint 可帮助熟悉 Puppet 语法,但不建议盲目使用。
5. 使用外部节点分类器
5.1 准备工作
创建
enc
类,步骤如下:
1. 创建目录:
t@mylaptop ~/puppet $ mkdir -p modules/enc/manifests
-
创建
modules/enc/manifests/init.pp文件,内容如下:
class enc {
notify {"We defined this from $enc": }
}
5.2 操作步骤
构建简单外部节点分类器的步骤如下(在 Puppet 主服务器上执行,若为无主模式则在节点上执行):
1. 创建
/etc/puppet/cookbook.sh
文件,内容如下:
#!/bin/bash
cat <<EOF
---
classes:
enc:
parameters:
enc: $0
EOF
- 使文件可执行:
root@puppet:/etc/puppet# chmod a+x cookbook.sh
-
修改
/etc/puppet/puppet.conf文件:
[main]
node_terminus = exec
external_nodes = /etc/puppet/cookbook.sh
- 重启 Apache 使更改生效。
-
确保
site.pp文件中默认节点定义为空:
node default {}
- 运行 Puppet:
[root@cookbook ~]# puppet agent -t
Info: Caching catalog for cookbook.example.com
Info: Applying configuration version '1416376937'
Notice: We defined this from /etc/puppet/cookbook.sh
Notice: /Stage[main]/Enc/Notify[We defined this from /etc/puppet/cookbook.sh]/message: defined 'message' as 'We defined this from /etc/puppet/cookbook.sh'
Notice: Finished catalog run in 0.17 seconds
5.3 工作原理
当在
puppet.conf
中设置 ENC 时,Puppet 会将节点的 FQDN 作为第一个命令行参数调用指定的程序。在示例脚本中,该参数被忽略,脚本仅输出固定的类列表。
5.4 更多信息
ENC 可以提供一系列要包含在节点中的类,格式如下:
---
classes:
CLASS1:
CLASS2:
CLASS3:
对于带参数的类,可使用以下格式:
---
classes:
mysql:
package: percona-server-server-5.5
socket: /var/run/mysqld/mysqld.sock
port: 3306
还可以使用以下格式生成顶级作用域变量:
---
parameters:
message: 'Anyone home MyFly?'
这些变量可在清单中使用
$::message
语法引用。
5.5 流程图
graph LR
A[开始] --> B[创建 enc 类]
B --> C[创建 cookbook.sh 文件]
C --> D[使文件可执行]
D --> E[修改 puppet.conf 文件]
E --> F[重启 Apache]
F --> G[确保 site.pp 文件默认节点定义为空]
G --> H[运行 Puppet]
H --> I[结束]
5.6 总结
本文介绍了 Puppet 中添加外部事实、将事实设置为环境变量、使用
puppet resource
命令生成清单、使用 Blueprint 工具生成清单以及使用外部节点分类器的方法和操作步骤。通过这些方法,可以更灵活地管理和配置系统。在实际使用中,应根据具体需求选择合适的方法,并注意避免一些潜在的问题,如 Blueprint 生成配置过大等。
6. 各方法对比总结
6.1 方法对比表格
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 添加外部事实 | 需要自定义系统事实信息 | 可灵活定义事实,覆盖默认事实 | 调试时可能遇到解析问题,脚本运行可能影响性能 |
| 将事实设置为环境变量 | 临时或动态设置事实 | 操作简单,可快速修改事实值 | 仅在当前环境有效,不持久 |
| 使用 Puppet resource 命令生成清单 | 快速获取系统现有资源配置 | 能准确反映系统当前状态 | 对于不可枚举资源无法列出所有实例 |
| 使用 Blueprint 工具生成清单 | 快速捕获系统完整配置 | 自动生成配置,帮助熟悉 Puppet 语法 | 生成配置过大,包含不必要信息 |
| 使用外部节点分类器 | 灵活分配节点类和参数 | 可根据不同规则分配类和参数 | 脚本编写和维护较复杂 |
6.2 决策流程图
graph LR
A[需求场景] --> B{是否需要自定义事实}
B -- 是 --> C{是否需要持久自定义}
C -- 是 --> D[添加外部事实]
C -- 否 --> E[将事实设置为环境变量]
B -- 否 --> F{是否需要获取现有配置清单}
F -- 是 --> G{是否需要完整配置}
G -- 是 --> H[使用 Blueprint 工具生成清单]
G -- 否 --> I[使用 Puppet resource 命令生成清单]
F -- 否 --> J{是否需要灵活分配节点类和参数}
J -- 是 --> K[使用外部节点分类器]
J -- 否 --> L[其他方法]
7. 实际应用案例
7.1 服务器配置管理案例
某公司有多个服务器节点,需要对不同类型的服务器进行不同的配置管理。
-
Web 服务器
:使用外部节点分类器,为 Web 服务器节点分配
apache
类,确保安装和运行 Apache 服务。
---
classes:
apache:
parameters:
apache_port: 80
- 数据库服务器 :通过添加外部事实,记录数据库服务器的型号和版本信息,在 Puppet 清单中根据这些信息进行针对性配置。
# /etc/facter/facts.d/db_info.txt
db_model=MySQL
db_version=8.0
if $::db_model == 'MySQL' and $::db_version == '8.0' {
# 配置 MySQL 8.0 相关参数
}
7.2 开发环境快速搭建案例
开发团队需要快速搭建开发环境,使用
puppet resource
命令生成现有开发服务器的配置清单,然后在新的开发节点上应用这些清单,快速复制开发环境。
# 生成用户配置清单
puppet resource user developer
# 生成服务配置清单
puppet resource service docker
8. 注意事项与最佳实践
8.1 注意事项
- 外部事实 :确保 Facter 版本符合要求,避免使用预定义事实名称,注意脚本性能问题。
- 环境变量事实 :环境变量的作用范围和生命周期,避免影响其他系统操作。
- Puppet resource 命令 :对于不可枚举资源,明确指定资源实例。
- Blueprint 工具 :手动清理不必要的配置信息,避免生成过大的配置文件。
- 外部节点分类器 :确保脚本的正确性和安全性,避免错误分配类和参数。
8.2 最佳实践
- 定期清理 :定期清理不再使用的外部事实文件和环境变量,保持系统整洁。
- 脚本优化 :优化外部事实脚本和外部节点分类器脚本,提高执行效率。
- 备份配置 :在使用各种工具生成配置清单后,及时备份,防止数据丢失。
- 测试验证 :在生产环境应用新的配置前,先在测试环境进行验证。
9. 未来趋势与拓展
9.1 自动化与智能化趋势
随着技术的发展,Puppet 相关工具可能会更加自动化和智能化。例如,外部节点分类器可能会结合机器学习算法,根据节点的历史数据和性能指标自动分配类和参数,减少人工干预。
9.2 与其他工具集成
Puppet 可能会与更多的 DevOps 工具集成,如 Jenkins、GitLab 等,实现更高效的持续集成和持续部署流程。例如,在 Jenkins 构建过程中自动调用 Puppet 进行环境配置和部署。
9.3 拓展应用场景
除了服务器配置管理,Puppet 可能会在更多领域得到应用,如物联网设备管理、云计算资源配置等。例如,通过 Puppet 管理大量物联网设备的软件版本和配置信息。
10. 总结回顾
10.1 关键内容回顾
本文详细介绍了 Puppet 中多种实用方法,包括添加外部事实、将事实设置为环境变量、使用
puppet resource
命令生成清单、使用 Blueprint 工具生成清单以及使用外部节点分类器。通过实际操作步骤和示例代码,展示了这些方法的具体应用。
10.2 应用建议
在实际应用中,应根据具体需求和场景选择合适的方法。对于简单的临时配置,可使用环境变量事实;对于复杂的系统管理,可结合外部事实和外部节点分类器。同时,要注意各方法的优缺点和注意事项,避免出现问题。
10.3 展望未来
随着技术的不断发展,Puppet 及其相关工具将不断完善和拓展应用场景。我们应持续关注这些变化,不断学习和掌握新的技术,以更好地应对系统管理和配置的挑战。
超级会员免费看
25

被折叠的 条评论
为什么被折叠?



