一、准备工作
两台机器:192.168.0.93(服务端) 192.168.0.92 (客户端)
两台机器关闭selinux,清空iptables规则,并保存,设置hostname
192.168.0.93 上 hostname web9.yanyi.com
编辑 /etc/sysconfig/network 定义hostname
192.168.0.92 上 hostname web10.yanyi.com
编辑 /etc/sysconfig/network 定义hostname
编辑hosts文件
192.168.0.93 和 192.168.0.92全部为
两台机器安装ntpdate,并建立自动同步时间的任务计划:
crontab -e #加入
1 2
| [root@web9 ~] */10 * * * * ntpdate time.windows.com >/dev/null 2>&1
|
1 2
| [root@web10 ~] */10 * * * * ntpdate time.windows.com >/dev/null 2>&1
|
二、安装 puppet
1.安装服务端
服务端(192.138.0.93)上
安装puppet 源
安装服务端程序
启动服务
1 2
| [root@web9 ~] 启动 puppetmaster: [确定]
|
开机启动
2.安装客户端
客户端(192.168.0.92)上
安装puppet 源
安装客户端程序
修改配置文件 /etc/puppet/puppet.conf 在最后面添加
1 2
| server = web9.yanyi.com runinterval = 10
|
启动服务
1 2
| [root@web10 ~] Starting puppet agent: [确定]
|
开机启动
三、配置认证
服务端查看客户端证书列表 puppet cert list –all #如果签发的证书,会本行最前面带一个+
1 2 3
| [root@web9 ~] "web10.yanyi.com" (SHA256) 16:BF:29:D2:D3:56:18:25:CE:8E:E3:89:E7:6E:08:65:BB:BC:F7:1F:98:86:0D:DA:C8:48:B8:60:75:A8:77:94 + "web9.yanyi.com" (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: "DNS:puppet", "DNS:puppet.yanyi.com", "DNS:web9.yanyi.com")
|
客户端上生成ssl证书 puppet agent –test –server web9.yanyi.com
1 2 3 4 5 6 7 8 9
| [root@web9 ~] Warning: Unable to fetch my node definition, but the agent run will continue: Warning: undefined method `include?' for nil:NilClass Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for web9.yanyi.com Info: Applying configuration version '1487260353' Info: Creating state file /var/lib/puppet/state/state.yaml Notice: Finished catalog run in 0.01 seconds
|
服务端签发指定客户端证书
1 2 3
| [root@web9 ~] Notice: Signed certificate request for web10.yanyi.com Notice: Removing file Puppet::SSL::CertificateRequest web10.yanyi.com at '/var/lib/puppet/ssl/ca/requests/web10.yanyi.com.pem'
|
执行 puppet cert list –all 看是否成功
1 2 3
| [root@web9 ~] + "web10.yanyi.com" (SHA256) 50:B7:39:53:62:3C:BA:AF:BD:7B:B3:48:99:B7:3D:B2:9D:DE:5E:34:71:FD:3A:2B:8A:34:98:09:2C:02:6F:87 + "web9.yanyi.com" (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: "DNS:puppet", "DNS:puppet.yanyi.com", "DNS:web9.yanyi.com")
|
服务端可以删除指定客户端证书
1 2 3 4
| [root@web9 ~] Notice: Revoked certificate with serial 3 Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at '/var/lib/puppet/ssl/ca/signed/web10.yanyi.com.pem' Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at '/var/lib/puppet/ssl/certs/web10.yanyi.com.pem'
|
1 2
| [root@web9 ~] + "web9.yanyi.com" (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: "DNS:puppet", "DNS:puppet.yanyi.com", "DNS:web9.yanyi.com")
|
删除所有证书 puppet cert clean –all
1 2 3 4 5
| [root@web9 ~] Notice: Revoked certificate with serial 2 Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at '/var/lib/puppet/ssl/ca/signed/web9.yanyi.com.pem' Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at '/var/lib/puppet/ssl/certs/web9.yanyi.com.pem' Notice: Removing file Puppet::SSL::Key web9.yanyi.com at '/var/lib/puppet/ssl/private_keys/web9.yanyi.com.pem'
|
删除所有证书以后,服务端执行 puppet agent –test –server web9.yanyi.com
1 2 3 4 5 6 7 8
| [root@web9 ~] Info: Creating a new SSL key for web9.yanyi.com Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml Info: Creating a new SSL certificate request for web9.yanyi.com Info: Certificate Request fingerprint (SHA256): AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3 Exiting; no certificate found and waitforcert is disabled [root@web9 ~] "web9.yanyi.com" (SHA256) AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3
|
客户端需删除 ssl 目录下所有文件并重启服务
1 2 3 4
| [root@web10 ~] [root@web10 ~] Stopping puppet agent: [确定] Starting puppet agent: [确定]
|
然后服务端查看,并重签
1 2 3
| [root@web9 ~] "web10.yanyi.com" (SHA256) 58:48:87:28:06:26:CA:53:86:31:A0:78:B7:55:E5:F7:6E:C2:3E:5E:19:48:19:C3:96:E9:42:9F:D9:96:13:EC "web9.yanyi.com" (SHA256) AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3
|
1 2 3
| [root@web9 ~] Notice: Signed certificate request for web9.yanyi.com Notice: Removing file Puppet::SSL::CertificateRequest web9.yanyi.com at '/var/lib/puppet/ssl/ca/requests/web9.yanyi.com.pem'
|
1 2 3
| [root@web9 ~] Notice: Signed certificate request for web10.yanyi.com Notice: Removing file Puppet::SSL::CertificateRequest web10.yanyi.com at '/var/lib/puppet/ssl/ca/requests/web10.yanyi.com.pem'
|
1 2 3
| [root@web9 ~] + "web10.yanyi.com" (SHA256) B0:2C:B1:C4:B7:E3:3E:1A:40:99:D2:4F:6F:E3:1E:1E:24:69:22:07:68:D9:C9:F4:9E:5F:4A:D9:BF:35:F6:27 + "web9.yanyi.com" (SHA256) D0:49:21:D3:4E:B6:EA:48:19:4D:29:F4:4C:A1:16:77:BC:DD:8E:BA:73:6C:83:0A:37:5F:5D:F8:0B:67:B1:B7
|
四、 配置自动签发证书
服务端删除客户端证书 puppet cert clean web10.yanyi.com
1 2 3 4
| [root@web9 ~] Notice: Revoked certificate with serial 5 Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at '/var/lib/puppet/ssl/ca/signed/web10.yanyi.com.pem' Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at '/var/lib/puppet/ssl/certs/web10.yanyi.com.pem'
|
客户端删除ssl相关文件 rm -rf /var/lib/puppet/ssl/*
服务端创建自动签发的配置文件 /etc/puppet/autosign.conf
加入如下内容
修改服务端 puppet 配置文件 /etc/puppet/puppet.conf
在 [main] 下加入内容 autosign = true
服务端重启puppetmaster服务 /etc/init.d/puppetmaster restart
1 2 3
| [root@web9 ~] 停止 puppetmaster: [确定] 启动 puppetmaster: [确定]
|
客户端重启puppet服务 /etc/init.d/puppet restart
1 2 3
| [root@web10 ~] Stopping puppet agent: [确定] Starting puppet agent: [确定]
|
服务端 puppet cert list –all#可以看到web10.aming.com已经签名
如果客户端不重启puppet服务,也可以通过命令来自动签发
puppet agent –test –server web9.yanyi.com
1 2 3 4 5
| [root@web9 ~] Notice: Revoked certificate with serial 6 Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at '/var/lib/puppet/ssl/ca/signed/web9.yanyi.com.pem' Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at '/var/lib/puppet/ssl/certs/web9.yanyi.com.pem' Notice: Removing file Puppet::SSL::Key web9.yanyi.com at '/var/lib/puppet/ssl/private_keys/web9.yanyi.com.pem'
|
1 2 3 4 5 6
| [root@web9 ~] Info: Creating a new SSL key for web9.yanyi.com Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml Info: Creating a new SSL certificate request for web9.yanyi.com Info: Certificate Request fingerprint (SHA256): 84:AA:7D:13:C6:9C:F6:8E:25:7E:27:69:7C:1E:12:F1:8C:D9:D6:3B:49:74:83:E3:1A:15:9F:F0:37:F7:35:84 Exiting; no certificate found and waitforcert is disabled
|
1 2 3
| [root@web9 ~] + "web10.yanyi.com" (SHA256) 92:F3:04:9E:01:D5:A6:4B:BF:51:22:89:A2:51:F9:7A:1E:D1:53:13:19:49:2A:3D:58:9D:38:39:17:D3:AC:E2 + "web9.yanyi.com" (SHA256) 26:5D:91:D4:B9:58:62:66:CB:48:6A:3F:CB:51:5B:DD:4C:9B:72:39:34:6E:01:C5:41:C6:DB:EE:93:3F:5D:20 (alt names: "DNS:puppet", "DNS:puppet.yanyi.com", "DNS:web9.yanyi.com")
|
五、测试证书
服务端编辑配置文件 /etc/puppet/manifests/site.pp
添加如下内容
1 2 3 4 5
| node default { file {"/tmp/123.txt": content => "test,test"; } }
|
说明:如果不配置该文件,则客户端不会同步任何数据
客户端上稍等一会(每隔30s会自动执行服务端上的任务),或者直接命令行
这样在客户端的/tmp/下会有个123.txt文件,内容为test,test
1 2 3 4
| [root@web10 ~] 123.txt yum.log [root@web10 ~] test,test
|
六、配置模块
定义模块管理
模块是 puppet 的配置单元,模块里面会包含类和资源。同步文件、远程执行命令、cron 等叫做资源,都是通过模块来实现的。下面我们来写一个模块
服务端创建目录 mkdir /etc/puppet/modules/testm这个目录名字也作为模块名字
然后继续创建模块对应的子目录
files里面存文件,可以留空,manifests里面是配置文件,templates里面是模块文件可以为空
在 files 创建文件 1.txt,内容随意
创建配置文件 /etc/puppet/modules/testm/manifests/init.pp
内容为
1 2 3 4 5 6 7 8
| class testm{ file {"/tmp/2.txt": owner => "root", group => "root", mode => 0400, source => "puppet://$puppetserver/modules/testm/1.txt" } }
|
说明:类名字也叫做testm, 类下面定义了一个资源file,文件名字叫做/tmp/2.txt , owner,group,mode定义文件的属主、数组以及权限,source定义这个文件从哪里获取。 $puppetserver一会也要定义一下,这里指的是puppet server服务器上/etc/puppet/modules/testm/files/1.txt
下面要继续定义一个很关键的配置文件:/etc/puppet/manifests/site.pp
内容如下
1 2 3 4
| $puppetserver = 'web9.yanyi.com' node 'web10.yanyi.com'{ include testm }
|
说明:$puppetserver 定义服务端的主机名,node后面为客户端的主机名,这里面定义该客户端要加载的模块
配置完成后,在客户端执行命令:
如果客户端上启动了puppet服务,不用执行这命令,它也会自动同步的
七、文件或目录资源
上面的模块其实只是同步了一个文件而已,那么要想同步一个目录如何做?我们可以通过实现同步一个目录来做一个包发布系统。 比如在一台机器上编译安装好了apache,那么就可以通过这样的模块把这个apache目录整个分发到其他机器上。
1 2 3 4 5 6 7 8 9
| [root@web9 ~] [root@web9 modules] testm [root@web9 modules] [root@web9 testm] files manifests templates [root@web9 testm] [root@web9 manifests] init.pp
|
模块配置文件如下:
1 2 3 4 5 6 7 8 9
| class apache{ file {"/usr/local/apache2": owner => "root", group => "root", source => "puppet://$puppetserver/modules/apache/apache2", recurse => true, purge => true } }
|
其中recurse=>true 这个参数很关键,它表示递归的意思,没有这个不能同步目录。 purge参数可以保证当服务端删除某个文件,客户端可以跟着删除。
因实验虚拟机没 apache 目录更改为 testm
参考Puppet学习之文件管理
在 puppet 目录下有个 manifests 目录,编辑下边的配置文件
1 2 3
| [root@web9 puppet] [root@web9 manifests] site.pp
|
添加内容 include apache
查看 客户端 /usr/local 目录,下边多了 apache2 文件夹
八、远程执行命令
编辑配置文件 /etc/puppet/modules/testm/manifests/init.pp
添加内容
1 2 3 4 5
| exec {"123": unless => "test -f /tmp/yanyi.txt", path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"], command => "touch /tmp/yanyi.txt" }
|
说明:123只是作为该资源的一个名字,unless后面的命令作为一个条件,当条件成立时,不会执行下面的命令,如果想要条件成立时,执行下面的命令,用 onlyif。要注意的是,我们一定要给执行的这条命令加个条件,使用unless就可以,必须满足这个条件才能执行命令,否则这个命令会一直执行,不太妥当。
查看客户端的 tmp 是否生成 yanyi.txt 文件
1 2 3 4 5 6
| [root@web10 ~] 总用量 8 -rw-r--r-- 1 root root 0 2月 20 23:31 yanyi.txt -r-------- 1 root root 6 2月 17 04:30 2.txt -rw-r--r-- 1 root root 9 2月 17 03:40 123.txt -rw-------. 1 root root 0 2月 15 06:16 yum.log
|
参考 puppet exec
九、任务计划
编辑配置文件 /etc/puppet/modules/testm/manifests/init.pp
添加内容
1 2 3 4 5 6
| cron {"yanyi1": command => "/sbin/ntpdate time.windows.com", user => "root", minute => "*/10", }
|
说明:分时日月周分别对应puppet里面的minute,hour,monthday,month,weekday,ensure设置为absent为删除该任务,如果不设置改行则为建立
查看客户端是否生成该计划任务
参考 puppet cron