這兩天花了點(diǎn)時(shí)間看了下ansible的文檔,,也稍稍體驗(yàn)了下,,因?yàn)槭侨⑽牡奈臋n,看起來有些慢,,因此想著把常用的東西寫篇文章提煉下,,這樣以后也就方便查閱,同時(shí)也方便那些想快速使用ansible的人,,能夠快速的上手,。于是有了這篇文章,命名為“ansible使用指南”,。有點(diǎn)標(biāo)題黨,,有遺漏的地方歡迎補(bǔ)充^_^ 1. 什么是ansibleansible是個(gè)什么東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具,。這個(gè)工具的目標(biāo)有這么幾項(xiàng):讓我們自動化部署APP,;自動化管理配置項(xiàng);自動化的持續(xù)交付,;自動化的(AWS)云服務(wù)管理,。 所有的這幾個(gè)目標(biāo)本質(zhì)上來說都是在一個(gè)臺或者幾臺服務(wù)器上,執(zhí)行一系列的命令而已,。就像我之前有介紹過的Fabric,,以及我們基于Fabric開發(fā)的自動化應(yīng)用部署的工具: Essay 。都是做了這么個(gè)事——批量的在遠(yuǎn)程服務(wù)器上執(zhí)行命令 ,。 那么fabric和ansible有什么差別呢,?簡單來說fabric像是一個(gè)工具箱,提供了很多好用的工具,,用來在Remote執(zhí)行命令,,而Ansible則是提供了一套簡單的流程,你要按照它的流程來做,,就能輕松完成任務(wù),。這就像是庫和框架的關(guān)系一樣。 當(dāng)然,,它們之間也是有共同點(diǎn)的——都是基于 paramiko 開發(fā)的,。這個(gè)paramiko是什么呢?它是一個(gè)純Python實(shí)現(xiàn)的ssh協(xié)議庫,。因此fabric和ansible還有一個(gè)共同點(diǎn)就是不需要在遠(yuǎn)程主機(jī)上安裝client/agents,,因?yàn)樗鼈兪腔趕sh來和遠(yuǎn)程主機(jī)通訊的。 2. 快速安裝上面簡單介紹了下這是個(gè)什么東西,,怎么安裝呢,?也很簡單,因?yàn)閍nsible是python開發(fā)的,因此可以這么安裝: sudo esay_install ansible # 或者 sudo pip install ansible 你也可以從github上clone最新版本,,然后安裝,。 另外需要注意的是,控制服務(wù)器(Master)需要安裝Python2.6/7,,windows上無法使用ansible。被管理的服務(wù)器(Managed Node)需要安裝Python2.4以上的版本,,如果低于2.5,,需要安裝python-simplejson。 3. 配置安裝完成之后,,先來配置下配置項(xiàng)——.ansible.cfg,。ansible執(zhí)行的時(shí)候會按照以下順序查找配置項(xiàng): * ANSIBLE_CONFIG (環(huán)境變量) * ansible.cfg (當(dāng)前目錄下) * .ansible.cfg (用戶家目錄下) * /etc/ansible/ansible.cfg 還有一個(gè)重要的配置是hosts的配置,所有的遠(yuǎn)程主機(jī)需要在hosts中配置,,可以分組,。當(dāng)然hosts也可以執(zhí)行是指定。先來一個(gè)簡單的例子,,在家目錄下新建一個(gè)hosts文件: # hosts [local] 127.0.0.1 然后在終端執(zhí)行: $ ansible -i ~/hosts all -a 'who' # 結(jié)果如下: 127.0.0.1 | success | rc=0 >> Guest console Feb 1 16:29 the5fire console Jan 20 19:50 the5fire ttys018 Feb 22 15:35 (localhost) 這是一條ad-hoc命令——臨時(shí)執(zhí)行命令,,ad-hoc是ansible里的一個(gè)概念, 在上面命令中就是 -a ,具體稍后再說,。命令中的all是值hoss中的所有服務(wù)器,,當(dāng)然也可以通過 ansible -i ~/hosts local -a 'who' 這樣根據(jù)組名指定服務(wù)器。 再說到ansible.cfg的配置,,默認(rèn)ansible執(zhí)行時(shí)會從該配置中加載hosts配置,,因此可以通過修改.ansible.cfg來指定默認(rèn)的hosts文件地址: # .ansible.cfg [defaults] hostfile=/Users/the5fire/hosts 這樣下次執(zhí)行,就不需要 -i 參數(shù)了,。 4. Ad-Hocad hoc——臨時(shí)的,,在ansible中是指需要快速執(zhí)行,并且不需要保存的命令,。說白了就是執(zhí)行簡單的命令——一條命令,。對于復(fù)雜的命令后面會說playbook。 那么這個(gè)Ad-Hoc命令怎么用呢,?上面已經(jīng)簡單的示范了下,。在ansible中還有一個(gè)Module(模塊)的概念,這個(gè)模塊可以理解為一個(gè)庫,,所有的命令都需要通過模塊來執(zhí)行,,比如上面的那個(gè)命令: ansible -i ~/hosts all -a 'who' ,其實(shí)是調(diào)用了默認(rèn)的command模塊: ansible -i ~/hosts all -m command -a 'who' ,除了command模塊還有其他很多模塊,,比如你就想ping下這個(gè)服務(wù)器是不是還存在可以通過ping模塊: ansible -i ~/hosts all -m ping ,。 還有幾個(gè)參數(shù)需要記錄下: -u username # 指定ssh連接的用戶名 -f 10 # 指定并發(fā)數(shù) --sudo [-K] # 如果需要root權(quán)限執(zhí)行的話,-K參數(shù)是用來輸入root密碼的 你可以通過各種模塊來批量完成某個(gè)包的安裝,,或者其他什么需要的操作,。 更多模塊可以看官網(wǎng)文檔: modules 關(guān)于Ad-Hoc的更多內(nèi)容參考這里: intro_adhoc 5. 簡單Playbook上面的ad hoc是指執(zhí)行一條臨時(shí)的不需要保存的命令,,那么復(fù)雜的命令怎么執(zhí)行呢?因此也就有了playbook這個(gè)命令: ansible-playbook ,。 playbook(劇本),,顧名思義,就是需要定義一個(gè)腳本或者說配置文件,,然后定義好做什么,。一個(gè)簡單的playbook是這樣的,把當(dāng)前用戶名輸出到whoami.rst文件中: # playbook.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當(dāng)前用戶一樣,,則無需指定 tasks: - name: whoami shell: 'whoami > whoami.rst' 執(zhí)行完這個(gè)命令后,,你可以在local所代表的服務(wù)器的用戶目錄下發(fā)現(xiàn)這么個(gè)文件。說道這里,,要停一下,。這個(gè)配置文件是yaml格式的,因此你可能需要去了解下YAML: wiki YAML ,。 簡單解釋下上面的playbook,,hosts后面根據(jù)local是從hosts中讀取的,tasks是是關(guān)鍵詞,,指明了要執(zhí)行哪些任務(wù),;下面的name是任務(wù)的名稱,shell是前面提到的module(模塊),,單引號中是命令,。 除了tasks之外,還有一個(gè)handlers的命令,,handlers是在執(zhí)行tasks之后服務(wù)器發(fā)生變化之后可供調(diào)用的handler,,使用起來如下: # playbook.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當(dāng)前用戶一樣,則無需指定 tasks: - name: whoami copy: src=~/hosts dest=~/hosts.dest # 本地拷貝到遠(yuǎn)端 notify: # 如果copy執(zhí)行完之后~/hosts.dest文件發(fā)送了變化,,則執(zhí)行 - clear copy # 調(diào)用handler handlers: - name: clear copy shell: 'mv ~/hosts.dest hosts.del' # 假裝刪除 上面只是一個(gè)演示,,再來一個(gè)真實(shí)的功能——在local服務(wù)器上,從git上clone下來我的blog源碼,,然后創(chuàng)建虛擬環(huán)境,,創(chuàng)建數(shù)據(jù)庫,最后運(yùn)行: # deploy-blog-simple.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當(dāng)前用戶一樣,,則無需指定 tasks: - name: check out django_blog git: dest=~/demos/django_selfblog repo=https://github.com/the5fire/django_selfblog update=yes - name: make virtualenv shell: 'virtualenv ~/demos' - name: install requirements pip: requirements=~/demos/django_selfblog/requirements.txt virtualenv=~/demos - name: init database shell: . ./bin/activate && cd django_selfblog/selfblog && ./init_database.sh chdir=~/demos - name: run manage.py shell: . ./bin/activate && cd django_selfblog/selfblog && ./run.sh chdir=~/demos 如果你已經(jīng)配置好ssh賬戶免密碼登錄之后,,直接執(zhí)行: ansible-playbook deploy-blog-simple.yml 就可以在你指定的服務(wù)器上部署,并啟動blog了,。 好了,,關(guān)于ansible的使用,到這里應(yīng)該先告一段落了,后面還有一些稍微復(fù)雜點(diǎn)的概念:role和include,。以后有時(shí)間再補(bǔ)充一個(gè)續(xù),。 在寫最后一個(gè)playbook的時(shí)候,為了最后能正常啟動blog程序,,花了小半天時(shí)間把a(bǔ)nsible的代碼看了下,,下一篇來分享下ansbile里面的一些原理性的東西。
----EOF-----
微信分享/掃碼閱讀 |
|