你是不是遇到过这种情况?公司的服务器集群突然断网,或者要搬迁到新机房的过程中节点无法连外网,之前靠Puppet工具统一管理所有服务器配置,这下彻底用不了了——监控服务挂了、备份服务没启动,运维半夜被告警电话吵醒,还得挨个手动改配置,折腾一整夜。今天就聊怎么解决Puppet Agent离线场景的配置管理难题,让断网状态下的服务器也能自动应用统一配置。

一、应用场景与原方案痛点

1.1 哪些场景会碰到无网络情况?

有三类最常见的场景:第一是机房搬迁,服务器从旧机房迁移到新机房的过程中,为了不影响其他业务会临时断网,此时节点无法连公司的Puppet服务;第二是边缘节点,比如部署在偏远地区的物联网网关,只有本地网络,没有公网权限,没法连总部的Puppet Master;第三是隔离测试环境,公司的测试集群会被单独隔离,避免测试配置影响线上,这时候测试节点也会处于断网状态。

1.2 原方案为啥不好用?

正常情况下,Puppet Agent就像手机的应用商店客户端,每次打开会检查更新、拉取最新配置(比如要装什么软件、改哪个文件、启动什么服务),连上线的Puppet Master就能正常工作。但如果断网,Agent连不上Master,就会一直报错,要么不执行任何操作,要么沿用旧配置,直接导致集群配置混乱,出问题时排查难度陡增。

二、离线适配的具体实现步骤

2.1 核心思路:提前打包配置,离线节点直接用

Puppet有个实用的功能:可以在能联网的节点上,提前生成好要执行的配置包,不用每次都连Master,离线节点直接加载这个打包好的配置就行,就像提前下载好的电影,断网了也能正常观看。

2.2 单节点离线适配的完整示例

这里用Puppet 6.x版本的工具,步骤清晰,每个操作都有明确注释:

# 技术栈:Puppet 6.x 离线配置生成
# 第一步:在能联网的测试节点(需与离线节点的操作系统、Puppet版本完全一致)生成离线配置包
# 参数说明:
# --waitforcert 60 等待证书60秒,确保与Master完成信任验证
# --catalog-only 只生成配置包,不实际修改系统,避免影响在线节点
# --output 指定配置包的输出路径,方便后续传输
puppet agent --waitforcert 60 --test --catalog-only --output /tmp/puppet_offline_config.tar.gz

执行完成后,/tmp目录下会生成配置包,里面包含所有要执行的配置指令,比如安装Nginx、修改防火墙规则、启动备份服务等。 接下来把配置包传到离线节点,可以用U盘、内部离线文件服务器等,比如传到离线节点的/opt目录:

# 第二步:将配置包传输到目标离线服务器
# 若用U盘,直接复制粘贴即可;若用网络传输,可使用带密钥的scp保证安全
scp /tmp/puppet_offline_config.tar.gz root@192.168.1.100:/opt/

最后登录离线节点,加载并应用配置:

# 第三步:在离线节点执行配置
# 先模拟执行(--noop参数),仅检查配置是否合规,不实际修改系统,避免搞坏现有服务
puppet apply --noop /opt/puppet_offline_config/catalog.json
# 模拟无误后,正式执行,后台运行(--detach参数),不占用当前终端
puppet apply /opt/puppet_offline_config/catalog.json --detach

执行完成后,离线节点的服务和配置就和在线环境完全一致,无需连网即可正常工作。

2.3 批量适配多节点的配置示例

如果有几十上百台离线节点,手动传输配置太繁琐,可通过Puppet的批量配置能力实现自动化处理:

# 技术栈:Puppet 6.x 批量离线配置
# 前提准备:1. 把所有离线节点IP按行写入/opt/node_list.txt;2. 提前将生成好的配置包放到所有节点可访问的离线目录
# 批量执行脚本
for node in $(cat /opt/node_list.txt); do
    echo "========= 适配节点:$node ========="
    # 远程执行配置加载操作
    ssh root@$node "mkdir -p /opt/puppet_offline && tar -xzf /opt/puppet_offline_config.tar.gz -C /opt/puppet_offline && puppet apply /opt/puppet_offline/catalog.json --detach"
    # 输出执行状态
    if [ $? -eq 0 ]; then
        echo "✅ 节点$node 离线适配成功"
    else
        echo "❌ 节点$node 适配失败,请检查节点状态"
    fi
done

该脚本只需更新节点IP列表,即可自动批量完成所有离线节点的配置,大幅减少人工操作量。

三、离线适配的优缺点分析

3.1 优点

第一,完全不依赖网络,无论是断网机房还是偏远边缘节点,都能正常应用配置;第二,配置一致性有保障,所有节点用同一个配置包,不会出现部分节点配置错误的情况;第三,操作风险低,有模拟执行选项,即使新手操作也不会破坏现有服务;第四,支持批量处理,适合大规模集群的运维场景。

3.2 缺点

第一,环境要求高:生成配置包的节点和离线节点的操作系统、Puppet版本、硬件架构必须完全一致,否则配置可能不生效;第二,配置灵活性低:修改配置后需重新生成新的配置包,无法像在线模式那样动态调整;第三,安全风险:配置包可能包含数据库密码、密钥等敏感信息,传输时需做好加密防护。

四、关键注意事项

4.1 提前准备依赖包

配置包里如果要安装Nginx、MySQL等软件,需把对应的安装包提前下载好,和配置包一起传到离线节点,避免离线节点找不到依赖导致安装失败。比如用在线节点下载Nginx的rpm包,打包时一起加入配置包,离线节点解压后可直接安装。

4.2 务必先测试再执行

无论单节点还是多节点,一定要先用--noop参数模拟执行,确认配置没有报错、符合预期后,再正式执行,尤其生产环境绝对不能跳过测试步骤。

4.3 安全传输敏感信息

配置包里的密码、密钥等敏感数据,传输时不能用明文,可使用加密U盘、带密钥的scp,或者离线加密文件服务器,避免信息泄露。

五、总结

Puppet Agent离线适配方案,刚好解决了分布式集群、边缘节点在无网络环境下的配置管理难题,不用熬夜处理断网后的服务故障,也不用挨个手动修改配置。只要注意环境一致、提前测试、安全传输这些细节,就能快速完成离线节点的配置部署,保证整个集群的配置一致性,降低运维压力。