庖丁解Puppet之中级进阶篇

庖丁解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

  
  
  
  
  1. node 'nfstest' { 
  2. file 
  3. { "/opt/java.war": 
  4. source => "puppet://$puppetserver/lgh/java.war", 
  5. exec 
  6. { "exec-java-web-update": 
  7. cwd => "/root/scripts", 
  8. command => "sh java-web-update.sh", 
  9. user => "root" 
  10. path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", 
  11.  
  12.  
  13. node 'kaifa' { 
  14. file 
  15. { "/opt/puppet.war": 
  16. source => "puppet://$puppetserver/lgh/puppet.war", 
  17. exec 
  18. { "exec-puppet-web-update": 
  19. cwd => "/root/scripts", 
  20. command => "sh java_web_update.sh", 
  21. user => "root" 
  22. 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.
--内容以下:服务器

  
  
  
  
  1. #!/bin/bash 
  2. Tomcat_root=/opt/java-web 
  3. Tomcat_file=/opt/java-web/webapps 
  4. Tomcat_cache=/opt/java-web/work 
  5. Java_updatefile_dir=/opt/java-web-update-file 
  6. File_name=java.war 
  7. Cur_Time=`date +%Y_%m_%H_%M` 
  8. Tomcat_process=`ps -ef | grep java-web | grep -v grep | awk '{print $2}'` 
  9. kill -9 $Tomcat_process >/dev/null 
  10. sleep 3 
  11. cd $Tomcat_file 
  12. #tar -zcf /opt/webapps.tar.gz.$Cur_Time * 
  13. rm -rf * 
  14. cd $Tomcat_cache 
  15. rm -rf * 
  16. cd /opt 
  17. cp -f $Java_updatefile_dir/$File_name $Tomcat_file/ 
  18. /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
网络

登陆kaifa客户端查看日志

    报错,从日志上看是先执行shell脚本,再执行文件传输,到tomcat程序目录下查看下,发现puppet.war包没有,这种现象与先执行shell,再执行文件传输的理论是一致的。从这能够看出,puppet客户端在执行多项任务时,是不分前后的,即便你在site.pp上写脚本时有前后。因此若是第二步的任务要在第一步完成后才能执行的话,只能使用触发,咱们把site.pp改下。
登陆 puppet服务器,修改site.pp
--内容以下:
 

  
  
  
  
  1. node 'nfstest' { 
  2. file 
  3. { "/opt/java-web-update-file/java.war": 
  4. source => "puppet://$puppetserver/lgh/java.war", 
  5. notify => Exec["exec-java-web-update"], 
  6. exec 
  7. { "exec-java-web-update": 
  8. cwd => "/root/scripts", 
  9. command => "sh /root/scripts/update_java_web.sh", 
  10. user => "root", 
  11. path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", 
  12.  
  13.  
  14. node 'kaifa' { 
  15. file 
  16. { "/opt/puppet-web-update-file/puppet.war": 
  17. source => "puppet://$puppetserver/lgh/puppet.war", 
  18. notify => Exec["exec-puppet-web-update"], 
  19. exec 
  20. { "exec-puppet-web-update": 
  21. cwd => "/root/scripts", 
  22. command => "sh /root/scripts/update_puppet_web.sh", 
  23. user => "root", 
  24. path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", 
  25.  


具体成功的日志,这里不贴出来了,贴两个应用程序的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之初级入门篇  

相关文章
相关标签/搜索