Puppet 是什么?

技术层面:Puppet 是什么?

简单来说,Puppet 是一款自动化的集中配置管理系统

如果把服务器管理比作带兵打仗,Puppet 就是那个**“总指挥官”**。我们不需要亲自跑到每一个士兵(服务器)面前去教他怎么站军姿、怎么拿枪,你只需要坐在指挥部(Master 节点)写好“军规”(代码),士兵们就会自动按照军规来要求自己。

核心概念:

  • 它解决了什么问题?

在没有 Puppet 之前,如果我们有 100 台服务器要安装 Nginx,可能需要写个 Shell 脚本,然后用 for 循环一台台去 SSH 登录执行。这种方式很累,而且容易出错(比如某台机器脚本跑了一半报错了可能还不知道)。

Puppet 只需要写一次配置(site.pp),然后所有机器都会自动变成我们想要的样子。

  • 它的工作模式:拉模式 (Pull)

Puppet 采用的是**客户端/服务端(C/S)**架构。

    • Master:是发号施令的中心,存储着配置代码。
    • Agent:是干活的苦力。它们每隔一段时间(默认 30 分钟)会主动去问 Master:“老大,我有啥新任务吗?”
    • 所以,我们只需要在 Master 上改好代码,Agent 到了时间点自然会来“拉取”并执行。
  • 它的核心魔法:幂等性

这是 Puppet 最厉害的地方。我们在 site.pp 里写的是**“期望状态”**(比如:确保 /tmp/hello.txt 存在)。

    • 当我们运行 puppet agent -t 时,Agent 会先检查:文件存在吗?
    • 如果存在:它什么都不做(省事)。
    • 如果不存在:它才去创建(干活)。
    • 如果被删了:下次运行时,它发现没了,又会自动补上(自愈)。

这保证了无论运行多少次,系统的状态永远和你写的一致,不会像 Shell 脚本那样重复执行导致报错。


语言层面:Puppet 的原意

跳出技术圈,Puppet 这个英语单词的本意是:

  • 木偶、傀儡:指那种用线提着的、或者戴在手上的玩偶(比如《木偶奇遇记》)。
  • 引申义:指受他人操纵的人或组织(比如“傀儡政府”)。

为什么软件叫这个名字?

让系统管理员像操纵木偶一样,轻松地控制成百上千台服务器,让它们乖乖听话,按照既定的剧本(代码)行动。

好的,了解清楚什么是Puppet后,我们可以在服务器上搭建 Puppet 的 Master-Agent 架构。

📋 环境规划

角色

主机名

IP地址

Puppet Master

dsg58

192.168.1.58

Puppet Agent

dsg59

192.168.1.59

Puppet Agent

dsg60

192.168.1.60

Puppet Agent

dsg61

192.168.1.61


🚀 开始部署

在所有四台服务器上执行 第一步第二步 的操作。

第一步:基础环境准备

  1. 配置主机名和 hosts 解析

所有节点必须能通过主机名互相访问。

    • 在 Master 节点 (dsg58) 上执行:
hostnamectl set-hostname dsg58
cat >> /etc/hosts <<EOF
192.168.1.58 dsg58
192.168.1.59 dsg59
192.168.1.60 dsg60
192.168.1.61 dsg61
EOF
    • 在 Agent 节点 (dsg59, dsg60, dsg61) 上分别执行:

(以 dsg59 为例)

hostnamectl set-hostname dsg59
cat >> /etc/hosts <<EOF
192.168.1.58 dsg58
192.168.1.59 dsg59
192.168.1.60 dsg60
192.168.1.61 dsg61
EOF
  1. 关闭防火墙和 SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  1. 同步时间

Puppet 依赖 SSL 证书进行通信,时间不同步会导致证书验证失败。

yum install -y ntpdate
ntpdate ntp.aliyun.com
  1. 安装 Puppet 官方源
rpm -Uvh https://yum.puppet.com/puppet-release-el-7.noarch.rpm

第二步:安装 Puppet 软件

  • 在 Master 节点 (dsg58) 上安装 Puppet Server:
yum install -y puppetserver
注意:Puppet Server 默认需要 2GB 内存。如果你的服务器内存较小,可能会导致启动失败。可以编辑 /etc/sysconfig/puppetserver 文件,将 JAVA_ARGS 参数调整为 -Xms512m -Xmx512m
  • 在所有 Agent 节点 (dsg59, dsg60, dsg61) 上安装 Puppet Agent:
yum install -y puppet-agent

第三步:配置 Puppet Master

  1. 编辑 Master 配置文件

在 Master 节点 (dsg58) 上,编辑 /etc/puppetlabs/puppet/puppet.conf 文件,确保 [master] 部分配置如下:

[master]
certname = dsg58
server = dsg58

certname 是 Master 的证书名称,server 指定了 Master 自己的主机名。

  1. 启动 Puppet Server 服务
systemctl start puppetserver
systemctl enable puppetserver

第四步:配置 Puppet Agent

  1. 编辑 Agent 配置文件

在所有 Agent 节点 (dsg59, dsg60, dsg61) 上,编辑 /etc/puppetlabs/puppet/puppet.conf 文件,确保 [agent] 部分配置如下:

[agent]
server = dsg58
runinterval = 15m

server 指向 Master 的主机名,runinterval 定义了 Agent 每隔多久(此处为15分钟)主动向 Master 拉取一次配置。

  1. 启动 Puppet Agent 服务
systemctl start puppet
systemctl enable puppet

第五步:设置环境变量

方法一:使用软链接(推荐,最简单)

创建一个链接,把 Puppet 的命令链接到系统默认的搜索路径 /usr/bin 中:

# (dsg58)执行
ln -s /opt/puppetlabs/bin/puppetserver /usr/bin/puppetserver
# (dsg59, dsg60, dsg61) 执行
ln -s /opt/puppetlabs/bin/puppet /usr/bin/puppet
方法二:配置环境变量(推荐,标准做法)

将 Puppet 的路径永久加入到环境变量中。

  1. 编辑环境配置文件:
echo 'export PATH=/opt/puppetlabs/bin:$PATH' >> /etc/profile
  1. 刷新环境变量(或者直接重新登录 SSH):
source /etc/profile

第六步:证书签名认证

Puppet 使用 SSL 证书来保证 Master 和 Agent 之间通信的安全性。

  1. 在 Agent 节点上触发证书请求

每一个 Agent 节点 (dsg59, dsg60, dsg61) 上执行一次:

puppet agent -t

这个命令会立即尝试连接 Master 并提交一个证书签名请求。

  1. 在 Master 节点上签署证书

回到 Master 节点 (dsg58),执行以下命令:

# 查看所有待签名的证书请求
puppetserver ca list

# 签署所有待签名的证书
puppetserver ca sign --all


第七步:创建配置清单并测试

创建一个简单的配置,让所有 Agent 节点都创建一个名为 /tmp/hello_puppet.txt 的文件。

在 Master 节点 (dsg58) 上创建配置清单目录和文件:
Puppet 官方推荐的默认标准路径:/etc/puppetlabs/code/environments/production/manifests
Puppet Master 默认的入口文件名:site.pp,也是约定俗成。这个 site.pp 就是 Puppet 的配置清单(Manifest),它用声明式语言描述了系统应该达到的“理想状态”。
mkdir -p /etc/puppetlabs/code/environments/production/manifests
cat > /etc/puppetlabs/code/environments/production/manifests/site.pp <<'EOF'
# 定义一个文件资源
file { '/tmp/hello_puppet.txt':
  ensure  => file,
  content => "Hello from Puppet Master (dsg58)!\n",
  mode    => '0644',
}
EOF

只要site.pp文件保存了,不需要在 Master 上执行任何“运行”命令,Agent 就会自动来“拉取”并执行。

在 Agent 节点上进行测试

任意一个 Agent 节点上再次执行:

puppet agent -t

就可以看到输出信息了,表明 Agent 从 Master 获取了配置并应用了它。

验证结果

登录到任意 Agent 节点,检查文件是否创建成功:

cat /tmp/hello_puppet.txt

如果成功显示了 "Hello from Puppet Master (dsg58)!",恭喜你,Puppet 环境已经成功搭建并开始工作了!

Puppet常用命令

客户端常用命令 (在 Agent 节点执行)

命令

说明

常用场景

puppet agent -t

最常用-t--test 的缩写。

强制 Agent 立即去 Master 拉取配置并执行,同时在屏幕打印详细日志。

puppet agent -t --noop

模拟运行noop = No Operation。

强烈推荐。在正式生效前,先看看 Puppet 打算做什么(比如它会告诉你它会删除哪个文件),但不会真的执行修改。

puppet agent --disable

暂停 Agent。

维护期间使用。执行后,Agent 会停止自动运行,防止在修机器时它又改回去。

puppet agent --enable

恢复 Agent。

维护结束后使用,恢复正常自动同步。

systemctl status puppet

查看服务状态。

检查 Agent 服务是否在后台正常运行。

服务端常用命令 (在 Master 节点执行)

主要用于管理证书和查看报告。

命令

说明

常用场景

puppetserver ca list

列出证书请求。

查看有哪些新加入的 Agent 在排队等待签名。

puppetserver ca sign --all

签署所有证书。

一次性允许所有新节点接入(测试环境常用)。

puppetserver ca sign --certname <节点名>

签署指定证书。

生产环境常用,只允许特定的节点接入。

puppetserver ca clean --certname <节点名>

清除证书。

如果某台机器重装了系统,证书对不上了,需要在 Master 上清除旧证书,以便重新签名。

调试与查询命令 (通用)

当写配置文件(Manifests)遇到问题时,用这些命令排查。

命令

说明

常用场景

puppet parser validate <文件名>.pp

语法检查。

在应用配置前,检查我们的 .pp 文件语法有没有写错(比如漏了括号)。

puppet resource <类型> <名称>

查看资源状态。

比如输入 puppet resource user root,它会告诉我们 root 用户当前的详细配置信息。

puppet describe <类型>

查看帮助文档。

忘了某个资源(如 filepackage)有哪些参数可以用时,用这个查。

facter

查看系统信息。

这是一个随 Puppet 安装的独立工具,可以查看当前机器的 IP、操作系统版本、内存大小等“事实”信息。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐