自動化運維工具——ansible

前言

   我們先來了解一下近年來大多數公司遇到的運維方面的問題:
  1、硬件選型多樣化
  2、系統多版本並存
  3、目錄結構混亂
  4、運維人員水平參差不齊
  5、歷史遺留問題多
  6、同一軟件出現多個版本
  7、無法批量化操作
  8、工作效率低,故障率高
  9、項目上線操作繁瑣
  然而理想狀態是這樣的:
  1、只有少數類型的硬件,便於管理
  2、系統版本統一
  3、目錄結構規範
  4、運維工程師水平層次高
  5、無歷史包袱
  6、同一軟件只有單一版本
  7、同一類操作可自動化批量執行
  8、工作效率高,無大量重複機械化操作
  9、開發自己上線,運維比較輕鬆
  理想很豐滿,現實很骨感啊!!!!!!然而,我們還是要面對現實的,現實中我們要做些什麼來更接近與理想呢?
  1、添加監控,收集系統指標
  2、對日誌進行歸檔以及管理
  3、數據備份於恢復
  4、對計劃任務進行管理
  5、對軟件包進行部署和管理
  6、對腳本進行批量執行
  7、對文件進行批量複製和移動
  8、設置文件或者目錄對應的權限
  9、關閉和啓動服務
  10、對代碼程序進行上下線
  但是,要全部完成以上工作也是很難得呀!所以我們還是回到現實來吧!O(∩_∩)O哈哈~~~

  隨着公司的發展,現在就需要更多的服務器去支撐,然而出現了一個擺在眼前的問題——要增加那麼多臺服務,難道要我們one-by-one的去增加和配置?其實這樣也是OK的,但是呢,這是一個灰常笨的操作,然而有沒有一個快速、方便、簡單地做法呢?當然是有的啦!要不然真的要死啦!那麼這個簡單的方法是什麼呢?他就是——ansible,一個自動化的運維工具。接下來我們就來簡單地認識一下他唄?這樣我們就可以稍稍達到理想狀態啦!

ansible是什麼

  ansible是新出現的自動化運維工具,基於Python開發,集 合了衆多運維工具(puppet、chef、func、fabric)的優 點,實現了批量系統配置、批量程序部署、批量運行命令等 功能。
  ansible是基於 paramiko 開發的,並且基於模塊化工作,本 身沒有批量部署的能力。真正具有批量部署的是ansible所 運行的模塊,ansible只是提供一種框架。ansible不需要在 遠程主機上安裝client/agents,因爲它們是基於ssh來和遠 程主機通訊的。ansible目前已經已經被紅帽官方收購,是 自動化運維工具中大家認可度最高的,並且上手容易,學習 簡單。是每位運維工程師必須掌握的技能之一。
  補充一下其他的常用的自動化運維工具:

工具 用途
安裝系統 Pxe/cobbler 安裝系統
虛擬化系統 Kvm/xen/vmware 虛擬機
應用部署 Puppet/ansible/saltstack 中大型規模
命令執行 Ansible/fabric/func/shell 中小型

他到底有什麼神通廣大的呢

 1.部署簡單,只需要在主控端部署ansible 環境,被控端無需做任何操作。
 2.默認使用ssh協議對設備進行管理。
 3.有大量常規運維操作模塊,可實現絕大部分操作。
 4.配置簡單、功能強大、擴展性強。
 5.支持API及自定義模塊,可通過Python輕鬆擴展。
 6.通過playbooks來定義強大的配置、狀態管理。
 7.提供了一個操作性強的web管理界面和RESET API接口——AWX平臺。

他的架構組件

  • Ansible:Ansible核心程序。
  • HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼 、ip等。
  • Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件 中,定義主機需要調用哪些模塊來完成的功能。
  • CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管 理任務。
  • CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
  • ConnectionPlugins:連接插件,Ansible和Host通信使用
    自動化運維工具——ansible
                  ansible 架構圖

    ansible的管理方式:

      Ansible系統由控制主機對被管節點的操作方式可分爲兩類,即ad- hoc和playbook:

  • ad-hoc模式使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。
  • playbook模式是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解爲通過組合多條ad-hoc操作作的配置文件。

    ansible命令的執行過程:

     1、加載自己的配置文件 默認/etc/ansible/ansible.cfg
     2、查找對應的主機配置文件,找到要執行的主機或者組
     3、加載自己對應的模塊文件,如command
     4、通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器
     5、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
     6、給文件+x執行
     7、執行並返回結果
     8、刪除臨時py文件,sleep 0退出

    ansible的兩種安裝方式(yum安裝和pip程序安裝)

     1使用yum安裝

    yum install epel-release -y
    yum install ansible –y

     2 使用pip(python的包管理模塊)安裝

    pip install ansible
    如果沒pip,需先安裝pip.yum可直接安裝:
    yum install python-pip
    pip install ansible

    接下來它有哪些常用的命令來供我們在工作中方便使用呢

    ansible命令集

  • /usr/bin/ansible # Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行
  • /usr/bin/ansible-doc # Ansible 模塊功能查看工具
  • /usr/bin/ansible-galaxy # 下載/上傳優秀代碼或Roles模塊 的官網平臺,基於網絡的
  • /usr/bin/ansible-playbook # Ansible 定製自動化的任務集編排工具
  • /usr/bin/ansible-pull # Ansible遠程執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)
  • /usr/bin/ansible-vault # Ansible 文件加密工具
  • /usr/bin/ansible-console # Ansible基於Linux Consoble界面可與用戶交互的命令執行工具
    ansible命令格式
     ansible < host-pattern > [-f forks] [-m module_name] [-a args]
     1、Command
     命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在 所有選定的節點上執行。它不會通過shell進行處理,比如$HOME和操作如”小於”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模塊 實現這些功能)。
    action: command
     chdir # 在執行命令之前,先切換到該目錄
    [root@node3 tmp]#ansible webtest -m command -a 'chdir=/tmp/ touch 1205' 

     creates # 一個文件名,當這個文件存在,則該命令不執行,可以 用來做判斷

    [root@node3 tmp]#ansible webtest -m command -a 'creates=/tmp/1205 ls'
    172.17.254.224 | SUCCESS | rc=0 >>
    skipped, since /tmp/1205 exists
    172.17.253.210 | SUCCESS | rc=0 >>
    skipped, since /tmp/1205 exists

     executable # 切換shell來執行命令,需要使用命令的絕對路徑
     free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。
     removes # 一個文件名,這個文件不存在,則該命令不執行,與 creates相反的判斷

    [root@node3 tmp]#ansible webtest -m command -a 'removes=/tmp/1205 ls'

     2、Shell
     shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能, 例如管道等 :

    [root@ansiable ~]# ansible webtest -m shell - a ‘cat /etc/passwd |grep “root”’

     3、Copy:複製文件到遠程主機,可以改權限等
     (1)複製文件 -a “src= dest= ”
     (2)給定內容生成文件 -a "content= dest= "

    [root@ansiable ~]# ansible webtest -m copy - a ‘content=“hello\nworld” 
    dest=/tmp/test.ansible mode=666’

     相關選項如下:
      backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:  yes|no
     content:用於替代“src”,可以直接設定指定文件的值 dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目 錄,那麼該路徑也必須是個目錄
     directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
     force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如 果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
     others:所有的file模塊裏的選項都可以在這裏使用
     src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果 路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則 只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全 部複製,類似於rsync。
     4、file設置文件屬性
     創建目錄:-a “path= state=directory”
     創建鏈接文件:-a “path= src= state=link”
     刪除文件:-a “path= state=absent”
     force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立 的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟 鏈,有兩個選項:yes|no
     group:定義文件/目錄的屬組 mode:定義文件/目錄的權限
     owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑
     recurse:遞歸設置文件的屬性,只對目錄有效
     src:被鏈接的源文件路徑,只應用 於state=link的情況
     dest:被鏈接到的路徑,只應用於state=link的情況
     state:
       directory:如果目錄不存在,就創建目錄
       file:即使文件不存在,也不會被創建
       link:創建軟鏈接
       hard:創建硬鏈接
       touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在, 則更新其最後修改時間
       absent:刪除目錄、文件或者取消鏈接文件
     還有其他幾種常見命令的使用,這裏就不在一一介紹,大家有興趣的可以看一下ansible官網。

    ansible還有兩個重要的應用——playbook和roles。

    1.playbook
      playbook是ansible用於配置,部署,和管理被控節點的劇本。 通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀 態。 
      playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點 必須要完成。 也可以這麼理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在 Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及 組織計算機處理各種各樣的事情。
    playbook的核心元素:

  • Hosts:執行的遠程主機列表
  • Tasks:任務,由模塊定義的操作的列表;
  • Varniables: 內置變量或自定義變量在playbook中調用
  • Templates:模板,即使用了模板語法的文本文件;
  • Handlers:和nogity結合使用,爲條件觸發操作,滿足條件方纔執行,否則不執行;
    下面來個實例看看:
cd /etc/ansible
vim nginx.yml
- hosts: webtest
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=present

  - name: copy nginx.conf
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
    notify: reload

  - name: start service
    service: name=nginx state=started
    tags: startmysql

  handlers:
  - name: reload
    service: name=nginx state=reloaded

  其中主要由一下三個部分組成:
  hosts部分:使用hosts指示使用哪個主機或主機組來運行下面的tasks,每個playbook都必須指定hosts, hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統默認的 /etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的 時候,–list-hosts選項會顯示那些主機將會參與執行task的過程中。
  remote_user:指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也 可以使用sudo,但是用戶必須要有執行相應task的權限。
  tasks:指定遠端主機將要執行的一系列動作。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。 tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過還是建議加上去,模塊是必 須的,同時也要給予模塊相應的參數。
2.roles
  對於以上所有的方式有個弊端就是無法實現複用假設在同時 部署Web、db、ha 時或不同服務器組合不同的應用就需要寫多個 yml文件,很難實現靈活的調用。
  roles 用於層次性、結構化地組織playbook。roles 能夠根 據層次型結構自動裝載變量文件、tasks以及handlers等。要使用 roles只需要在playbook中使用include指令即可。簡單來講, roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊 (modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷 地include它們的一種機制。角色一般用於基於主機構建服務的場 景中,但也可以是用於構建守護進程等場景中。
  files/:存儲由copy或script等模塊調用的文件;
  tasks/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件需要由main.yml 進行“包含”調用;
  handlers/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件需要由 main.yml進行“包含”調用;
  vars/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件需要由 main.yml進行“包含”調用;
  templates/:存儲由template模塊調用的模板文本;
  meta/:此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的 文件需要由main.yml進行“包含”調用;
  default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;

總結

  以上就是本人對ansible工具的簡單理解,如果有什麼不正確的地方,歡迎大家指出。

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