庖丁解Puppet之
中級進階篇
前言:
公司的web網站是java開發的,是以經常要更新war包,雖然伺服器隻有幾十台,但每次傳輸檔案,然後再在應用伺服器上執行更新腳本,是件很麻煩的事,這也是我開始研究puppet的動力,不過通過今天的實驗,我發現puppet并不很适合我公司用,但箾已發出了,不想停止,也沒辦法停止,怎麼都要把puppet弄個九成熟,是以就有了本篇的中級進階博文。
執行個體二:
通過puppet伺服器端向兩台用戶端傳輸war包(包括更新),并執行tomcat重新開機指令,進而達到更新網站程式的要求。
這個執行個體驗證puppet兩個功能,一是檔案傳輸,二是執行用戶端的shell腳本。
網絡拓樸:
<a href="http://blog.51cto.com/attachment/201202/183000779.jpg" target="_blank"></a>
環境搭建:
找公司開發部做三個簡單的包,一個java.war包,一個puppet.war包。Java.war包輸出為“hello,java”。Puppet.war包輸出為“hello,puppet”。還有一個更新包puppet.war,輸出内容為“hell,puppet,第二次傳輸,更新”。這裡要注意,後面更新包puppet.war與第一次的puppet.war同名,但内容不一樣,為的是模拟同名檔案更新問題(網站更新包,也就是項目名是不變的)。
<a href="http://blog.51cto.com/attachment/201202/183039412.jpg" target="_blank"></a>
操作:
在42與31兩台伺服器上裝上jdk和tomcat,具體安裝這裡暫不說明了,後期補上,修改tomcat程式目錄下的index.jsp頁面。把原來顯示為“If you're seeing this page….”這句話分别改為puppet-web is ok和java-web is ok。這樣修改是為了好區分。
<a href="http://blog.51cto.com/attachment/201202/183058133.jpg" target="_blank"></a>
登入puppet伺服器,把java.war與第一次的puppet.war包上傳至opt目錄
<a href="http://blog.51cto.com/attachment/201202/183122845.jpg" target="_blank"></a>
修改puppet伺服器的site.pp
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' {
{ "/opt/puppet.war":
source => "puppet://$puppetserver/lgh/puppet.war",
{ "exec-puppet-web-update":
command => "sh java_web_update.sh",
登入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
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 program
登入puppet伺服器執行指令
Puppetrun nfstest kaifa
傳回日志
Triggering nfstest
Getting status
status is success
nfstest finished with exit code 0
Triggering kaifa
kaifa finished with exit code 0
Finished
登入nfstest用戶端檢視日志
Tail –f /var/log/message
<a href="http://blog.51cto.com/attachment/201202/183157608.jpg" target="_blank"></a>
登入kaifa用戶端檢視日志
<a href="http://blog.51cto.com/attachment/201202/183206725.jpg" target="_blank"></a>
報錯,從日志上看是先執行shell腳本,再執行檔案傳輸,到tomcat程式目錄下檢視下,發現puppet.war包沒有,這種現象與先執行shell,再執行檔案傳輸的理論是一緻的。從這可以看出,puppet用戶端在執行多項任務時,是不分先後的,即使你在site.pp上寫腳本時有先後。是以如果第二步的任務要在第一步完成後才能執行的話,隻能使用觸發,我們把site.pp改下。
登入 puppet伺服器,修改site.pp
--内容如下:
{ "/opt/java-web-update-file/java.war":
notify => Exec["exec-java-web-update"],
command => "sh /root/scripts/update_java_web.sh",
user => "root",
{ "/opt/puppet-web-update-file/puppet.war":
notify => Exec["exec-puppet-web-update"],
command => "sh /root/scripts/update_puppet_web.sh",
具體成功的日志,這裡不貼出來了,貼兩個應用程式的web輸出。
<a href="http://blog.51cto.com/attachment/201202/183236936.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201202/183228823.jpg" target="_blank"></a>
這兩個輸入也剛開始搭建tomcat時,輸出不一樣,說明更新網站成功。
剛才我們做的操作是先傳檔案,然後再執行腳本,這腳本裡會調用第一步的檔案,是以要注意檔案執行的先後順序。我們再來做個puppet更新。
登入puppet伺服器的opt目錄,看下檔案包
<a href="http://blog.51cto.com/attachment/201202/183312180.jpg" target="_blank"></a>
把puppet.war改名為puppet.war.first,把puppet2.war包改名為puppet.war,這樣做的目的是不想改site.pp檔案内容了,這裡要注意目前的puppet.war包内容,應該是”hell,puppet.第二次傳輸,更新”。
改名後,執行一下
Puppetrun kaifa
同時登入用戶端看下日志,發現同名檔案正在傳輸,并且很清楚的說明了檔案從哪個MD5變為了哪個MD5值,更新完後,我們通路web就知道,此次更新是否正常。
<a href="http://blog.51cto.com/attachment/201202/183332202.jpg" target="_blank"></a>
等日志輸出為finished catalog run in xxxx seconds,我們打開浏覽器通路一下。
<a href="http://blog.51cto.com/attachment/201202/183343122.jpg" target="_blank"></a>
發現web内容由“hello,puppet”變為“hell,puppet.第二次傳輸,更新”,達到目的,完滿完成任務。
通過今天的實驗,我很有信心在公司的生産環境部署puppet了,我公司主要是更新包傳輸與本地執行shell腳本,目前的實驗來看,已經達到了,我想要的效果。後期就是進階篇了,進階篇是研究puppet的結構,把它弄明白,并編寫出子產品化的pp資源。
:):該死的開發,“hello”,被他寫成“hell”了。
相關博文閱讀:
<a href="http://369369.blog.51cto.com/319630/785895" target="_blank">庖丁解Puppet之初級入門篇</a>
本文轉自itwork 51CTO部落格,原文連結:http://blog.51cto.com/369369/792023,如需轉載請自行聯系原作者