安装Puppet

Jul 16, 2011

    近些年来出现了很多热词,其中有一个就是Infrastructure As Code,基本的想法是相比原来系统管理员手工运行什么ssh或者命令来管理和搭建不同的机子或者平台, 能否使用一种更加抽象级别的语言来描述这个过程, 将系统底层的东西隔离开来, 使他们能脱离出系统底层各种细节,更多关注自己想到做得事情.     所以就出现这样一些工具: puppet, chef等等. 上周胡凯要我尝试给ThoughtWorks西安也搭建这样的一个平台,我觉得这个东西还蛮有意思的,尝试了下puppet,中间还是遇到了不少问题,不过最终都有调试通过.这篇文章将会简要的介绍怎么安装puppet和中间可能遇到的问题和解决办法.     我的环境是puppet agent使用的是Ubuntu虚拟机(这样比较稳妥), 同时puppet master也用的是Ubuntu.     第一步:安装. 在server上首先你的装上ruby, 然后安装puppet.  在Ubuntu上最简单的安装方式是apt拉, 你可以运行"sudo apt-get install puppet puppetmaster facter", 如果你现在运行puppet -V查看版本的话, 却发现它的版本是"0.25.0",然而主流的版本是"2.6.8".解决办法是:     修改你的/etc/apt/sources.list 加入 运行aptitude update (是为了装上最新版本的puppet master 2.6.8, 如果你不修改这一行你装的就是0.25这个版本, 问题很多).
 
deb http://backports.debian.org/debian-backports lenny-backports main contrib non-free
aptitude update
aptitude show puppet
    这下你运行puppet -V应该可以看到你的版本已经是最近的版本.     默认这个puppet会安装到/etc/puppet下面.这个时候你需要产生一个puppet.conf文件,木有这个文件,puppet master是启动不了的.你可以使用"puppet master --genconfig > puppet.conf" 来产生这个配置文件. 然后你可以尝试启动puppet master,用如下命令"puppet master --debug --no-daemonize" 你应该可以看到"notice: Starting Puppet master version 2.6.8" --verbose表示的是这个日志输出的详细程度, --no-daemonize表示这个线程将不会转入后台, 你可以在console当中看到日志的输出. 如果出现Could not run: Could not create PID file: /var/lib/puppet/run/master.pid, 就意味着很有可能你上次使用了daemonize的方式启动的, 所以现在这个进程还在后台, 你可以ps -ax | grep puppet ,然后杀死这个进程,在输入命令试试. 紧接着就是puppet agent了,也就是要配置客户端了.具体过程可以参考下面链接:Installation Guide. 安装完成之后可以运行: puppet agent --server=puppet --no-daemonize --verbose那这个--server指的就是puppet master所在主机的地址.极力推荐使用域名而非简单的IP地址. 你也可以在/etc/hosts中加入如下映射:
 
10.29.2.50      puppet
然后在你的puppet master上配置:(这里的10.29.2.5也就是clark-laptop的ip) Ok,搞定.     运行puppet agent --server=puppet --no-daemonize --verbose, 就开始了puppet agent和puppet master之间的ssl过程, 这个过程是可能出现问题较多的地方.这个时候puppet agent会想server端发出确认certification的请求,所以在server端你可以运行" puppet cert --list" 来查看有多少agent的认证请求, 比如这里就有如下输出:
 
clarht-laptop
上面代表的是agent所在主机的域名了,那这个域名是在puppet master主机上/etc/hosts中根据请求过来的agent的ip而对应找到的域名. 然后puppet cert --sign clarht-laptop就可以确认认证了,握手完成. 如果这个过程中,你有碰到" err: Could not request certificate: Retrieved certificate does not match private key; please remove certificate from server and regenerate it with the current key" 这个时候表示你可能将hostname, ip, domain之间的设置给搞错了. 首先确保你的puppet server的映射木有出错.在你的puppet master所在的机子上, 运行"less /ect/resolv.conf" 查看到你的domain name.     然后在你的/etc/hosts中加入
 
10.29.2.50 puppet.corporate.thoughtworks.com puppet
也就是按照"ip <hostname>.<domain name> <hostname>"的方式. 对于agent的配置比较麻烦一点, 首先上到puppet agent所在机子上,命令行中调用"hostname", 获取到agent所在主机的hostname,比如我这里就是"clark-laptop", 同时less /etc/resolv.conf 查看agent所在主机的domain name. 这个domain name在这里刚好也是"corporate.thoughtworks.com",但是它不一定跟puppet master上的domain name就是相同的.然后记下agent的ip地址10.29.2.5. 最后返回到puppet master所在主机上,修改/etc/hosts文件,加入如下映射:
 
  . 
也就是10.29.2.5   clark-laptop.corporate.thoughtworks.com clark-laptop.     由于上面的配置不正确而引出的问题, 在google下还真是每个人都有各自的说法, 试了不少方案, 也算是这个搞清楚了这个流程是怎么回事,希望这个能帮助到刚开始玩puppet的朋友.这样一来ssl握手也解决了, 你可以尝试写一两个catalog让agent请求下来玩玩, 比如安装openssh-server, git , mysql数据库. 另外其实puppet都有一些现有的公共的module,可以避免重新发明轮子, 可以参考http://forge.puppetlabs.com/

Have fun~

    接下来应该会尝试下chef, 因为它的语言是使用ruby的, 相对puppet使用自己的DSL, 上手速度应该蛮快的.另外如何使用Chef和Vagrant来测试,应该很有意思.