定製rpm包
說明:這些操作全部在管理服務器內操作。
定製rpm包,搭建內網yum倉庫,通過kickstart批量系統安裝,這是互聯網企業運維自動化的必要技能,自動化運維的基石。
1.1 面試題
有100臺服務器想安裝系統。你有什麼方案快速部署並優化嗎?需要多少時間搞定?
1.1.1 解決方案
(1) tar打包:先編譯安裝、打包、批量分發、解包;
(2) saltstack、puppet、ansible批量部署;
(3) 定製rpm所、搭建yum倉庫、yum安裝;
(4) openstack虛擬機鏡像和docker窗口分發。
1.2 安裝軟件的方式
1.2.1 編譯安裝
r 優點
按需開啓功能
可定製(定製安裝目錄和軟件功能)、一情況下不需要網絡、可選擇軟件版本
r 缺點
需要查找並實驗出適合的編譯參數
軟件版本升級時,要注意某些參數已經取消掉了
MySQL、PHP等軟件編譯耗時過長
慢、複雜、需要查找編譯參數、找依賴麻煩、純編譯依賴比較複雜
1.2.2 yum安裝
r 優點
全自動化安裝
簡單、便捷
不需要爲依賴問題發愁了
r 缺點
自主性太差
需要網絡、網絡不好時,下載速度慢
沒有辦法定製、軟件的功能、存放位置都已經固定好了,不易變更
1.2.3 二進制安裝
r 優點:簡單、快
r 缺點:不能定製、包容量大
1.2.4 定製rpm包※
r 流程:根據需求編譯軟件==>製件rpm包==>搭建內網yum倉庫==>yum安裝
r 優點:結合編譯安裝與yum安裝兩者的優點
r 缺點 :rpm包的通用性差,只能適用於公司的環境,第一步編譯安裝複雜、打包後不能再次更改、一般人不會定製rpm包
1.3 RPM簡介
英文全稱是Red Hat Package Manager,即Red Hat包管理器。
幾乎所有的Linux發行版本都使用這種形式的軟件包管理安裝、更新和卸載軟件。
rpm命令有五種基本功能(但不包括創建軟件包):安裝、卸載、升級、查詢、驗證。
1.4 FPM打包工具
FPM的作者是jordansissel
FPM的GitHub:https://github.com/jordansissel/fpm
FPM功能簡單理解:就是將一種類型的包轉換成另一種類型。
1.4.1 支持的源類型包
dir #<==將目錄打包成所需要的類型,可以用於源碼編譯安裝的軟件包 rpm #<==對rpm進行轉換 gem #<==對rubygem包進行轉換 python #<==將python模塊打包成相應的類型
1.4.2 支持的目標類型包
rpm #<==轉換爲rpm包 deb #<==轉換爲deb包 solaris #<==轉換爲solaris包 puppet #<==轉換爲puppet模塊
1.4.3 FPM安裝
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版本的軟件
1.4.4 FPM參數
詳細使用見: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
1.5 實戰定製nginx的RPM包
1.5.1 系統環境
[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:未運行防火牆。
1.5.2 準備操作
[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
1.5.3 編譯安裝nginx
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/
1.5.4 編寫腳本
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
1.5.5 打包
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
1.6 rpm常用命令組合
~ 查看
rpm -qpi包名 #<==查看rpm包詳細信息 rpm -qpl包名 #<==查看rpm包裏面的內容 rpm -qpR包名 #<==查看rpm包的依賴 rpm -qp --scripts 包名 #<==查看rpm包帶的執行腳本,執行腳本不是以文件形式存在 rpm -qa #<==查看系統內所有已安裝的rpm包
~ 安裝
rpm -ivh包名 #<==安裝rpm包 rpm -ivh --aid 包名 #<==解決rpm包循環依賴的問題
1.6.1 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.
1.7 注意事項
1.7.1 相對路徑問題
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 省略……
1.7.2 軟鏈接問題
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/(加/,這個軟鏈接代表一個目錄)
1.8 安裝rpm包
利用backup服務器測試。
安裝rpm包的三種方法:
1.8.0.1 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
1.8.0.2 yum命令安裝rpm包
[root@backup tools]# yum localinstall nginx-1.6.3-1.x86_64.rpm -y #<==這個命令會自動先安裝rpm包的依賴,然後再安裝rpm包。
1.8.0.3 搭建內網yum倉庫※※※
yum倉庫搭建(且下下文分解!)