我如何迁移现有的 puppet 客户端以指向新的 puppetmaster 服务器?我不想手动转到每个客户端并生成新证书。
当我们尝试将 /etc/puppet 和 /var/lib/puppet 中的所有文件 rsync 到新服务器时,我们收到了证书错误
/etc/init.d/puppetmaster start
* Starting puppet master
Could not run: Retrieved certificate does not match private key; please remove certificate from server and regenerate it with the current key
我可以通过将/var/lib/ssl/certs
和/var/lib/ssl/private_key
文件从old_hostname
复制到来解决这个问题new_hostname
,这基本上就是
将 Puppet 客户端迁移到新的 Puppet Master(旧的 Puppet Master 服务器已经不存在了,只使用备份)
不幸的是,我的客户仍然知道有些不对劲,并给了我以下错误:
sudo puppetd --test --server newservername.example.net --noop
info: Retrieving plugin
err: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate': hostname was not match with the server certificate
err: /File[/var/lib/puppet/lib]: Could not evaluate: hostname was not match with the server certificate Could not retrieve file metadata for puppet://newservername.example.net/plugins: hostname was not match with the server certificate
err: Could not retrieve catalog from remote server: hostname was not match with the server certificate
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
所以我猜测客户端证书仍然知道与它们关联的主机名,并且不愿意切换。
有没有办法使用 puppet(指向旧的 puppetmaster)来部署新的证书,或者以某种方式自动化签名过程?
总结:提出了两种解决方案:1) 在主服务器上启用autosign
,从而完全跳过认证,或 2) 将旧 CNAME 设置为指向新主服务器,因为证书绑定到主服务器的主机名。我选择了 #2,因为自动签名感觉就像关闭了安全性(尽管时间有限)。
答案1
您是否希望让两个傀儡大师暂时保持正常运行,然后一点一点地迁移客户端?
如果是这样,您就不得不接触每个客户端系统,不管是指向新的主服务器,还是添加 hosts 文件条目,或诸如此类。如果是这种情况,那么您不妨启动新的主服务器并重新签名每个客户端(这比通过 hosts 文件黑客来解决验证问题要好)。
如果没有(如果您打算关闭旧服务器并立即切换所有内容),那么只需将旧服务器的主机名转移到新服务器上;如果客户端使用旧名称(证书上的名称)连接到新服务器,则证书将被识别为有效。
答案2
您可以简单地使用$ssldir
旧的 puppetmaster,然后在新的 puppetmaster 中使用它。
除此之外,还应该可以部署一个脚本来执行以下操作:
- (与客户端脚本无关:可能在新的 Puppet 服务器上激活自动签名)
- 稍后再跑
- 停止 Puppet 客户端
- 清理客户端 ssldir
- 修改客户端上的 puppet.conf 以指向新服务器
- 创建一个锁定文件以确保它不会导致无限的重新配置循环
- 重新启动 Puppet
丑陋,但只要进行迁移模块仅在旧服务器上,并且确保没有迁移模块仅在新服务器上,这是一次性的事情,应该会发挥神奇的作用……