定製rpm包html
搭建內網yum(yum是一個用python寫好的腳本)倉庫,經過kickstart批量安裝系統,這是互聯網企業運維自動化的必要技能,自動化運維的基石。python
面試題nginx
基礎運維部的小王交付給我100臺服務器,我想在這100臺服務器中安裝系統,其中10臺NFS存儲,20臺MySQL服務器,40臺Redis服務器,20臺Nginx+PHP服務器,10臺反向代理服務器。你有什麼方案快速部署並優化嗎?須要多少時間搞定?git
解決方案github
1.tar打包:先源碼編譯安裝、打包、批量分發、解包;面試
2.saltstack、puppet、ansible批量部署;docker
3.定製rpm包、搭建yum倉庫、yum安裝;json
4.openstack虛擬機鏡像和docker容器分發。緩存
安裝軟件的4種方式
ruby
一、編譯安裝
優勢
按需開啓功能
可定製(定製安裝目錄和軟件功能)、一狀況下不須要網絡、可選擇軟件版本
缺點
須要查找並實驗出適合的編譯參數
軟件版本升級時,要注意某些參數已經取消掉了
MySQL、PHP等軟件編譯耗時過長
慢、複雜、須要查找編譯參數、找依賴麻煩、純編譯依賴比較複雜
二、yum安裝
優勢
全自動化安裝
簡單、便捷
不再用爲依賴問題發愁了
缺點
自主性太差
須要網絡、網絡很差時,下載速度慢
沒有辦法定製、軟件的功能、存放位置都已經固定好了,不易變動
三、二進制安裝
優勢:簡單、快
缺點:不能定製、包容量大
四、定製rpm包※
流程:根據需求編譯軟件 ==> 製件rpm包 ==> 搭建內網yum倉庫 ==> yum安裝
優勢:結合編譯安裝與yum安裝二者的優勢
缺點:rpm包的通用性差,只能適用於公司的環境,第一步編譯安裝複雜、打包後不能再次更改、通常人不會定製rpm包
RPM簡介
英文全稱是Red Hat Package Manager,即Red Hat包管理器。
幾乎全部的Linux發行版本都使用這種形式的軟件包管理安裝、更新和卸載軟件。
rpm命令有五種基本功能(但不包括建立軟件包):安裝、卸載、升級、查詢、驗證
rpm -?#<==查看rpm命令的幫助
FPM打包工具
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安裝
fpm是ruby寫的,所以系統環境須要ruby,且ruby版本號大於1.8.5。
安裝ruby模塊
yum -y install ruby rubygems ruby-devel
添加(addition)阿里雲的Rubygems倉庫,外國的源慢,移除(remove)原生的Ruby倉庫
gem source -a http://mirrors.aliyun.com/rubygems/ 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這個工具升級挺頻繁,並且在每次升級後會出現各類各樣的問題。可是老版本的fpm工具可以知足咱們的須要,所以就用這個版本了。
四、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
實戰定製nginx的RPM包
系統環境
[root@m01 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@m01 ~]# uname -r 2.6.32-573.el6.x86_64 [root@m01 ~]# /etc/init.d/iptables status iptables:未運行防火牆。 [root@m01 ~]# getenforce Disabled
準備操做
mkdir -p /application/tools/#<==統一軟件包存放目錄 cd /application/tools/ wget -q http://nginx.org/download/nginx-1.6.3.tar.gz sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf#<==開啓yum緩存功能,緩存已下載的rpm包 grep keepcache /etc/yum.conf find /var/cache/yum/ -type f -name '*rpm'|xargs rm -f#<==清空本機已有yum緩存
編譯安裝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/ #<==複製全部的rpm到tmp目錄下 cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm #<==打包全部的rpm包 sz nginx_yum.tar.gz #<==下載到本地保存着 ##-------------------------------------------------------------------------------- cd /application/tools/ useradd nginx -u 888 -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 make && make install echo $? ln -s /application/nginx-1.6.3/ /application/nginx ll -d /application/nginx-1.6.3/ /application/nginx
cp命令參數
-t, --target-directory=DIRECTORY copy all SOURCE arguments into DIRECTORY
編寫腳本
mkdir /server/scripts -p cd /server/scripts/
這是安裝完rpm包要執行的腳本
cat >nginx_rpm.sh<<EOF #!/bin/bash useradd nginx -u 888 -M -s /sbin/nologin ln -s /application/nginx-1.6.3/ /application/nginx EOF
打包
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 -sh #<==查看打好的包大小 sz nginx_rpm.sh #<==備份腳本 sz nginx-1.6.3-1.x86_64.rpm #<==備份定製的nginx包
fpm命令參數詳解:
-s#<==source,指定源類型 -t#<==target,指定目標類型,即想要製做爲何包 -n#<==name,指定包的名字 -v#<==version,指定包的版本號 -d#<==depend,指定依賴於哪些包,包有多個,用逗號隔開 -f#<==force,第二次打包時目錄下若是有同名安裝包存在,則覆蓋它 --post-install#<==軟件包安裝完成以後所要運行的腳本;同--after-install --pre-install#<==軟件包安裝完成以前所要運行的腳本;同--before-install
rpm命令詳解
一、最經常使用組合
rpm -qa tree#<==查看是否已安裝tree包 rpm -ql tree#<==查看tree包分別有哪些文件 rpm -qf `which tree`#<==查看tree命令是由哪一個軟件包提供的
二、安裝
rpm -ivh包名#<==安裝rpm包 rpm -ivh --aid 包名#<==解決rpm包循環依賴的問題
-i#<==install,安裝 -v#<==顯示詳細信息(Print verbose information) -h#<==hash,顯示哈希值 --aid Add suggested packages to the transaction set(事務集)when needed.
三、查看
rpm -qpi包名#<==查看rpm包詳細信息 rpm -qpl包名#<==查看rpm包裏面的內容 rpm -qpR包名#<==查看rpm包的依賴 rpm -qp --scripts 包名#<==查看rpm包帶的執行腳本,執行腳本不是以文件形式存在 -a#<==all,全部-q#<==query,查詢 -p#<==package,包-i#<==info,信息 -l#<==list,列表-R#<==requires,依賴 -f#<==查詢文件屬於哪一個軟件包--scripts#<==顯示腳本
查看rpm包詳細信息
[root@m01 /server/scripts]# rpm -qpi nginx-1.6.3-1.x86_64.rpm Name : nginx Relocations: / Version : 1.6.3 Vendor: root@m01 Release : 1 Build Date: 2017年05月30日 星期二 13時40分25秒 Install Date: (not installed) Build Host: m01 Group : default Source RPM: nginx-1.6.3-1.src.rpm Size : 5252902 License: unknown Signature : (none) Packager : <root@m01> URL : http://example.com/no-uri-given Summary : no description given Description : no description given
查看rpm包裏面的內容
[root@m01 /server/scripts]# rpm -qpl nginx-1.6.3-1.x86_64.rpm /application/nginx-1.6.3/conf/fastcgi.conf /application/nginx-1.6.3/conf/fastcgi.conf.default /application/nginx-1.6.3/conf/fastcgi_params /application/nginx-1.6.3/conf/fastcgi_params.default /application/nginx-1.6.3/conf/koi-utf /application/nginx-1.6.3/conf/koi-win /application/nginx-1.6.3/conf/mime.types /application/nginx-1.6.3/conf/mime.types.default /application/nginx-1.6.3/conf/nginx.conf /application/nginx-1.6.3/conf/nginx.conf.default /application/nginx-1.6.3/conf/scgi_params /application/nginx-1.6.3/conf/scgi_params.default /application/nginx-1.6.3/conf/uwsgi_params /application/nginx-1.6.3/conf/uwsgi_params.default /application/nginx-1.6.3/conf/win-utf /application/nginx-1.6.3/html/50x.html /application/nginx-1.6.3/html/index.html /application/nginx-1.6.3/logs /application/nginx-1.6.3/sbin/nginx
查看rpm包的依賴
[root@m01 /server/scripts]# rpm -qpR nginx-1.6.3-1.x86_64.rpm pcre pcre-devel openssl openssl-devel /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
查看rpm包帶的執行腳本
[root@m01 /server/scripts]# rpm -qp --scripts nginx-1.6.3-1.x86_64.rpm postinstall scriptlet (using /bin/sh): #!/bin/bash useradd nginx -u 888 -M -s /sbin/nologin ln -s /application/nginx-1.6.3/ /application/nginx
注意事項
相對路徑問題
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/(加/,這個軟連接表明一個目錄)
安裝rpm包
安裝rpm包的三種方法:
一、rpm命令安裝
[root@m01 ~]# rz -y #<==先把打包好的nginx rpm包,上傳到服務器 [root@m01 ~]# 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 rpm -ivh nginx-1.6.3-1.x86_64.rpm
二、yum命令安裝rpm包
這個命令會自動先安裝rpm包的依賴,而後再安裝rpm包。
yum localinstall -y nginx-1.6.3-1.x86_64.rpm
三、搭建內網yum倉庫※※※
yum倉庫搭建(且待下文分解!)