庖丁解Puppet之
中级进阶篇java
前言:
公司的web网站是java开发的,因此常常要更新war包,虽然服务器只有几十台,但每次传输文件,而后再在应用服务器上执行更新脚本,是件很麻烦的事,这也是我开始研究puppet的动力,不过经过今天的实验,我发现puppet并不很适合我公司用,但箾已发出了,不想中止,也没办法中止,怎么都要把puppet弄个九成熟,因此就有了本篇的中级进阶博文。node
实例二:
经过puppet服务器端向两台客户端传输war包(包括更新),并执行tomcat重启命令,从而达到更新网站程序的要求。
这个实例验证puppet两个功能,一是文件传输,二是执行客户端的shell脚本。
网络拓朴:
web
环境搭建:
找公司开发部作三个简单的包,一个java.war包,一个puppet.war包。Java.war包输出为“hello,java”。Puppet.war包输出为“hello,puppet”。还有一个更新包puppet.war,输出内容为“hell,puppet,第二次传输,更新”。这里要注意,后面更新包puppet.war与第一次的puppet.war同名,但内容不同,为的是模拟同名文件更新问题(网站更新包,也就是项目名是不变的)。
shell
操做:
在42与31两台服务器上装上jdk和tomcat,具体安装这里暂不说明了,后期补上,修改tomcat程序目录下的index.jsp页面。把原来显示为“If you're seeing this page….”这句话分别改成puppet-web is ok和java-web is ok。这样修改是为了好区分。
浏览器
登陆puppet服务器,把java.war与第一次的puppet.war包上传至opt目录
tomcat
修改puppet服务器的site.pp
bash
- node 'nfstest' {
- file
- { "/opt/java.war":
- source => "puppet://$puppetserver/lgh/java.war",
- }
- exec
- { "exec-java-web-update":
- cwd => "/root/scripts",
- command => "sh java-web-update.sh",
- user => "root"
- path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
- }
- }
- node 'kaifa' {
- file
- { "/opt/puppet.war":
- source => "puppet://$puppetserver/lgh/puppet.war",
- }
- exec
- { "exec-puppet-web-update":
- cwd => "/root/scripts",
- command => "sh java_web_update.sh",
- user => "root"
- path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
- }
- }
登陆nfstest客户端(192.168.133.42)在/root/scripts目录新建一shell,命名为java_web_update.sh.
--内容以下:服务器
- #!/bin/bash
- Tomcat_root=/opt/java-web
- Tomcat_file=/opt/java-web/webapps
- Tomcat_cache=/opt/java-web/work
- Java_updatefile_dir=/opt/java-web-update-file
- File_name=java.war
- Cur_Time=`date +%Y_%m_%H_%M`
- Tomcat_process=`ps -ef | grep java-web | grep -v grep | awk '{print $2}'`
- kill -9 $Tomcat_process >/dev/null
- sleep 3
- cd $Tomcat_file
- #tar -zcf /opt/webapps.tar.gz.$Cur_Time *
- rm -rf *
- cd $Tomcat_cache
- rm -rf *
- cd /opt
- cp -f $Java_updatefile_dir/$File_name $Tomcat_file/
- /opt/java-web/bin/startup.sh >>/root/lgh.log
若是在当前tty下执行脚本没有出现问题,但经过远程调用该脚本时报以下错,是由于在安装jdk时,虽然source /etc/profile了环境变量,但某些场景仍是会不生效,因此,安装完jdk后,建议把服务器重启一下,解决这个问题,折腾了我一上午时间。
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this programjava-web
登陆puppet服务器执行命令
Puppetrun nfstest kaifa
返回日志
Triggering nfstest
Getting status
status is success
nfstest finished with exit code 0
Triggering kaifa
Getting status
status is success
kaifa finished with exit code 0
Finished
登陆nfstest客户端查看日志
Tail –f /var/log/message
网络
报错,从日志上看是先执行shell脚本,再执行文件传输,到tomcat程序目录下查看下,发现puppet.war包没有,这种现象与先执行shell,再执行文件传输的理论是一致的。从这能够看出,puppet客户端在执行多项任务时,是不分前后的,即便你在site.pp上写脚本时有前后。因此若是第二步的任务要在第一步完成后才能执行的话,只能使用触发,咱们把site.pp改下。
登陆 puppet服务器,修改site.pp
--内容以下:
- node 'nfstest' {
- file
- { "/opt/java-web-update-file/java.war":
- source => "puppet://$puppetserver/lgh/java.war",
- notify => Exec["exec-java-web-update"],
- }
- exec
- { "exec-java-web-update":
- cwd => "/root/scripts",
- command => "sh /root/scripts/update_java_web.sh",
- user => "root",
- path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
- }
- }
- node 'kaifa' {
- file
- { "/opt/puppet-web-update-file/puppet.war":
- source => "puppet://$puppetserver/lgh/puppet.war",
- notify => Exec["exec-puppet-web-update"],
- }
- exec
- { "exec-puppet-web-update":
- cwd => "/root/scripts",
- command => "sh /root/scripts/update_puppet_web.sh",
- user => "root",
- path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
- }
- }
具体成功的日志,这里不贴出来了,贴两个应用程序的web输出。
这两个输入也刚开始搭建tomcat时,输出不同,说明更新网站成功。
刚才咱们作的操做是先传文件,而后再执行脚本,这脚本里会调用第一步的文件,因此要注意文件执行的前后顺序。咱们再来作个puppet更新。
登陆puppet服务器的opt目录,看下文件包
把puppet.war更名为puppet.war.first,把puppet2.war包更名为puppet.war,这样作的目的是不想改site.pp文件内容了,这里要注意目前的puppet.war包内容,应该是”hell,puppet.第二次传输,更新”。
更名后,执行一下
Puppetrun kaifa
同时登陆客户端看下日志,发现同名文件正在传输,而且很清楚的说明了文件从哪一个MD5变为了哪一个MD5值,更新完后,咱们访问web就知道,这次更新是否正常。
等日志输出为finished catalog run in xxxx seconds,咱们打开浏览器访问一下。
发现web内容由“hello,puppet”变为“hell,puppet.第二次传输,更新”,达到目的,完满完成任务。
经过今天的实验,我颇有信心在公司的生产环境部署puppet了,我公司主要是更新包传输与本地执行shell脚本,目前的实验来看,已经达到了,我想要的效果。后期就是高级篇了,高级篇是研究puppet的结构,把它弄明白,并编写出模块化的pp资源。
:):该死的开发,“hello”,被他写成“hell”了。
相关博文阅读:
庖丁解Puppet之初级入门篇