在日常的開發中,經常需要把二進位制執行檔案部署到線上機上,一兩台機器可以直接打個tar.gz包,rz 或scp到線上機解壓即可,但是目標**需要部署在n多線上機時,這種做法就力不從心了,特別是目標**分布在多個資料夾下時,更是耗時耗力。我們一般的做法是打個rpm包,把它放在yum源上,ssh到線上機就可以yum install *.rpm,或者更方便地通過salt stack 之類的批量命令執行工具進行批量yum install ,真是太爽歪歪了!
但是一想到要編寫各種規則的spec檔案,就開始頭大,我y的就為了安裝乙個簡單的程式還需要去了解你這so複雜的spec規則嗎?還好最近發現了乙個叫fpm的開源軟體,可以讓我不在畏懼打包了。下面我們就說說fpm是怎麼幫助我搞定工作的。
$ yum -y install ruby rubygems ruby-devel
$ gem sources --remove
$ gem sources -a
$ gem sources -l
*** current sources ***
# 請確保只有 ruby.taobao.org,如有其它url則gem sources --remove掉
$ gem install fpm # 安裝fpm,-v是顯示安裝細節,不會一直沒反應
安裝好了就可以正式開始打包了。
-s 輸入檔案的型別,dir 表示輸入是檔案或資料夾,其他可取值gem, rpm, python等
-t fpm輸出格式型別,通常可取cpan, deb, dir, empty, gem, npm, osxpkg, pear, puppet, python, rpm, solaris, tar 等
-n 安裝包的名字
-v 安裝包的版本號
-d 安裝包所依賴的庫
-f 第二次打包時目錄下如果有同名安裝包存在,則覆蓋它
-p 輸出的安裝包的目錄,不想放在當前目錄下就需要指定
通常在安裝開源軟體時,都會通過 --prefix 的指定安裝路徑,我們以安裝tcpcopy為例來討論fpm的用法。
$ ./configure --prefix=/tmp/tcpcopy &&make && make install
3.1 安裝完後我們在/tmp/tcpcopy目錄下得到了所有的可執行檔案,把它們打成rpm包,如下:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 /tmp/tcpcopy
$ created rpm
檢視rpm包中檔案資訊
$ rpm -qpl tcpcopy-0.8.0-1.x86_64.rpm$ /tmp/tcpcopy/bin/intercept
$ /tmp/tcpcopy/tmp/tcpcopy/bin/tcpcopy
3.2 我們可以看到路徑前面多了/tmp/tcpcopy,這不是我們想要安裝的目標路徑,所有需要進行改進。如下:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 -c /tmp/tcpcopy bin # -c表示在打包前轉到/tmp/tcpcopy$ /bin/intercept
$ /bin/tcpcopy
這樣就滿足了我們的要求。
3.3 假設tcpcopy依賴乙個通用的so檔案,我們希望這個so檔案在目標機上的路徑為/usr/lib64,這樣就有了第三版fpm:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 -c /tmp/tcpcopy bin /usr/lib64/libsoftokn3.so$ /bin/intercept
$ /bin/tcpcopy
$ /usr/lib64/libsoftokn3.so
完成!本文只起個拋磚引玉的作用,更高階的應用fpm --help。
在打包過程中遇到的兩個問題:
1、gem install fpm 過程中提示需要ruby版本大於1.8.7,因為對ruby還不是很了解,只有下原始碼包安裝了。 2、
再次gem install fpm,報cannot load such file --openssl錯誤,
這是由於openssl開發包不存在,導致安裝ruby時沒安裝openssl,
安裝openssl-devel.x86_64 進入ruby原始碼目錄ext/openssl ruby extconf.rb &&make && make install。
[1]
[2]
FPM定製RPM包實踐
問題 當領導給你 100 臺已經安裝好系統的伺服器,然後讓優化,讓你提出乙個快速部署方案。解答 1.tar 打包 先編譯安裝 打包 分發 解包 比如 mysql 打包後直接就可以使用 2.saltstack,puppet,ansible 3.定製 rpm yum 倉庫 yum 安裝 4.openst...
使用FPM封裝RPM包
無意中看到一張架構圖,遷出 使用本地fpm打包,看不懂fpm是什麼高階玩意,於是有了下文。簡單的說fpm就是將一種型別的包轉換到另外一種的型別。比如我們常說的將編譯安裝的包轉換到rpm包。進一步的官方說明可參考 支援的源型別包有 rpm npm rubygem ded python dir 支援的輸...
FPM定製RPM包實踐
問題 當領導給你 100 臺已經安裝好系統的伺服器,然後讓優化,讓你提出乙個快速部署方案。解答 1.tar 打包 先編譯安裝 打包 分發 解包 比如 mysql 打包後直接就可以使用 2.saltstack,puppet,ansible 3.定製 rpm yum 倉庫 yum 安裝 4.openst...