Ansible,運維人員的好助手。

weixin_33866037發表於2018-08-28

Ansible是一款基於Linux環境開發的運維自動化工具,相較其它類似軟體,它最大的特點是無需在目標系統安裝客戶端(Agent)即可實現對其進行統一管理和操作。

在我使用了一個多月Ansible後,我感覺Ansible的確是一款搞運維工作朋友的好助手。本文將結合筆者工作中利用ansible處理的實際案例,一窺ansible的功能及其妙用。

Ansible的安裝(centos為例)

在centOS下安裝Ansible只需一條命令:

$ sudo yum install ansible

安裝過程很簡單,但如果作業系統版本較低,需要額外安裝Python2.6 或 Python2.7,注意目標客戶機上也要求安裝Python,並且版本不得低於2.5 。

Ansible預設使用ssh協議管理客戶機,我也是按照預設協議進行的配置,所以目標客戶機需要開啟ssh協議。檢查ssh是否執行的命令:

$ ps ax | grep sshd

經過以上簡單的兩步,我們就可以初試牛刀了。我將通過我在工作中遇到的需求來一步一步和大家一起探索ansible的強大功能。



運用案例

批量部署zabbix客戶端

筆者最近接到一個工作,需要監測約100臺線上伺服器的執行情況。部署方案採用zabbix來完成監控任務,因為zabbix需要部署客戶端,逐臺部署對我這樣的懶人是一個讓人崩潰的工作,於是在網上搜尋了自動化運維的知識,很多軟體可以完成我的工作任務,但我選擇了Ansible,看中的就是無需在客戶端部署。

在使用ansible前,還需要做2件事,第1件是建立目標主機列表,配置檔案的位置在/etc/ansible/hosts。

#  [test]表示組名,可以將不同型別或功能的伺服器分在不同組,例如本例中的test組和test2組

[test]

1.1.1.1

2.2.2.2

[test2]

3.3.3.3

分好組後,第2件事是使用ssh證照,實現免密碼登入。

假設安裝ansible軟體的伺服器ip是192.168.1.100,免密碼登入的伺服器ip是192.168.1.200,首先在100上執行命令:

$ ssh-keygen -t rsa -b 2048

該命令會生成2個檔案,預設存放在/root/.ssh/目錄下,名為id_rsa,id_rsa.pub。接著我們要將公匙檔案拷貝到目標機器。

$ ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.1.200

如果ssh的埠預設是22的話,也可以不用指定 -p引數,經過以上2步,我們就可以使用ssh hostIP的方式直接登入客戶機了,不再需要輸入密碼。

基本準備工作做完,可以開始做正事了。Ansible的提供的功能是模組化的,我也只是根據工作需要使用了其中很小一部分,在此只是拋磚引玉,更多的功能,需要大家一起挖掘。

為了測試ansible是否能夠正常工作,我使用了ping模組進行測試。

$ ansible test -m ping



1803203-41013f09d2d216a4.png
測試結果

我們看到ansible正常的返回了ping結果。簡單解釋一下命令的構造,test是先前在/etc/ansible/hosts裡面建的組,-m(module)表示使用ansible提供的模組,在這裡我使用了ping模組,ping模組不需要加額外的引數。

返回的結果裡面,SUCCESS表示模組執行成功,changed表示對目標機器做了配置改變,很明顯ping命令不會修改目標機器的配置。

驗證了ansible能夠正常工作,我們繼續先前的任務,部署zabbix客戶端第一步是安裝zabbix安裝源rpm包。在管理主機上(192.168.1.100)下載好rpm包。(wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm),然後需要在每臺機器上執行下列操作。

任務 1:將檔案批量複製到所有目標機

$ ansible all -m copy -a "src=/root/zabbix-release-3.4-1.el7.centos.noarch.rpm dest=/root/"

all表示對/etc/ansible/hosts下所有的機器執行操作,copy表示呼叫ansible的copy模組,,-a(Argument)表示引數,copy模組的作用是把本地指定位置的檔案拷貝到目標機,常用的引數有2個,一是src,表示拷貝源路徑,dest表示目標路徑。


1803203-84e631f94067dfce.png
拷貝結果

看到success就表示命令執行成功了,但更重要的是看changed的值是否為true,只有為true的情況下才表示拷貝操作完成,因為你在目標機上增加了一個rpm檔案,代表改變了目標機的配置。其它還有一些如檔案許可權及所有者的資訊。

大家看到ansible的威力了嗎,只需要一個命令,就可以將需要的檔案拷貝到所有目標機上。

接下來是安裝rpm包

$ ansible test -m shell -a "rpm -ivh /root/zabbix-release-3.4-1.el7.centos.noarch.rpm"

這次呼叫了shell模組,引數就是安裝rpm包的命令,也是一步完成所有目標機的安裝。

再後面的安裝步驟也是大同小異,就不再一一列舉。

順利完成監控的部署後,老闆又給了新的任務,要求給所有機器加一個計劃任務,每天17:30定期增加一條防火牆策略,在每天23:30定期刪除該策略。這個任務本身不難,麻煩的是要部署到100臺伺服器上,又該Ansible閃亮登場了。

做這個功能需要有一個判斷,首先要檢視目標機是否已經設定了策略,如果沒設定則設定,如果設定過了則跳過。這裡我們就要用到ansible提供的一個新玩意兒playbook,開個玩笑,不知道和playboy有沒有什麼關係:P

言歸正題,playbook可以在某種程度上認為是一個shell指令碼,不過它使用的的是YAML,一種標記性語言。不過我認為目前我接觸到的任務目標並不需要專門去學習它的語法格式,我們還是在實戰中總結經驗吧。

任務2:對所有目標機設定crontab策略,並在設定時檢查是否已經設定過策略,如設定過,則跳過。

#checkCrontab.yml

---

#固定格式,冒號後是自定義指令碼名稱

- name: check80 

#該策略應用到哪些組,組是在前面提過在/etc/ansible/hosts裡面定義的。

   hosts: test 

#讓ansible不去獲取目標機的常規資訊以節省指令碼檢測時間

   gather_facts: false 

#任務開始關鍵字

   tasks: 

#子任務名稱,可自定義。

   - name: getCrontab   

#呼叫ansible的shell模組,並在目的機執行冒號後的命令,命令的目的是檢視crontab裡面的任務是否有指定的策略。

      shell: crontab -l |grep '30 17 \* \* \* /sbin/iptables -A OUTPUT -p tcp --dport 80 -j DROP' | wc -l

#register是將上一條命令執行後的輸出結果存放到cronHave自定義變數中。

      register: cronHave 

//第2個子任務,在第1個子任務完成後才執行。

   - name: add when absent.    

//呼叫ansible的lineinfile模組,其作用是根據dest指定的檔案,修改文字的內容,預設是將Line冒號後的內容追加到最後一行。

      lineinfile:     

         dest: /root/mytest     

         line: '30 17 * * * /sbin/iptables -A OUTPUT -p tcp --dport 80 -j DROP'   

//when表示條件,意思只有第一個子任務的返回值是0,才執行第2個子任務。

      when: cronHave.stdout | int == 0

這就是一個用YAML標記語言寫的檔案,不要被嚇著了,整個檔案就分為2個子任務,按順序執行,第1個子任務是查詢當前crontab裡面是否已配置指定的策略,第2個子任務根據第1個子任務的結果決定是否執行。

playbook是一個很強大的武器,可以設定各種條件來執行不同的任務,我在這裡也只是拋磚引玉,畢竟自己也才接觸一個多月。寫此文的目的,一是想記錄一些自己做過後,二是願和大家交流技術、交流看法,希望能一起進步。

相關文章