自定義rpm包,還是有逼格和實際生產環境的意義的。
(下面的文檔有的代碼由于博客排版的問題導致擠在了一起,需要自己判別)
安裝FPM
fpm是ruby寫的,因此系統環境需要ruby,且ruby版本號大于1.8.5。
?
#?安裝ruby模塊
yum -y install ruby rubygems ruby-devel
?
#?添加淘寶的Rubygems倉庫,移除原生的Ruby倉庫
gem sources --addhttps://gems.ruby-china.org/ --remove https://rubygems.org/
?
#?安裝fpm,gem從rubygem倉庫安裝軟件類似yum從yum倉庫安裝軟件。首先安裝低版本的json,高版本的json需要ruby2.0以上,然后安裝低版本的fpm,夠用。
gem install json -v 1.8.3
gem install fpm -v 1.3.3
#?上面的2步安裝僅適合CentOS6系統,CentOS7系統直接使用gem install fpm一步搞定。
FPM參數
常用的幾個參數如下,詳細使用見fpm –help
-s??????????指定源類型
-t?????????指定目標類型,即想要制作為什么包
-n??????????指定包的名字
-v??????????指定包的版本號
-C?????????指定打包的相對路徑?Change directory to here before searching forfiles
-d??????????指定依賴于哪些包
-f?????????第二次打包時目錄下如果有同名安裝包存在,則覆蓋它
-p?????????輸出的安裝包的目錄,不想放在當前目錄下就需要指定
--vendor ??供應商
--description ?注釋信息
--post-install??????軟件包安裝完成之后所要運行的腳本
--pre-install???????軟件包安裝完成之前所要運行的腳本
--post-uninstall????軟件包卸載完成之后所要運行的腳本
--pre-uninstall?????軟件包卸載完成之前所要運行的腳本
定制nginx的RPM包實例
1. 在打包機器上先安裝一次nginx
yum -y install pcre-developenssl-devel
useradd nginx -M -s /sbin/nologin
tar xf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --user=nginx --group=nginx --prefix=/application/nginx-1.8.0 --with-http_ssl_module--with-http_stub_status_module
?
make && make install
ln -s /application/nginx-1.8.0/application/nginx
2. 編寫腳本
mkdir /server/scripts/ -p
cd /server/scripts/
軟件包卸載前、卸載后的腳本,可以根據情況是否編寫,不編寫問題也不大。但是rpm安裝后的腳本是必須的。
vim nginx_post_install.sh?? #編寫一個rpm安裝后需要執行的腳本
#!/bin/bash
useradd nginx -M -s /sbin/nologin
ln -s /application/nginx-1.8.0 /application/nginx
chmod +x /etc/init.d/nginx
chkconfig --add nginx
echo 'PATH=/application/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
準備個啟動腳本,如下:
vi /etc/init.d/nginx
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script fornginx webserver on Debian. Place in /etc/init.d and
?
PATH=/application/nginx/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/application/nginx/sbin/$NAME
CONFIGFILE=/application/nginx/conf/$NAME.conf
PIDFILE=/application/nginx/logs/$NAME.pid
?
case "$1" in
???start)
??????? echo -n "Starting $NAME... "
?
??????? if netstat -tnpl | grep -q nginx;then
??????????? echo "$NAME (pid `pidof $NAME`)already running."
??????????? exit 1
??????? fi
?
??????? $NGINX_BIN -c $CONFIGFILE
?
??????? if [ "$?" != 0 ] ; then
??????????? echo " failed"
??????????? exit 1
??????? else
??????????? echo " done"
??????? fi
??????? ;;
?
???stop)
??????? echo -n "Stoping $NAME... "
?
??????? if ! netstat -tnpl | grep -q nginx;then
??????????? echo "$NAME is notrunning."
??????????? exit 1
??????? fi
?
??????? $NGINX_BIN -s stop
?
??????? if [ "$?" != 0 ] ; then
??????????? echo " failed. Use force-quit"
??????????? exit 1
??????? else
??????????? echo " done"
??????? fi
??????? ;;
?
???status)
??????? if netstat -tnpl | grep -q nginx; then
??????????? PID=`pidof nginx`
??????????? echo "$NAME (pid $PID) isrunning..."
??????? else
??????????? echo "$NAME is stopped"
??????????? exit 0
??????? fi
??????? ;;
?
???force-quit)
??????? echo -n "Terminating $NAME..."
?
??????? if ! netstat -tnpl | grep -q nginx;then
??????????? echo "$NAME is notrunning."
??????????? exit 1
??????? fi
?
??????? kill `pidof $NAME`
?
??????? if [ "$?" != 0 ] ; then
??????????? echo " failed"
??????????? exit 1
??????? else
??????????? echo " done"
??????? fi
??????? ;;
?
???restart)
??????? $0 stop
??????? sleep 1
??????? $0 start
??????? ;;
?
???reload)
??????? echo -n "Reload service $NAME..."
?
??????? if netstat -tnpl | grep -q nginx; then
??????????? $NGINX_BIN -s reload
??????????? echo " done"
??????? else
??????????? echo "$NAME is not running,can't reload."
??????????? exit 1
??????? fi
??????? ;;
?
???configtest)
??????? echo -n "Test $NAME configurefiles... "
?
??????? $NGINX_BIN -t
??????? ;;
?
???*)
??????? echo "Usage: $0{start|stop|force-quit|restart|reload|status|configtest}"
??????? exit 1
??????? ;;
?
esac
3. 打包
fpm -s dir -t rpm -n nginx -v 1.8.0 --vendor "OPS@Company" --description "Nginx for?Company,Build in 2016/11/28" -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx_post_install.sh -f /application/nginx-1.8.0 /etc/init.d/nginx
#?注意:我們可以操作前修改下主機名,這樣打包出來的Build Host就會跟著改變。
4. 安裝rpm包
rpm命令安裝會報錯,如下例:
rpm -ivh nginx-1.8.0-1.x86_64.rpm?但會在缺少pcre-devel時候報錯,需要先yum安裝依賴才能安裝rpm包。
?
yum命令安裝rpm包
yum -y localinstall nginx-1.8.0-1.x86_64.rpm
這個命令會自動先安裝rpm包的依賴,然后再安裝rpm包。
其他
我們可以將其他的一些常用軟件如redis、mongodb、redis等都這樣定制好安裝路徑和配置文件,這樣安裝就方便多了。