RPM包定製

概述

問題:當領導給你 100 臺已經安裝好系統的服務器,而後讓優化,讓你提出一個快速部署方案。
解答:
  1.tar 打包 先編譯安裝 打包--》分發--》解包(好比 mysql 打包後直接就可使用
  2.SaltStack,puppet
  3.定製 rpm yum 倉庫 yum 安裝
  4.openstack 虛擬機鏡像和 docker 容器分發
php

回顧下安裝軟件的三種方式:
  一、編譯安裝軟件,優勢是能夠定製化安裝目錄、按需開啓功能等,缺點是須要查找並實驗出適合的編譯參數,諸如MySQL之類的軟件編譯耗時過長。
  二、yum安裝軟件,優勢是全自動化安裝,不須要爲依賴問題發愁了,缺點是自主性太差,軟件的功能、存放位置都已經固定好了,不易變動。===>若是你如今還爲是使用編譯安裝軟件仍是使用yum安裝軟件發愁,那你就out了。
  三、編譯源碼,根據本身的需求作成定製RPM包–>搭建內網yum倉庫–yum安裝。結合前二者的優勢,暫未發現什麼缺點。可能的缺點就是RPM包的通用性差,只能適用於本公司的環境。另一般人不會定製RPM包。這是中大型互聯網企業運維自動化的必要技能。
html

一:YUM 安裝
  優勢:簡單,便捷,解決源碼包安裝依賴問題,全自動化安裝
  缺點:沒有辦法定製,須要網絡,網絡環境差的狀況話,下載速度慢
二:編譯安裝
  優勢:能夠定製軟件包(定製安裝目錄和軟件功能),必定狀況下不須要網絡,可自由選擇軟件版本 
  缺點:安裝過程慢,安裝複雜,須要查找編譯參數(對於一些編譯錯誤,找人求助也討人嫌),軟件編譯依賴性強
三:二進制安裝
  優勢:簡單,快捷
  缺點:不能定製,包容量大(mysql 的二進制包 200M 左右)
四:定製 rpm 包 yum 倉庫 yum 安裝
  優勢:能夠根據本身的需求編譯軟件>>製做 rpm 包>>搭建 yum 倉庫>>上傳 rpm 包到 yum倉庫>>客戶端安裝軟件  
  缺點:第一步編譯安裝複雜,打包完成之後沒法更改,通常人不會這個方法
node

 這裏也不介紹rpm的概念,想了解的朋友能夠查看http://www.ibm.com/developerworks/cn/linux/l-rpm/
python

rpmbuild 是 redhat 系統原生打包命令,這個命令的使用複雜不推薦使用此方法打包 rpm 包,太複雜啦,有想了解到的朋友能夠參考:http://dreamway.blog.51cto.com/1281816/1110874或者自行百度,咱們這裏使用一個簡單的FPM工具定製RPM包mysql

FPM的安裝與使用

主機環境:CentOS 6.5linux

FPM打包工具
  FPM的做者是jordansissel
  FPM的github:https://github.com/jordansissel/fpm
  FPM功能簡單說就是將一種類型的包轉換成另外一種類型。
nginx

1. 支持的源類型包git

dir         將目錄打包成所須要的類型,能夠用於源碼編譯安裝的軟件包
rpm         對rpm進行轉換
gem         對rubygem包進行轉換
python      將python模塊打包成相應的類型

2. 支持的目標類型包github

rpm         轉換爲rpm包
deb         轉換爲deb包
solaris     轉換爲solaris包
puppet      轉換爲puppet模塊

3. FPM參數 (使用 fpm --help 查看更多幫助)
sql

-s          指定源類型
-t          指定目標類型,即想要製做爲何包
-n          指定包的名字
-v          指定包的版本號
-C          指定打包的相對路徑  Change directory to here before searching forfiles
-d          指定依賴於哪些包
-f          第二次打包時目錄下若是有同名安裝包存在,則覆蓋它
-p          輸出的安裝包的目錄,不想放在當前目錄下就須要指定
--post-install      軟件包安裝完成以後所要運行的腳本;同--after-install
--pre-install       軟件包安裝完成以前所要運行的腳本;同--before-install
--post-uninstall    軟件包卸載完成以後所要運行的腳本;同--after-remove
--pre-uninstall     軟件包卸載完成以前所要運行的腳本;同--before-remove

 4.安裝FPM工具

fpm 是 ruby 寫的,所以系統環境須要 ruby,且 ruby 版本號大於 1.8.5。
# 安裝 ruby 模塊
yum -y install ruby ruby-devel rubygems
rpm -qa ruby rubygems ruby-devel
# 添加阿里雲的 Rubygems 倉庫,外國的源慢
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources  查看 Rubygems 倉庫信息
# 移除原生的 Ruby 倉庫
gem sources --remove http://rubygems.org/
# 安裝 fpm
gem install fpm

***在安裝ruby包時,可能沒法使用yum的方式安裝上rubygems包,只能下載rubygems的rpm包進行安裝***

下載地址:http://rpmfind.net/linux/rpm2html/search.php?query=rubygems

rpm -ivh rubygems-1.3.7-5.el6.noarch.rpm  --nodeps  //這種方式安裝會忽略runygems的依賴包,不建議使用
或者
yum -y localinstall rubygems-1.3.7-5.el6.noarch.rpm  //建議使用這種方式安裝,它會先安裝依賴包,再安裝rubygems包,須要配置yum源

安裝 fpm 打包工具時提示如下錯誤:

ERROR: Error installing fpm:
ruby-xz requires Ruby version >= 1.9.3.

 上面的提示表示您 Ruby 版本太低,須要安裝 1.9.3 的版本,解決思路只需安裝低版本的 fpm工具便可

 解決方法:

gem install json -v 1.8.3
gem install fpm -v 1.3.3
或者
gem install fpm    //先直接安裝一次,再安裝一個低版本的
gem install fpm -v 1.3.3

 案例:Nginx服務定製RPM

1. 編譯安裝Nginx服務

yum -y install pcre-devel openssl-devel            //安裝Nginx依賴包
useradd -M -s /sbin/nologin nginx            //添加Nginx運行用戶
tar zxvf nginx-1.8.1.tar.gz -C /usr/src/        //編譯安裝Nginx
cd /usr/src/nginx-1.8.1/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/        //優化Nginx程序執行路徑
nginx                //啓動Nginx服務,並驗證

2.開始定製Nginx服務的RPM包

(1)中止Nginx服務

[root@aery ~]# lsof -i :80
 COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 nginx   8439  root    6u  IPv4  38775      0t0  TCP *:http (LISTEN)
 nginx   8440 nginx    6u  IPv4  38775      0t0  TCP *:http (LISTEN)
[root@aery ~]# killall -9 nginx
[root@aery ~]# lsof -i :80

(2)編寫腳本,用來 nginx 打包完成後,安裝後自動執行的腳本

[root@aery ~]# mkdir -p /server/scripts
[root@aery ~]# vim /server/scripts/nginx.sh
 #!/bin/bash
 useradd -M -s /sbin/nologin nginx
 ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

(3)將 nginx 服務打包成 rpm 包,並指定須要安裝的依賴包

[root@aery ~]# fpm -s dir -t rpm -n nginx -v 1.8.1 -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx.sh -f /usr/local/nginx/
 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.8.1-1.x86_64.rpm"}

(4)將打包完成的 rpm 包下載下來,上傳到須要安裝的服務器上便可實現 yum 安裝,或者是上傳到 yum 倉庫中提供給 yum 客戶端安裝

安裝 RPM包的三種方法

1) rpm命令安裝

[root@aery ~]# rpm -ivh nginx-1.8.1-1.x86_64.rpm 
error: Failed dependencies:
    pcre-devel is needed by nginx-1.8.1-1.x86_64

但會報如上依賴錯誤,須要先 yum 安裝依賴才能安裝 rpm 包

2) yum命令安裝

yum -y localinstall nginx-1.8.1-1.x86_64.rpm

這個命令會自動先安裝 rpm 包的依賴,而後再安裝 rpm 包。

3)咱們能夠將打包完成的 rpm 上傳 YUM 倉庫。而後進行 yum 安裝便可

YUM倉庫搭建參考:http://www.cnblogs.com/zhichaoma/p/7581957.html

#服務端
[root@aery ~]# cp nginx-1.8.1-1.x86_64.rpm /yum_source/   //將nginx的rpm包放到yum倉庫中
[root@aery ~]# createrepo --update /yum_source/      //更新域名倉庫

#客戶端
[root@aery ~]# yum clean all            //清除 yum 之前的緩存
[root@aery ~]# yum makecache            //更新 YUM 緩存
[root@aery ~]# yum list | grep nginx        //檢查是否能夠從yum源中找到Nginx的rpm包
nginx.x86_64                           1.8.1-1                           @inside
[root@aery ~]# yum -y install nginx        //安裝Nginx
[root@aery ~]# nginx                 //啓動Nginx服務
[root@aery ~]# lsof -i :80            //檢查 Nginx服務是否啓動
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   3900  root    6u  IPv4  29101      0t0  TCP *:http (LISTEN)
nginx   3901 nginx    6u  IPv4  29101      0t0  TCP *:http (LISTEN)

最後使用客戶機驗證客戶機的服務是否能夠訪問(關閉客戶機的iptables)

對mysql數據庫進行定製RPM時的思路是,不要初始化數據庫

RPM經常使用命令組合

man rpm #查看 rpm 幫助
rpm -qpi nginx-1.6.3-1.x86_64.rpm #查看 rpm 包信息
rpm -qpl nginx-1.6.3-1.x86_64.rpm #查看 rpm 包內容
rpm -qpR nginx-1.6.3-1.x86_64.rpm #查看 rpm 包的依賴
rpm -qp --scripts nginx-1.6.3-1.x86_64.rpm #查看 rpm 包帶的執行腳本,執行腳
本以文件形式存在 rpm 包中
rpm -ivh nginx-1.6.3-1.x86_64.rpm #安裝 rpm 包
rpm -ivh --aid *.rpm #--aid 參數解決 rpm 包
循環依賴的問題,即當前目錄有全部相互依賴的 rpm 包,就能夠用這種方法。
rpm -Uvh *.rpm #若是依賴版本有更新的則自動更新
yum localinstall *.rpm #自動安裝 rpm 的依賴包
相關文章
相關標籤/搜索