Puppet 配置参数详解
系统梳理 Puppet 配置体系——puppet.conf 配置节、site.pp 清单、Hiera 查找、roles/profiles 分层及 file/package/service/user/exec/cron 资源类型参数,并给出生产配置模板,默认值基于 Puppet 8 实测
Puppet 配置参数详解
目标:系统梳理 Puppet 的配置体系——puppet.conf 配置节、site.pp 清单、Hiera 数据查找、roles/profiles 分层,以及 file/package/service/user/exec/cron 常用资源类型的参数,并给出生产配置模板。所有命令均已实测,默认值以 Puppet 8 真实输出为准。
一、环境信息
- Puppet Server 8.7.0 / Puppet Agent 8.10.0(Puppet 8 系,facter 4.10.0)
- 主配置文件:
/etc/puppetlabs/puppet/puppet.conf - 环境目录:
/etc/puppetlabs/code/environments/production/ - 主清单:
/etc/puppetlabs/code/environments/production/manifests/site.pp - Hiera 配置:
/etc/puppetlabs/puppet/hiera.yaml - Server 数据:
/opt/puppetlabs/server/data/puppetserver
二、前置条件
- 已按《Ubuntu 22.04 安装 Puppet 指南》部署 Server 与 Agent
- Server/Agent 证书已签发互通
三、参数查看与修改方式
查看当前生效配置(Agent 侧):
export PATH=$PATH:/opt/puppetlabs/bin
puppet config print certname server environment
# certname = puppet-agent
# environment = production
# server = puppet-server
修改配置:
puppet config set server puppet-server # 写入 [main]
puppet config set certname puppet-agent # 写入 [main]
puppet config 写入的即 /etc/puppetlabs/puppet/puppet.conf。
四、参数总览
| 分类 | 配置项 | 实测默认/推荐 | 说明 |
|---|---|---|---|
| 连接 | server | puppet-server | Server 地址(Agent 侧) |
| 身份 | certname | 主机名 | 证书与节点匹配名 |
| 环境 | environment | production | 当前目录环境 |
| 环境目录 | environmentpath | /etc/puppetlabs/code/environments | 环境根目录 |
| 认证 | autosign | 无 | autosign 配置文件路径 |
| 运行模式 | noop | false | 空跑不生效 |
| 运行间隔 | runinterval | 1800 | Agent 守护运行间隔(秒) |
| 证书目录 | ssldir | /etc/puppetlabs/puppet/ssl | SSL/证书存放目录 |
| 数据/日志 | vardir/logdir | /opt/puppetlabs/puppet/cache 等 | 运行时数据与日志 |
五、puppet.conf 配置节详解
5.1 配置节类型
puppet.conf 按 [节名] 分组,常用节有:
| 配置节 | 作用 |
|---|---|
[main] | 全局默认,所有命令都会读取 |
[server](或 [master]) | Server 端专用 |
[agent] | Agent 端专用 |
[apply] | puppet apply 专用 |
5.2 实测示例
Server 端 puppet.conf(配置 server/certname 与 Server 目录):
[main]
server = puppet-server
certname = puppet-server
[server]
vardir = /opt/puppetlabs/server/data/puppetserver
logdir = /var/log/puppetlabs/puppetserver
rundir = /var/run/puppetlabs/puppetserver
codedir = /etc/puppetlabs/code
Agent 端 puppet.conf:
[main]
server = puppet-server
certname = puppet-agent
💡 说明:
codedir指向环境与清单目录(/etc/puppetlabs/code);environment未指定时默认production。
六、site.pp 主清单详解
6.1 结构与节点
site.pp 是每个环境的入口清单,用 node 节点块定义各主机应用资源:
node 'puppet-agent' {
package { 'nginx':
ensure => installed,
}
}
node default { }匹配未命中其他节点块的主机。- 一个
node块内可声明多个资源,彼此用依赖链(require/before/notify/subscribe)关联。
6.2 校验
export PATH=$PATH:/opt/puppetlabs/bin
puppet parser validate /etc/puppetlabs/code/environments/production/manifests/site.pp
# 无输出即语法正确
七、Hiera 数据查找详解
Hiera 用于把"配置数据"与"清单逻辑"分离。/etc/puppetlabs/puppet/hiera.yaml(Puppet 5 以上 version: 5)定义查找层级:
version: 5
defaults:
datadir: data
data_hash: yaml_data
hierarchy:
- name: "Per-node data (yaml version)"
path: "nodes/%{trusted.certname}.yaml"
- name: "Common data"
path: "common.yaml"
数据文件放在环境目录 data/ 下(common.yaml 全局、nodes/<主机名>.yaml 按节点覆盖):
data/common.yaml:
profile::web::port: 8080
profile::web::worker_processes: 2
data/nodes/puppet-agent.yaml:
profile::web::port: 9090
用 puppet lookup 查询:
export PATH=$PATH:/opt/puppetlabs/bin
puppet lookup profile::web::worker_processes --environment production
# --- 2
puppet lookup profile::web::port --environment production
# --- 8080
💡 说明:Hiera 按
hierarchy从上到下优先命中。若该主机名匹配不到nodes/*.yaml,则取common.yaml值(实测由于 Server 自身 certname 非puppet-agent,puppet lookup在 Server 上返回的是 common 的 8080,属正确的层级行为)。若需按节点查询,需在目标节点上报事实的上下文编译。
八、roles / profiles 分层详解
推荐用"角色-档案"两级封装,避免在 node 块里铺大量资源:
- profile(档案):把某类功能的资源组合成一个 class,直接声明资源与参数默认值。
- role(角色):把一个节点的多个 profile 聚合。
目录布局:
/etc/puppetlabs/code/environments/production/modules/
├── profile/manifests/web.pp # class profile::web
└── role/manifests/web_node.pp # class role::web_node
profile/manifests/web.pp:
class profile::web (
Integer $port = 8080,
) {
package { 'nginx': ensure => installed }
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
}
role/manifests/web_node.pp:
class role::web_node {
include profile::web
}
site.pp 收敛为角色引用:
node 'puppet-agent' {
include role::web_node
}
💡 说明:Hiera 的数据可回填 profile 参数(如
profile::web::port),配合include profile::web即在模块默认值基础上做参数覆盖。
九、常用资源类型参数详解
9.1 file(文件/目录)
| 参数 | 说明 | 实测示例 |
|---|---|---|
ensure | file/directory/present/absent | ensure => directory |
path/name | 标题即路径(path 可省略) | name => '/opt/web' |
content | 内容(优先于 source) | content => '<h1>Hi</h1>' |
owner/group | 属主/属组 | owner => 'root' |
mode | 权限,八进制字符串 | mode => '0755' |
require | 依赖其他资源 | require => File['/opt/web/'] |
实测:
puppet resource file /opt/web/index.html
# file { '/opt/web/index.html':
# ensure => 'file',
# content => '{sha256}b609bb64723a35e854a4ca50ab2801bb35863d98ad6e67fcc4058d1c4465557d',
# mode => '0644',
# owner => 0,
# provider => 'posix',
# type => 'file',
# }
9.2 package(软件包)
| 参数 | 说明 | 实测示例 |
|---|---|---|
ensure | installed/present/latest/absent | ensure => installed |
name | 包名 | name => 'nginx' |
provider | 包管理器(apt/yum/dnf) | 自动识别 |
实测(目录应用):
Notice: /Stage[main]/Main/Node[puppet-agent]/Package[nginx]/ensure: created
9.3 service(服务)
| 参数 | 说明 | 实测示例 |
|---|---|---|
ensure | running/stopped | ensure => running |
enable | 是否开机自启 | enable => true |
provider | systemd/init 等 | provider => 'systemd' |
require | 依赖(如安装了才有服务) | require => Package['nginx'] |
实测:
puppet resource service nginx
# service { 'nginx':
# ensure => 'running',
# enable => 'true',
# provider => 'systemd',
# }
9.4 user(用户)
| 参数 | 说明 | 实测示例 |
|---|---|---|
ensure | present/absent | ensure => present |
uid/gid | 用户/组 ID | uid => 3001, gid => 3001 |
shell/home | 登录 shell 与家目录 | shell => '/bin/bash', home => '/home/deploy' |
managehome | 是否创建家目录 | managehome => true |
require | 依赖先建组 | require => Group['deploy'] |
⚠️ 建用户前若指定
gid,需先用group资源建组,否则报useradd: group '3001' does not exist(实测遇到)。
实测资源展示:
puppet resource user deploy
# user { 'deploy':
# ensure => 'present',
# gid => 3001,
# home => '/home/deploy',
# shell => '/bin/bash',
# uid => 3001,
# provider => 'useradd',
# }
9.5 exec(命令执行)
| 参数 | 说明 | 实测示例 |
|---|---|---|
command | 要执行的命令 | command => '/bin/touch /opt/x' |
creates | 该文件已存在则跳过 | creates => '/opt/x' |
user/cwd | 执行用户与工作目录 | user => 'root' |
onlyif/unless | 条件执行 | unless => 'test -f /opt/x' |
9.6 cron(计划任务)
| 参数 | 说明 | 实测示例 |
|---|---|---|
command | 执行的命令 | command => '/bin/date >> /var/log/h.log' |
minute/hour/weekday | 调度字段 | minute => '0', hour => '2' |
user | 以哪个用户运行 | user => 'root' |
⚠️ 提示:Puppet 的 cron 资源依赖系统 cron provider。若目标主机未装 cron,会报
Could not find a suitable provider for cron(实测遇到)。先package { 'cron': ensure => installed }即可解决。
实测(装 cron 后):
puppet apply -e 'cron { "hello-daily": command => "/bin/date >> /var/log/hello.log", user => "root", minute => "0", hour => "2" }'
# Notice: /Stage[main]/Main/Cron[hello-daily]/ensure: created
# Notice: Applied catalog in 0.03 seconds
十、生产配置模板
适用业务场景:2–4GB 内存、SSD、数十台 Agent 节点的配置管理控制平面。
/etc/puppetlabs/puppet/puppet.conf:
[main]
server = puppet-server
certname = puppet-server
[server]
autosign = /etc/puppetlabs/puppet/autosign.conf
environment = production
/etc/default/puppetserver(JVM 内存,务必收敛大堆):
JAVA_ARGS="-Xms256m -Xmx512m -Djna.tmpdir=/opt/puppetlabs/server/data/puppetserver/jnatmp -Djruby.logger.class=com.puppetlabs.jruby_utils.jruby.Slf4jLogger"
autosign.conf:
*.example.com
💡 说明:生产建议开启 autosign 按域名白名单自动签发,减少人力;同时用 roles/profiles + Hiera 收敛清单,降低耦合。磁盘与内存充足时可将
-Xmx512m提到 1G,但仍不建议沿用包默认的 2G。
十一、常见问题
11.1 问题 1:puppet lookup 查不到 nodes/<主机名>.yaml 的覆盖值?
层级按 trusted.certname 匹配;在 Server 上手工 puppet lookup 用的是 Server 自身 certname,不会读到 Agent 的节点文件。请在目标 Agent 上下文编译或在该主机上执行 lookup。
11.2 问题 2:cron 资源报 Could not find a suitable provider for cron?
目标机未安装 cron。package { 'cron': ensure => installed } 后再应用。
11.3 问题 3:puppet parser validate 校验不通过?
多数是清单语法/缩进/引号问题。可用 puppet apply --noop 试编译并查看报错定位。
十二、参考链接
本文档由 www.quzuo.net 平台开发