如何修复ifupdown2的Puppet安装问题,避免网络中断或确保安装后网络自动恢复?
如何修复ifupdown2的Puppet安装问题,避免网络中断或确保安装后网络自动恢复?
我太懂这个问题的痛苦了——安装ifupdown2直接把网络干断,Puppet直接失联,还得手动去控制台救机,简直烦死人。不过别担心,咱们可以照着思路把安装和重启网络的操作做成一个“脱离Puppet主进程”的独立任务,这样哪怕网络断了,重启操作也能继续跑。
核心思路
直接用Puppet的package资源肯定不行,因为安装完ifupdown2网络一断,Puppet就没法继续执行后续的资源了。咱们得把安装命令和重启网络的命令打包,用nohup让它在后台独立运行,哪怕Puppet和服务器的连接断了,这个脚本也能自己跑完重启网络的步骤。
具体的Puppet代码实现
把原来的package资源换成下面这个exec资源:
exec { 'install-ifupdown2-and-restart-networking': command => '/usr/bin/nohup /bin/sh -c "apt-get update && apt-get install -y ifupdown2 && systemctl restart networking" > /var/log/ifupdown2-install.log 2>&1 &', creates => '/usr/sbin/ifup', # 检查ifupdown2是否已安装,避免重复执行 path => ['/usr/bin', '/bin', '/usr/sbin', '/sbin'], timeout => 0, # 命令后台执行,不需要等待完成,禁用超时 }
代码细节解释
nohup和后台执行:nohup能让命令在后台持续运行,就算Puppet的SSH连接因为网络中断而断开,这个脚本也不会被终止,能顺利执行到重启网络的步骤。- 日志记录:把命令的输出和错误都写到
/var/log/ifupdown2-install.log里,方便之后排查安装过程中有没有问题。 creates参数:检查/usr/sbin/ifup文件是否存在(ifupdown2安装后会生成这个文件),如果已经存在,就不会重复执行这个命令,避免每次Puppet运行都折腾一遍。timeout => 0:因为我们不需要等这个命令执行完(毕竟网络会立刻断掉),所以设置超时为0,不让Puppet因为等待而报错。
后续说明
第一次运行这个Puppet配置的时候,后续的资源大概率会因为网络中断而失败一次,但没关系——当脚本自动重启网络后,下一次Puppet运行(不管是定时任务触发,还是你手动跑puppet agent -t)就能正常执行所有配置了,完全不需要手动去控制台操作。
如果你还是想保留package资源的语义,也可以试试用package配合notify,但这个方案风险更高:因为package安装完成后,Puppet需要发送信号触发后续的exec,但这时候网络已经断了,Puppet可能根本发不出这个信号,所以还是上面的exec封装方案更可靠。
备注:内容来源于stack exchange,提问作者Wildcard
相关产品推荐
相关产品推荐

