新聞中心
SSH::Batch,在公有云中使用 ssh 工具箱
作者:潘家邦 2015-11-09 10:39:58
云計(jì)算 企業(yè)上云還不是把內(nèi)部應(yīng)用換個(gè)地方部署那么簡單,對(duì)企業(yè)的技術(shù)水平還是很有挑戰(zhàn)的。上云不保證系統(tǒng)質(zhì)量會(huì)因此變好,穩(wěn)定性因此而提高,甚至因?yàn)榛A(chǔ)設(shè)施變化太大,本來部署在小型機(jī)上的現(xiàn)在只能部署在虛擬機(jī)上而導(dǎo)致應(yīng)用幾乎殘廢也不是沒有。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),茫崖網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:茫崖等地區(qū)。茫崖做網(wǎng)站價(jià)格咨詢:13518219792
人吶就都不知道,自己就不可以預(yù)料。一個(gè)人的命運(yùn)啊,當(dāng)然要靠自我奮斗,但是也要考慮到歷史的行程,我絕對(duì)不知道,我作為一個(gè)服務(wù)端開發(fā)者怎么開始研究運(yùn)維去了,所以 ECS 醬同我講話,說「大家都決定了,你來負(fù)責(zé)運(yùn)維」,我說另請(qǐng)高明吧。我實(shí)在我也不是謙虛,我一個(gè)服務(wù)端開發(fā)者怎么就搞運(yùn)維了呢?但是呢,ECS 醬講「大家已經(jīng)研究決定了」,所以后來我就念了兩首詩,叫「茍利集群生死以,豈因禍福避趨之」,所以我就開始運(yùn)維。
就像之前的博文中講的那樣,我買了兩臺(tái)阿里云的 ECS,一臺(tái)在香港,一臺(tái)在新加坡。由于總所周知的網(wǎng)絡(luò)原因,從大陸 ping 這兩臺(tái)服務(wù)器的 RTT 一直都在兩三百毫秒,之前只有一臺(tái)位于香港的 ECS 的時(shí)候,我 ssh 上去部署一些服務(wù),碰上網(wǎng)絡(luò)抖動(dòng)的時(shí)候都能卡出翔,敲擊一個(gè)按鍵之后許久才出現(xiàn)在屏幕上。
如今我有了兩臺(tái)服務(wù)器,如果還像之前那樣直接用 ssh 去維護(hù)的話,簡直就是不敢想象的事情。且不說一樣的配置文件我要修改兩遍,僅僅想象一下剛剛在 A 機(jī)器卡成翔的情況下完成維護(hù),又要去 B 機(jī)器上再次被卡成翔,就會(huì)讓我懷疑人生。不要問為什么卡成翔了還不用mosh,我也不知道
其實(shí)說起來,雖然過去一年多,我做的是服務(wù)端開發(fā),但是也涉足一些簡單的運(yùn)維工作。應(yīng)用服務(wù)器從我剛?cè)肼殨r(shí)候的幾臺(tái)擴(kuò)容到幾十臺(tái)到現(xiàn)在的一百多臺(tái),一次又一次的自主發(fā)布,偶爾的手動(dòng)批量重啟、下線服務(wù)器,捕獲線程快照、內(nèi)存快照、大批量處理應(yīng)用日志,經(jīng)歷過虛擬機(jī)宕機(jī)、物理機(jī)宕機(jī),不勝枚舉……當(dāng) AppOps 的日子,其實(shí)就是不那么規(guī)范的 DevOps 的日子。
集團(tuán)的對(duì)內(nèi)運(yùn)維水平還處在 IaaS 的時(shí)代,這也給了我們開發(fā)者接觸運(yùn)維的機(jī)會(huì)。如果哪天對(duì)內(nèi)的運(yùn)維達(dá)到了 PaaS 的級(jí)別,開發(fā)者們也許就接觸不到這些東西了。PaaS 似乎有點(diǎn)遙遠(yuǎn),目前來說比較現(xiàn)實(shí)的是 CaaS,Containers-as-a-Service,要是能做到這個(gè),開發(fā)者估計(jì)也沒啥機(jī)會(huì)接觸運(yùn)維了。
在工作中,當(dāng)我需要批量地在集群中執(zhí)行命令時(shí),我會(huì)使用一個(gè)叫 pgm 的內(nèi)部腳本。這個(gè)腳本是 Python 寫的,基于 pssh,用起來很不錯(cuò),能夠并發(fā)地在集群中執(zhí)行命令。這個(gè)命令應(yīng)該是我到目前為止會(huì)用的唯一一個(gè)內(nèi)部腳本,其他的像開源的 tsar 反而不會(huì)用。
離開了公司的環(huán)境,我就沒有 pgm 用了。昨天我嘗試尋找一個(gè)能夠在集群中批量執(zhí)行 ssh 命令的工具,這樣我能夠比較輕松地管理我的 ECS 們。那時(shí)候我還不知道 pgm 是基于 pssh 實(shí)現(xiàn)的。隨便 Google 了一下 「ssh batch」,就找到一個(gè) Github repo,agentzh/sshbatch。
進(jìn)去看了一下 README,這是一個(gè)用 Perl 實(shí)現(xiàn)的工具箱,4 個(gè)命令分別實(shí)現(xiàn)如下功能:
- fornodes 計(jì)算機(jī)器列表
- atnodes 在指定機(jī)器集上執(zhí)行命令
- tonodes 把文件或目錄上傳到指定機(jī)器集
- key2nodes 把公鑰上傳到指定機(jī)器集
看起來很厲害的樣子,不過 agentzh 是誰?點(diǎn)開主頁一看,我當(dāng)時(shí)就跪了,有眼不識(shí)泰山,這不是傳說中的春哥「章亦春」么!幾個(gè)月前孤陋寡聞的我是不知道春哥的存在的,直到我出差去北京參加 Velocity,在大會(huì)上見識(shí)了王院生對(duì)的 OpenResty 的簡介[1],當(dāng)時(shí)就驚為天人。后來通過各種渠道加深了對(duì) Nginx 和 OpenResty 的學(xué)習(xí)和了解,更是對(duì)春哥頂禮膜拜。
sshbatch 的文檔寫的很詳細(xì),從安裝到使用面面俱到,因此我這里就不再贅述,雖然文檔用英文寫的。
這里主要介紹一下 sshbatch 中讓我感覺驚艷的地方。
首先是機(jī)器列表的管理方式。之前用 pgm 的時(shí)候,一個(gè)應(yīng)用分組的機(jī)器放在一個(gè)文件里面,在執(zhí)行批處理的時(shí)候指定存放機(jī)器列表的文件。fornodes 則是把機(jī)器列表看做是一個(gè)個(gè)的集合,集合與集合之間可以做交并補(bǔ)等運(yùn)算,通過集合運(yùn)算得到不同的機(jī)器列表。這靈活性簡直不能更贊。
其次是批量推送文件的 tonodes。之前用 pgm 只能批量執(zhí)行命令,我在內(nèi)網(wǎng)一直沒有找到科學(xué)的批量向服務(wù)器推送文件的腳本。tonodes 很好地滿足了我的需求。
于是我用 tonodes 和 atnodes 把我兩臺(tái) ECS 上的 Nginx 配置文件重新維護(hù)了一遍,之前是直接登錄服務(wù)器修改的,如今變成本地使用一個(gè) git repo 去維護(hù)這些配置文件,修改完成后批量推送并重啟 Nginx。
事情并沒有想象中的一帆風(fēng)順。
由于服務(wù)器位于公有云,出于安全考慮,我禁止了 root 登錄,禁止了密碼登錄,只允許公鑰登錄。于是我沒法直接把 nginx.conf 放到 /etc/nginx/ 中。因?yàn)槲覒?,不想在啟?dòng) nginx 的時(shí)候指定配置文件,于是只好把 nginx.conf 放到 /tmp/,然后再把它移動(dòng)到 /etc/nginx/ 并重啟。
- tonodes ./nginx/nginx.conf '{ecs}:/tmp/'
- atnodes 'sudo mv /tmp/nginx.conf /etc/nginx/ && sudo nginx -t && sudo service nginx restart' '{ecs}' -w
根據(jù)文檔中的描述,atnodes 加了 -w 參數(shù),會(huì)要求用戶輸入密碼,作為登錄密碼和 sudo 密碼。抱著試一試的心態(tài)執(zhí)行了一下,果然跪了。
- sshbatch git:(master) atnodes 'sudo mv /tmp/nginx.conf /etc/nginx/ && sudo nginx -t && sudo service nginx restart' '{ecs}' -w
- Password:
- Permission denied (publickey).
- ===================== server ip =====================
- ERROR: unable to establish master SSH connection: bad password or master process exited unexpectedly
唉,我都把密碼登錄禁用了,這里還強(qiáng)行要密碼登錄,不跪才怪了。從文檔中發(fā)現(xiàn)似乎把 -w 替換為 -tty 也可以實(shí)現(xiàn)遠(yuǎn)程執(zhí)行 sudo 命令,趕緊試試。結(jié)果發(fā)現(xiàn),用了 tty 倒是能輸入密碼執(zhí)行 sudo 了,但是,每臺(tái)機(jī)器都得輸入一次密碼,這是什么鬼!
目前我只有兩臺(tái)機(jī)器,輸密碼就忍了,假如哪天我有 10 臺(tái)機(jī)器了,光輸密碼就得累死。
其實(shí)這個(gè)問題在企業(yè)環(huán)境甚至私有云環(huán)境應(yīng)該都不是問題。哪個(gè)運(yùn)維會(huì)閑著蛋疼把服務(wù)器禁止密碼登錄啊!反正機(jī)器都在局域網(wǎng),IP 不暴露在公網(wǎng)就是相對(duì)安全的,只要守護(hù)好邊界出口就好。所以說在內(nèi)網(wǎng)批量執(zhí)行 sudo 命令的時(shí)候,直接用 -w 參數(shù)就好了。
問題來了,就要解決問題。最直接暴力的方案是,把我的賬號(hào)設(shè)置為 sudo 免密碼模式,很黃很暴力,我并不喜歡。第二種方法,就是修改 atnodes,支持 -w 參數(shù)輸入的密碼僅作為 sudo 密碼,不作為登錄密碼。
于是我 fork 了代碼,拉到本地做了些修改。雖然是完全沒用過的 Perl,但還是分分鐘就改好了~通過增加參數(shù) -W 來表達(dá)「passowrd for sudo only」的含義。
隨便執(zhí)行一個(gè) sudo 命令看看效果。
- sshbatch git:(master) atnodes 'sudo ls' '{ecs}' -W
- Password:
- ===================== server ip =====================
- sudo: no tty present and no askpass program specified
- Remote command returns status code 1.
居然,出錯(cuò)了……根據(jù)報(bào)錯(cuò)信息,給之前的命令追加一個(gè) -tty 參數(shù),于是我終于能在服務(wù)器上使用 sudo 了!不幸的是,開啟 tty 之后,批處理就沒法并發(fā)執(zhí)行了,只能按順序一個(gè)一個(gè)來。不過想想也是,開啟 tty 之后一般是要做一些交互操作的,而標(biāo)準(zhǔn)輸入流就只有一個(gè),所以只好一個(gè)一個(gè)來了。
- sshbatch git:(master) atnodes 'sudo ls /etc/nginx/sites-enabled/' '{ecs}' -W -tty -q
- Password:
- ===================== server ip =====================
- [sudo] password for admin:
- blog.jamespan.me blog.xuminzheng.com default hatta wekan
- ===================== server ip =====================
- [sudo] password for admin:
- blog.jamespan.me default
我把我的修改補(bǔ)充測(cè)試之后提交了 PR,希望能被春哥接收經(jīng)過春哥一番悉心教導(dǎo),經(jīng)歷 7 次修改,終于被合并到了主干~
然后我又嘗試了一下 pssh,似乎它沒法很好地應(yīng)對(duì)類似于我的機(jī)器這種禁止密碼登陸之后還要執(zhí)行 sudo 命令的場(chǎng)景。所以說啊,企業(yè)上云還不是把內(nèi)部應(yīng)用換個(gè)地方部署那么簡單,對(duì)企業(yè)的技術(shù)水平還是很有挑戰(zhàn)的。上云不保證系統(tǒng)質(zhì)量會(huì)因此變好,穩(wěn)定性因此而提高,甚至因?yàn)榛A(chǔ)設(shè)施變化太大,本來部署在小型機(jī)上的現(xiàn)在只能部署在虛擬機(jī)上而導(dǎo)致應(yīng)用幾乎殘廢也不是沒有。
最后的最后,今天我發(fā)現(xiàn)了一個(gè)叫 Ansible 的運(yùn)維工具,感覺有點(diǎn)強(qiáng)大,而且對(duì)系統(tǒng)毫無入侵,正在看文檔學(xué)習(xí)中。
Update:
春哥 Review 代碼后,我按照他的意見把 -so 修改成了 -W。
原文鏈接:http://blog.jamespan.me/2015/11/07/ops-with-ssh-batch/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
標(biāo)題名稱:SSH::Batch,在公有云中使用ssh工具箱
文章出自:http://fisionsoft.com.cn/article/cojpghe.html


咨詢
建站咨詢
