庖丁解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之初級入門篇