puppet练习
1.puppet工作流程图:

2.工作原理:
(1). 当Agent发起一个请求之后,Agent会把自己的主机名及facter信息(保存着系统的一些变量信息)(SSL)传给Master请求manifests目录下的*.pp入口脚本文件(注)。
(2). Master收到信息验证通过后再将Agent所需要的模块编绎生成Catalog数据返回给Agent。
(3). Agent收到Master返回在的Catalog数据然后再应用配置到自身系统,就实现了安装配置管理服务等等功能。
(4). 最后Agent应用过了配置之后再向Master 发送一个Report(当然这需要配置report才能生效,返回的文件格式是yaml),告诉Master当前执行的结果状态。
注:一般来说manifests目录位于/etc/puppet/manifests,默认入口文件为site.pp。
3.安装
采用2台机器进行测试。
- 准备工作:
Puppet 客户端使用 HTTPS 和服务端(master)通信,为了和服务器端通信必须有合法的 SSL 认证,第一次运行 puppet 客户端的时候会生成一个 SSL 证书并指定发给 Puppet 服务端。而在安装 Puppet 时会把主机名写入证书,所以在安装之前,先设置主机名。通过hostname获取主机名,若分别为master和client,然后修改/etc/hosts设置主机名。(注意hostname与/etc/hosts中主机名一致,否则会报错。)
# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6 10.10.3.201 master.localdomain master 10.10.3.202 client.localdomain client
在服务器端和客户端均设置如上。
由于puppet需要Ruby支持,所以在正式安装之前,先在这2台机器上安装ruby:
# yum install ruby ruby-libs
接着印证系统时间是否正确。如果不正确,需调整client端时间与master端同步。
接着安装puppet源:
# wget http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-1.noarch.rpm # yum install puppetlabs-release-6-1.noarch.rpm # yum update
- 在master端安装并启动puppet-server:
# yum install puppet-server # chkconfig puppet on # service puppetmaster start Starting puppetmaster: [ OK ] //关闭防火墙 # /etc/init.d/iptables stop iptables: Flushing firewall rules: [ OK ] iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Unloading modules: [ OK ]
- 在client端安装puppet:
# yum install puppet
注:如果master和client端puppet都已经安装,但是master端中/etc/hosts没有client端的信息,将导致master和client互相不能识别。在client端需做如下操作:
(1)client端安装puppet;
(2)client端修改puppet.conf,在末尾添加
server = master主机名
certname = client主机名
- 建立通信:
client端输入如下指令
# puppet agent --debug --server=master.localdomain
# ...
Info: Creating state file /var/lib/puppet/state/state.yaml
Debug: Stored state in 0.01 seconds
Notice: Finished catalog run in 0.05 seconds
Debug: report supports formats: b64_zlib_yaml pson raw yaml; using pson
master端输入如下指令察看
[root@master puppet]# puppet cert list -all
+ "master.localdomain" (SHA256) 30:3B:D0:A9:04:16:81:28:DB:74:A4:2A:DA:18:C8:7F:A3:2A:A1:15:17:2D:7B:E3:FE:3F:7C:68:AD:A5:36:BC (alt names: "DNS:master.localdomain", "DNS:puppet", "DNS:puppet.localdomain") + "client.localdomain" (SHA256) 32:28:9D:E8:BA:B2:FD:53:50:A0:CC:B2:FD:DE:5D:F0:F3:21:4D:56:5B:08:40:76:FB:F4:9D:8D:EE:10:7C:11
如果puppet版本不高,可能“client.localdomain”前面没有“+”,这需要在master端手动验证client发送的验证请求信息,即master端接受到客户端的证书后必须签字(sign)才能允许客户端接入。
# puppet cert --sign client.localdomain
再次使用puppet cert list察看时,如果前面多了一个 + 后,表示 “加入” 成功。
这步成功后,client端和master端建立起了通信。
4.测试
现在编写一个小的测试程序,目的是在各客户端的/tmp目录下新建一个helloworld.txt文件。
在master端/etc/puppet/manifests/下新建site.pp文件,输入如下内容:
# vi /etc/puppet/manifests/site.pp node default { file { "/tmp/helloworld.txt": content => "hello, world"; } }
在client端输入如下指令请求master端。
# puppet agent -t # cat /tmp/helloworld.txt hello.world
如果想看到更加具体的信息,需加入参数--test。
然后就可以根据实际需求开发自己的模块了。
5.续
再次使用puppet时,在master端新建文件,输入puppet agent --server=master.localdomain后,client端没有作用。添加--test参数察看具体信息,提示如下:
err: Could not request certificate: The certificate retrieved from the master does not match the agent's private key. Certificate fingerprint: CC:4E:9F:96:15:C1:D5:79:1C:71:57:66:1A:D8:6A:0E To fix this, remove the certificate from both the master and the agent and then start a puppet run, which will automatically regenerate a certficate. On the master: puppet cert clean client.localdomain On the agent: rm -f /var/lib/puppet/ssl/certs/client.localdomain.pem puppet agent -t
按照提示,先在master端删除client的cert。
# puppet cert clean client.localdomain
在client端先删除相关信息,然后重现与master端建立通信。
# rm -f /var/lib/puppet/ssl/certs/client.localdomain.pem
# puppet agent --no-daemonize --onetime --verbose --debug --server=master.localdomain
在master察看
[root@master puppet]# puppet cert list -all
如有client信息,则通信成功。
附:关于报错信息
1.
Could not prepare for execution: Could not create PID file
先察看是否与权限有关。如果有权限的话,察看是否有进程已启动:
# ps -ef | grep puppet
如果有,先kill掉,或者/etc/init.d/puppet stop后,然后重新输入指令。
2.
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class yum::repos for one-663.localdomain on node one-663.localdomain
在site.pp(或其他会import到site.pp的file.pp)中import 该class所在的"module_name"。即import "xxx"
3.
# puppet filebucket restore /etc/yum.repos.d/rh.repo 1bfcad49b3ffab391d5303ba58d26b64
Error: Could not run: Error 403 on SERVER: Forbidden request: 10.10.6.197(10.10.6.197) access to /file_bucket_file/md5/1bfcad49b3ffab391d5303ba58d26b64 [find] at :103
master端puppetmaster关掉了。重启即可。
浙公网安备 33010602011771号