定製rpm包
python
說明:這些操做所有在管理服務器內操做。linux
定製rpm包,搭建內網yum倉庫,經過kickstart批量系統安裝,這是互聯網企業運維自動化的必要技能,自動化運維的基石。nginx
有100臺服務器想安裝系統。你有什麼方案快速部署並優化嗎?須要多少時間搞定?git
(1) tar打包:先編譯安裝、打包、批量分發、解包;github
(2) saltstack、puppet、ansible批量部署;面試
(3) 定製rpm所、搭建yum倉庫、yum安裝;docker
(4) openstack虛擬機鏡像和docker窗口分發。json
r 優勢vim
按需開啓功能緩存
可定製(定製安裝目錄和軟件功能)、一狀況下不須要網絡、可選擇軟件版本
r 缺點
須要查找並實驗出適合的編譯參數
軟件版本升級時,要注意某些參數已經取消掉了
MySQL、PHP等軟件編譯耗時過長
慢、複雜、須要查找編譯參數、找依賴麻煩、純編譯依賴比較複雜
r 優勢
全自動化安裝
簡單、便捷
不須要爲依賴問題發愁了
r 缺點
自主性太差
須要網絡、網絡很差時,下載速度慢
沒有辦法定製、軟件的功能、存放位置都已經固定好了,不易變動
r 優勢:簡單、快
r 缺點:不能定製、包容量大
r 流程:根據需求編譯軟件==>製件rpm包==>搭建內網yum倉庫==>yum安裝
r 優勢:結合編譯安裝與yum安裝二者的優勢
r 缺點 :rpm包的通用性差,只能適用於公司的環境,第一步編譯安裝複雜、打包後不能再次更改、通常人不會定製rpm包
英文全稱是Red Hat Package Manager,即Red Hat包管理器。
幾乎全部的Linux發行版本都使用這種形式的軟件包管理安裝、更新和卸載軟件。
rpm命令有五種基本功能(但不包括建立軟件包):安裝、卸載、升級、查詢、驗證。
FPM的做者是jordansissel
FPM的GitHub:https://github.com/jordansissel/fpm
FPM功能簡單理解:就是將一種類型的包轉換成另外一種類型。
dir #<==將目錄打包成所須要的類型,能夠用於源碼編譯安裝的軟件包 rpm #<==對rpm進行轉換 gem #<==對rubygem包進行轉換 python #<==將python模塊打包成相應的類型
rpm #<==轉換爲rpm包 deb #<==轉換爲deb包 solaris #<==轉換爲solaris包 puppet #<==轉換爲puppet模塊
fpm是ruby寫的,所以系統環境須要ruby,且ruby版本號大於1.8.5。
#<==安裝ruby模塊 yum -y install ruby rubygems ruby-devel #<==添加阿里雲的Rubygems倉庫 gem source -a http://mirrors.aliyun.com/rubygems/ #<==移除原生的Ruby倉庫 gem source -r https://rubygems.org/ #<==安裝fpm gem install json -v 1.7.7 gem install cabin -v 0.6 gem install backports -v 2.6.2 gem install arr-pm -v 0.0.9 gem install clamp -v 0.6 #gem install childprocess -v 0.5.9 gem install fpm -v 1.3.3 #<==指定安裝fpm 1.3.3版本的軟件
詳細使用見:fpm --help
經常使用參數以下:
-s #<==source,指定源類型 -t #<==target,指定目標類型,即想要製做爲何包 -n #<==name,指定包的名字 -v #<==version,指定包的版本號 -C #<==change,指定打包的相對路徑 -d #<==depend,指定依賴於哪些包 -f #<==force,第二次打包時目錄下若是有同名安裝包存在,則覆蓋它 -p #<==輸出的安裝包的目錄,不想放在當前目錄下就須要指定 --post-install #<==軟件包安裝完成以後所要運行的腳本;同--after-install --pre-install #<==軟件包安裝完成以前所要運行的腳本;同--before-install --post-uninstall #<==軟件包卸載完成以後所要運行的腳本;同--after-remove --pre-uninstall #<==軟件包卸載完成以前所要運行的腳本;同--before-remove
[root@m01 ~]# cat /etc/redhat-release #<==系統版本 CentOS release 6.7 (Final) [root@m01 ~]# uname -r #<==64位系統,及內核版本 2.6.32-573.el6.x86_64 [root@m01 ~]# getenforce #<==關selinux Disabled [root@m01 ~]# /etc/init.d/iptables status #<==關防火牆 iptables:未運行防火牆。
[root@m01 ~]# mkdir /application/tools/ -p #<==統一軟件包存放目錄 [root@m01 ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf#<==開啓yum緩存 [root@m01 ~]# find /var/cache/ -type f -name '*rpm'|xargs rm -f #<==清空本機已有yum緩存 [root@m01 ~]# cd /application/tools/ [root@m01 tools]# wget -q http://nginx.org/download/nginx-1.6.3.tar.gz #<==下載nginx-1.6.3
yum install pcre pcre-devel openssl openssl-devel -y rpm -qa openssl openssl-devel pcre pcre-devel find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/ cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm sz nginx_yum.tar.gz -------------------------------------------------------------------------------- cd /application/tools/ useradd nginx -M -s /sbin/nologin tar xf nginx-1.6.3.tar.gz cd nginx-1.6.3 ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module echo $? make && make install echo $? ln -s /application/nginx-1.6.3/ /application/nginx ll -d /application/nginx-1.6.3/ /application/nginx
~ 過程
[root@m01 tmp]# yum install pcre pcre-devel openssl openssl-devel -y #<==安裝pcre庫,openssl軟件,由於等下編譯安裝時,須要安裝ssl模塊 [root@m01 tmp]# rpm -qa openssl openssl-devel pcre pcre-devel#<==檢查 openssl-devel-1.0.1e-48.el6_8.1.x86_64 pcre-7.8-7.el6.x86_64 openssl-1.0.1e-48.el6_8.1.x86_64 pcre-devel-7.8-7.el6.x86_64 [root@m01 tools]# find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/ #<==另存rpm包,由於不少人的系統環境可能不一致,須要的rpm包可能不一樣。 [root@m01 tools]# cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm#<==打包 [root@m01 tmp]# cd /application/tools/#<==切換到軟件包存放目錄 [root@m01 tools]# useradd nginx -M -s /sbin/nologin #<==添加nginx用戶 [root@m01 tools]# tar xf nginx-1.6.3.tar.gz #<==解包 [root@m01 tools]# cd nginx-1.6.3#<==切換到nginx1.6.3目錄下 [root@m01 nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module#<==配置過程 內容省略,自行腦補…… [root@m01 nginx-1.6.3]# echo $?#<==檢查配置過程是否出錯 0 [root@m01 nginx-1.6.3]# make && make install#<==編譯&&配置過程 內容省略,自行腦補…… [root@m01 nginx-1.6.3]# echo $?#<==檢查編譯與配置過程是否出錯 0 [root@m01 nginx-1.6.3]# ln -s /application/nginx-1.6.3/ /application/nginx #<==作軟連接 [root@m01 nginx-1.6.3]# ll -d /application/nginx-1.6.3/ /application/nginx #<==檢查 lrwxrwxrwx 1 root root 25 2016-07-29 17:37 /application/nginx -> /application/nginx-1.6.3/ drwxr-xr-x 6 root root 4096 2016-07-29 17:37 /application/nginx-1.6.3/
mkdir /server/scripts -p cd /server/scripts/ cat >>nginx_rpm.sh<<EOF #!/bin/bash useradd nginx -M -s /sbin/nologin ln -s /application/nginx-1.6.3/ /application/nginx EOF
~ 過程
[root@m01 nginx-1.6.3]# mkdir /server/scripts -p [root@m01 nginx-1.6.3]# cd /server/scripts/ [root@m01 scripts]# vim nginx_rpm.sh#<==這是安裝完rpm包要執行的腳本 #!/bin/bash useradd nginx -M -s /sbin/nologin ln -s /application/nginx-1.6.3/ /application/nginx
fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/ ll -h sz nginx_rpm.sh sz nginx-1.6.3-1.x86_64.rpm
~ 過程
[root@m01 scripts]# fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/ no value for epoch is set, defaulting to nil {:level=>:warn} no value for epoch is set, defaulting to nil {:level=>:warn} Created package {:path=>"nginx-1.6.3-1.x86_64.rpm"} fpm命令參數詳解: -s #<==source,指定源類型 -t #<==target,指定目標類型,即想要製做爲何包 -n #<==name,指定包的名字 -v #<==version,指定包的版本號 -d #<==depend,指定依賴於哪些包,包有多個,用逗號隔開 -f #<==force,第二次打包時目錄下若是有同名安裝包存在,則覆蓋它 --post-install #<==軟件包安裝完成以後所要運行的腳本;同--after-install --pre-install #<==軟件包安裝完成以前所要運行的腳本;同--before-instal
~ 查看
rpm -qpi包名 #<==查看rpm包詳細信息 rpm -qpl包名 #<==查看rpm包裏面的內容 rpm -qpR包名 #<==查看rpm包的依賴 rpm -qp --scripts 包名 #<==查看rpm包帶的執行腳本,執行腳本不是以文件形式存在 rpm -qa #<==查看系統內全部已安裝的rpm包
~ 安裝
rpm -ivh包名 #<==安裝rpm包 rpm -ivh --aid 包名 #<==解決rpm包循環依賴的問題
~ 查看
-a #<==all,全部 -q #<==query,查詢 -p #<==package,包 -i #<==info,信息 -l #<==list,列表 -R #<==requires,依賴 --scripts #<==顯示腳本
~ 安裝
-i #<==install,安裝 -v #<==顯示詳細信息(Print verbose information) -h #<==hash,顯示哈希值 --aid Add suggested packages to the transaction set(事務集)when needed.
fpm打包時,必定要用絕對路徑!
fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==相當路徑
fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx-1.6.3/#<==絕對路徑
使用rpm -qpl查看rpm包的內容fpm相似tar打包同樣,只是fpm打的包可以被yum命令識別而已
~ 過程
[root@m01 scripts]# cd /application/nginx-1.6.3/#<==切換到目錄下,再打包 [root@m01 nginx-1.6.3]# fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==點來表明當前目錄 [root@m01 nginx-1.6.3]# rpm -qpl nginx-1.6.3-1.x86_64.rpm #<==全部的目錄,都從系統根目錄開始了,因此,必定要用絕對路徑打包 /conf/fastcgi.conf /conf/fastcgi.conf.default /conf/fastcgi_params 省略……
fpm打包時,直接打包原目錄(後面加不加/,都沒有問題),不要打包軟連接目錄!
fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx(不加/,這個軟連接表明一個文件)
打包看似成功,但查看包的內容,只是一個軟連接文件
緣由,目錄結尾的/問題,這有點相似rm刪除軟連接目錄
fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx/(加/,這個軟連接表明一個目錄)
利用backup服務器測試。
安裝rpm包的三種方法:
[root@backup tools]# rpm -ivh nginx-1.6.3-1.x86_64.rpm error: Failed dependencies: pcre-devel is needed by nginx-1.6.3-1.x86_64 openssl-devel is needed by nginx-1.6.3-1.x86_64 #<==但會報如上依賴錯誤,須要先yum安裝依賴才能安裝rpm包。 ~ 解決方法 #<==先利用yum安裝上面的兩個依賴包,再執行rpm。 yum -y pcre-devel openssl-devel
[root@backup tools]# yum localinstall nginx-1.6.3-1.x86_64.rpm -y #<==這個命令會自動先安裝rpm包的依賴,而後再安裝rpm包。
yum倉庫搭建(且下下文分解!)