自動化工具——ansible
ansibleArchitecture
ansibleProject
1. 什么是ansible
ansible是個什么東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。這個工具的目標有這么幾項:讓我們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)云服務管理。
所有的這幾個目標本質上來說都是在一個臺或者幾臺服務器上,執行一系列的命令而已。就像我之前有介紹過的Fabric,以及我們基于Fabric開發的自動化應用部署的工具:?Essay?。都是做了這么個事——批量的在遠程服務器上執行命令?。
那么fabric和ansible有什么差別呢?簡單來說fabric像是一個工具箱,提供了很多好用的工具,用來在Remote執行命令,而Ansible則是提供了一套簡單的流程,你要按照它的流程來做,就能輕松完成任務。這就像是庫和框架的關系一樣。
當然,它們之間也是有共同點的——都是基于?paramiko?開發的。這個paramiko是什么呢?它是一個純Python實現的ssh協議庫。因此fabric和ansible還有一個共同點就是不需要在遠程主機上安裝client/agents,因為它們是基于ssh來和遠程主機通訊的。
2. 快速安裝
上面簡單介紹了下這是個什么東西,怎么安裝呢?也很簡單,因為ansible是python開發的,因此可以這么安裝:
yum install ansible # 或者 yum install ansible
3. 配置
安裝完成之后,先來配置下配置項——.ansible.cfg。ansible執行的時候會按照以下順序查找配置項:
* ANSIBLE_CONFIG (環境變量) * ansible.cfg (當前目錄下) * .ansible.cfg (用戶家目錄下) * /etc/ansible/ansible.cfg
還有一個重要的配置是hosts的配置,所有的遠程主機需要在hosts中配置,可以分組。當然hosts也可以執行是指定。先來一個簡單的例子,在家目錄下新建一個hosts文件:
# hosts [local] 127.0.0.1
然后在終端執行:
$ ansible -i ~/hosts all -a 'who' # 結果如下: 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命令——臨時執行命令,ad-hoc是ansible里的一個概念, 在上面命令中就是 -a ,具體稍后再說。命令中的all是值hoss中的所有服務器,當然也可以通過?ansible?-i?~/hosts local?-a?'who'?這樣根據組名指定服務器。
再說到ansible.cfg的配置,默認ansible執行時會從該配置中加載hosts配置,因此可以通過修改.ansible.cfg來指定默認的hosts文件地址:
# .ansible.cfg [defaults] hostfile=/Users/the5fire/hosts
這樣下次執行,就不需要?-i?參數了。
4. Ad-Hoc
ad hoc——臨時的,在ansible中是指需要快速執行,并且不需要保存的命令。說白了就是執行簡單的命令——一條命令。對于復雜的命令后面會說playbook。
那么這個Ad-Hoc命令怎么用呢?上面已經簡單的示范了下。在ansible中還有一個Module(模塊)的概念,這個模塊可以理解為一個庫,所有的命令都需要通過模塊來執行,比如上面的那個命令:?ansible?-i?~/hosts all?-a?'who'?,其實是調用了默認的command模塊:?ansible?-i?~/hosts all?-m?command?-a?'who'?,除了command模塊還有其他很多模塊,比如你就想ping下這個服務器是不是還存在可以通過ping模塊:?ansible?-i?~/hosts all?-m?ping?。
還有幾個參數需要記錄下:
-u username # 指定ssh連接的用戶名 -f 10 # 指定并發數 --sudo [-K] # 如果需要root權限執行的話,-K參數是用來輸入root密碼的
你可以通過各種模塊來批量完成某個包的安裝,或者其他什么需要的操作。 更多模塊可以看官網文檔:?modules
關于Ad-Hoc的更多內容參考這里:?intro_adhoc
5. 簡單Playbook
上面的ad hoc是指執行一條臨時的不需要保存的命令,那么復雜的命令怎么執行呢?因此也就有了playbook這個命令:?ansible-playbook?。
playbook(劇本),顧名思義,就是需要定義一個腳本或者說配置文件,然后定義好做什么。一個簡單的playbook是這樣的,把當前用戶名輸出到whoami.rst文件中:
# playbook.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當前用戶一樣,則無需指定 tasks: - name: whoami shell: 'whoami > whoami.rst'
執行完這個命令后,你可以在local所代表的服務器的用戶目錄下發現這么個文件。說道這里,要停一下。這個配置文件是yaml格式的,因此你可能需要去了解下YAML:?wiki YAML?。
簡單解釋下上面的playbook,hosts后面根據local是從hosts中讀取的,tasks是是關鍵詞,指明了要執行哪些任務;下面的name是任務的名稱,shell是前面提到的module(模塊),單引號中是命令。
除了tasks之外,還有一個handlers的命令,handlers是在執行tasks之后服務器發生變化之后可供調用的handler,使用起來如下:
# playbook.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當前用戶一樣,則無需指定 tasks: - name: whoami copy: src=~/hosts dest=~/hosts.dest # 本地拷貝到遠端 notify: # 如果copy執行完之后~/hosts.dest文件發送了變化,則執行 - clear copy # 調用handler handlers: - name: clear copy shell: 'mv ~/hosts.dest hosts.del' # 假裝刪除
上面只是一個演示,再來一個真實的功能——在local服務器上,從git上clone下來我的blog源碼,然后創建虛擬環境,創建數據庫,最后運行:
# deploy-blog-simple.yml --- - hosts: local # hosts中指定 remote_user: the5fire # 如果和當前用戶一樣,則無需指定 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
如果你已經配置好ssh賬戶免密碼登錄之后,直接執行:?ansible-playbook?deploy-blog-simple.yml?就可以在你指定的服務器上部署,并啟動blog了。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87557
通過博主介紹 充分了解了!