原先介绍了chef,现在需要面对一个实际的问题:如何用chef管理少量的服务器。
我希望:
- 能够对几台或者十几台服务器进行配置管理。
- 针对每台服务器,写yml格式的配置文件,执行一个命令之后,就可以配置好这台服务器,同时源码管控这个yml文件的变更。
- 支持复杂的服务器配置,包括启动项目管理,自动告警,日志归总等。
- 不需要管理服务器,比如chef-server这样的东西,只需要留有本地的配置文件。
我采用的解决方案:
- 用littlechef,这个项目可以把chef-solo,一个本地跑chef的方法,部署到远端服务器上面去,同时拷贝本地的recipe和配置文件到远端,执行需要的操作。
- 写recipe,让部署能够通过写node配置文件进行配置,比如启动服务,日志归总,服务器管理员用户,自动重启更新等。
- 用yml格式撰写node配置文件,以及datatag配置文件,然后用自动化脚本转换成json格式。手动写json太反人类了。
- 远端的脚本用ruby写,脚本里面的参数不是用erb渲染出来的,而是把配置序列化成yml,ruby脚本再读取它们。这样远端服务器上面的执行代码是规整的,人可以阅读。
都弄好之后,可以写这样的服务器配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
chef部署之后,会创建目录/etc/base-system
,里面存放各种配置和执行脚本,同时安装到crontab,/etc/rc.local等各种地方。
服务器的关键操作,比如重启,安全更新结果,都会通过notify功能汇报到slack上面。
我可以通过node配置文件,清晰看到每台服务器是如何配置的。并且这个系统可以演化,更换一种配置方式,只需要重新跑一下部署。
不过还是有一些难办的问题:
- littlechef项目成熟度不高,使用起来不是很舒服。
- 架构复杂:chef已经很复杂了,远端还要部署一个ruby环境,架构复杂带来调试和理解上面的难度。
- 学习成本高:维护者需要弄懂chef,远端编织起来的ruby框架,之后才能配置服务器,最后可能只是需要加上一个小东西。
- 维护成本:又多了一个项目了。