作为程序员,我却有好几年的时间都要替公司管理服务器,所以对各种运维技术都研究了一番。2010年的时候,调研了 Puppet、Chef 等工具,当时就觉得不适用。 后来随着 Devops 概念越演越烈,Puppet名气变到:
不puppet,无devops |
吓的我每隔几个月就要去翻Puppet的文档,害怕错过了大时代,但是每次的结论都和当初一样:Puppet不好用。
服务器软件安装界最大的痛点是:
各种依赖包凌乱复杂,下载安装都非常困难 |
人们为了解决这个痛点,开发了一系列软件:
- Redhat/centos的yum
- ubuntu/debian的apt-get
- 甚至编程软件也来插一脚:java的maven,python的pip,ruby的gem 等等
这些工具都很好用,基本上解决了问题。
而Puppet并不解决这个痛点,它是建立在软件管理程序之上的,就是说 在Redhat上跑Puppet,它用up2date更新软件,在Ubuntu上跑Puppet,它用apt-get下载软件。
Puppet是什么?
在我看来,Puppet有两大功能:
- 一种方言,用来格式化写作软件安装脚本;
- 服务器集群操作工具 ,你可以在一台机器上指挥N台服务器运行/下载/安装。
第1点,Puppet的写作语法相当复杂,对比 Markdown之于文本写作来说,puppet的语法称得上謷牙诘屈,需要花大量时间学习,而且难于记忆。
安装一个软件,用shell命令写的安装脚本可能只有50行,puppet要写200-300行,还非常不直观,难以看懂。
因为软件安装的最大痛点已经被软件安装器解决了,puppet能做的很少,你随便找一个现成的puppet mannifests看看,你会觉得它相当无聊。
幸亏,有好心人 Example(42) 提供了一堆已经写好的puppet manifesthttps://github.com/example42/puppet-modules,我觉得puppet大半的价值都在这里。
第2点,对于普通人来说,能够像木马一样批量操作多台服务器,太酷了! 但是对于SA,这是日常工作。
最通常的做法,是先找一台服务器做登陆机,然后把它和其它所有服务器用ssh keygen打通登录。 sshd安装包自带一个ssh-copy-id脚本,执行,输入一次密码就可以打通。
在登录机上装一个web server,把各种软件/包/安装目录 放在web server的http document目下,要用的时候wget -O就可以。
要把一个软件部署在多台服务器上,写一段 for ip in ip_lists :ssh ip -e "" 这样的shell就可以了。
如果用python写批量安装脚本,可以直接使用pssh、Fabric 等包,它们都需要 提前打通服务器之间的ssh keygen 登录。
用ssh keygen打穿服务器,可能会有安全隐患,那台登录机太要命了。但是不打穿,用直接登录的方式,那么系统管理员的电脑就是成了火药库,所以风险不在这里。
结论
Puppet逃避了软件安装的最大痛点,能做的事情很少,学习曲线还这样陡峭,鸡肋都算不上。