我想很多開發(fā)的同學都經(jīng)歷過這樣的開發(fā)流程:本地修改代碼,把代碼推到測試環(huán)境,重啟測試環(huán)境需要的服務,本地看效果,改bug重復1-3,功能穩(wěn)定后上線
這個過程有什問題呢?
假設(shè)你是一個做過運維或者能力很強的人,比如我這種,本地跑測試環(huán)境,但是假如一個新人,或者對測試環(huán)境中的某些 部分不是很了解的人, 甚至需要和生產(chǎn)環(huán)境完全一樣的條件下, 本地可能就不好使了. 那么這需要一個測試服務器
首先你每次修改代碼, push ,重啟環(huán)境都需要你登陸測試環(huán)境,至少不夠自動化.然后退回本地看效果,這個過程有點浪費時間和經(jīng)理
其次是你可能有好幾個項目,他們之間可能都沒什么共通點. 你需要多個測試環(huán)境
當然你可以寫幾個腳本,為你每個測試環(huán)境寫一個東西去自動化這些,未嘗不可. 只是需要重復造很多輪子
假如為了安全有跳板機,你需要登陸跳板機才能跳到你的測試服務器,你可能要寫很復雜的expect腳本
然后是我認為最重要的:
凡是屁大點事就放個deamon的運維都是耍流氓, 就拿小屁幾臺服務器還搞神馬salt, ansible之類的事情,真是太無聊了.
這些東西幫助你做了很多事情,但是會讓你變得更懶.而且重要的是-它們寫的并不一定只符合你的需要或者就不符合你的需要. 我喜歡簡單粗暴的實現(xiàn),最近在看fabric的代碼, 作為做過op,也給salt貢獻過代碼的我,寫了這個東西: gentle, 幫助我自動化提交代碼到我的測試環(huán)境. 這個東西是我認為符合我需要,或者大部分開發(fā)同學需要的小東西,基于fabric, docopt 和yaml.
我的工作的一些特點
我負責幾個項目, 它們有以下特點
項目在不同的機房, 有完整的測試環(huán)境和相關(guān)數(shù)據(jù)
項目依賴的服務基本不同,比如有的使用了supervisor, 有的是程序fork后退出了父進程;有的使用了nginx+uwsgi,有的就是nginx+服務等.
項目之間需要的依賴應用不同,且啟動順序有區(qū)別. 這個很好理解, 啟動需要先啟動A,再啟動B,才能啟動C
項目有的需要登陸跳板機
我以前的個人的開發(fā)習慣和流程
我有一個專門的存放服務配置的目錄, 后綴是ip或者項目的名字. git版本庫, 每次更新后上傳到測試環(huán)境
我有專門的op PATH, 做了很多alias, 都是一些python或者shell的腳本,用來同步測試環(huán)境,登陸測試環(huán)境撐起服務的腳本
看起來以前用的也不錯. 但是gentle能怎么樣提高呢?
gentle的開發(fā)流程
切換到你要開發(fā)的目錄
初始化這個目錄,其實就是在當前目錄增加一個.gentle.yaml
根據(jù)你的需要配置測試環(huán)境賬號ip密碼, 想要同步的目錄, 需要重啟的服務和優(yōu)先級已經(jīng)命令
以后每次只需在這個目錄下,使用gt publish 或者更懶 gt p, 他就會幫你自動rsync然后重啟相關(guān)服務.
具體使用可以去我的github或者readthedocs.org
安裝和依賴
我已經(jīng)放到了pypi, 你可以使用pip或者easy_install
sudo pip install gentle
這樣在系統(tǒng)環(huán)境下會有一個gt命令
fabric有2個對于項目更新的函數(shù),一個是rsync_project,一個是upload_project, upload是把項目壓縮在服務器上解壓縮,實際上很浪費時間,但是rsync_project不能使用env.password,需要手動輸入一次密碼,都很不爽,我找到一個解決辦法就是sshpass, 幫助自動輸入rsync的密碼, 我也給fabric提了PR. 我的項目使用了我個人的改進版的rsync_project
如果你是ubuntu 直接:
sudo apt-get install sshpass
其他操作系統(tǒng)可以在這里下載 http://sourceforge.net/projects/sshpass/ 然后編譯
tar zxvf sshpass-1.05.tar.gz && cd sshpass-1.05 && ./configure &&
make && sudo make install
一個我的測試環(huán)境的例子, 我加注釋說明
host: 192.168.3.11 #測試服務器, 格式是user@host:port
password: dongwmspassword #登錄服務器需要的密碼
gateway: #可以不存在,中間服務器,格式是user@host:port
gatewaypassword: #中間服務器(jump跳板機)的密碼
rsync: #這個操作是rsync
lpath: $ROOT #你可以使用全路徑, $ROOT表示當前路徑,本地目錄
rpath: /opt/tornado # 測試環(huán)境的目錄
services: # 每個段落就是一個服務,這里有nginx和supervisor
nginx:
command: kill -9 `ps -ef |grep nginx|grep -v grep|awk '{print $2}'` && /opt/nginx/sbin/nginx #啟動的命令
lpath: /usr/local/etc/nginx/nginx.conf #nginx.conf的本地地址
priority: 1 #優(yōu)先級越高越先執(zhí)行
rpath: /opt/nginx/conf/nginx.conf #測試環(huán)境的nginx.conf路徑
sudo: false # 因為這個環(huán)境很寬松 不需要sudo
user: #sudo使用的用戶,默認是登陸的用戶
supervisor:
command: supervisorctl -c /etc/supervisor/supervisord.conf reload
lpath: /Users/dongwm/settings/supervisord.conf.31
priority: 2
rpath: /etc/supervisor/supervisord.conf
sudo: false
user:
username: root #登陸服務器的默認用戶, 你可以在使用host的時候指定用戶
歡迎給我issue和PR
后文:
因為很多人會用到跳板機,我想加入跳板機的用法, 看起來就像直接在本地操作遠程一樣
設(shè)置輸出是否隱藏,目前保留就是為了讓我看到執(zhí)行的過程
設(shè)置支持多測試環(huán)境一起部署,或者說讓生成環(huán)境的部署一樣方便
新聞熱點
疑難解答
圖片精選