什么是Ansible?

自動化工具——ansible

 

ansibleArchitecture

ansibleArchitectureAnsible

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

(12)
HGGHGG
上一篇 2017-09-24 21:20
下一篇 2017-09-25 09:41

相關推薦

  • Nginx

        Nginx(發音同engine x)是一個 Web服務器,也可以用作反向代理,負載平衡器和 HTTP緩存。Nginx 可以部署在網絡上使用 FastCGI,腳本,SCGI 處理程序,WSGI 應用服務器或 Phusion 乘客模塊的動態 HTTP 內容,并可作為軟件負載均衡器。Nginx 使…

    Linux干貨 2017-08-29
  • PHP高效率寫法(詳解原因)

    1.盡量靜態化:    如果一個方法能被靜態,那就聲明它為靜態的,速度可提高1/4,甚至我測試的時候,這個提高了近三倍。   當然了,這個測試方法需要在十萬級以上次執行,效果才明顯。   其實靜態方法和非靜態方法的效率主要區別在內存:靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜…

    Linux干貨 2015-05-28
  • 關于文件查找和解壓縮

                     文件查找和解壓縮在文件系統上查找符合條件的文件,文件查找的工具有兩個,locate 和find文件查找分為:          &nbs…

    系統運維 2016-08-18
  • 根DNS域名解析的實現

    一、實現從根,com,rj.com 模擬互聯網的DNS架構 DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。 接下來就一起開始搭建吧 首先,我們需要計劃好實驗環境,包括實驗的步驟思路 1)實驗環境(最好是畫圖展示,能使思路清…

    2015-02-10
  • 使用CDN后,PHP如何獲取用戶的真是IP?

    在統計訪問日志參數的時候IP是一個重要的參數,所有索取客戶端的IP就至關重要。 在logformat配置中有兩個變量是獲取IP地址的: remoteaddr:客戶端IP xforwardedfor:客戶端的IP 從上面來看兩個都是客戶端IP,那這兩個變量有什么不同? 首先當你訪問某個網站,假設你中間不經過任何代理,那么webserver就會把remotead…

    Linux干貨 2015-12-21
  • Homework Week-10 CentOS啟動相關及bash腳本編程

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;   (1) 為硬盤新建兩個主分區;并為其安裝grub;   (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;   (3) 為rootfs提供…

    Linux干貨 2016-10-24

評論列表(1條)

  • 非常檸檬
    非常檸檬 2017-11-16 12:32

    通過博主介紹 充分了解了!

欧美性久久久久