Ansible

1. 什麼是ansible

ansible是個什麼東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。這個工具的目標有這麼幾項:讓我們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。

所有的這幾個目標本質上來說都是在一個臺或者幾臺服務器上,執行一系列的命令而已。——批量的在遠程服務器上執行命令 。

Ansible提供了一套簡單的流程,你要按照它的流程來做,就能輕鬆完成任務。
基於 paramiko 開發的。這個paramiko是什麼呢?它是一個純Python實現的ssh協議庫。不需要在遠程主機上安裝client/agents,因爲它是基於ssh來和遠程主機通訊的。

2. 快速安裝

因爲ansible是python開發的,因此可以這麼安裝:
sudo esay_install ansible
or
sudo pip install ansible
你也可以從github上clone最新版本,然後安裝。
另外需要注意的是,控制服務器(Master)需要安裝Python2.6/7,windows上無法使用ansible。被管理的服務器(Managed Node)需要安裝Python2.4以上的版本,如果低於2.5,需要安裝python-simplejson。

3. 配置

安裝完成之後,先來配置下配置項——.ansible.cfg。ansible執行的時候會按照以下順序查找配置項:
* ANSIBLE_CONFIG (環境變量)
* ansible.cfg (當前目錄下)
* .ansible.cfg (用戶家目錄下)
* /etc/ansible/ansible.cfg

還有一個重要的配置是hosts的配置,所有的遠程主機需要在hosts中配置,可以分組。當然hosts也可以執行時指定。先來一個簡單的例子,在家目錄下新建一個hosts文件:
[local]
127.0.0.1

4. Ad-Hoc

ad hoc——臨時執行命令,在ansible中是指需要快速執行,並且不需要保存的命令。就是執行簡單的一條命令。
對於複雜的命令用playbook。
ad hoc 和 playbook 的關係相當於 shell命令和shell腳本的關係

那麼這個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 。
參數介紹
-i 指定host文件
-m 指定模塊
-a 指定參數(一般爲需要執行的命令)
-u username # 指定ssh連接的用戶名
-f 10 # 指定併發數
–sudo [-K] # 如果需要root權限執行的話,-K參數是用來輸入root密碼的

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
簡單解釋下上面的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了。

原文地址:自動化工具——ansible中文指南
可參考以下文章:Ansible :一個配置管理和IT自動化工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章