自動化運維工具——Ansible(五)——模塊的使用

1. ansible模塊

在前文的基礎上,我們已經知道,當我們使用ansible完成實際任務時,需要依靠ansible的各個模塊,比如,我們想要去ping某主機,則需要使用ping模塊,命令如下

ansible all -m ping

前文說過,除了ping模塊,ansible還有很多模塊可供我們使用,那麼ansible都有哪些模塊呢?我們可以使用如下命令,查看ansible都有哪些模塊。

ansible-doc -l  

執行上述命令後,可以看到ansible中各個模塊的名稱,以及模塊的大概功能,當然,通過”ansible-doc -l”命令獲取到的模塊信息比較概括,並不是特別詳細,如果想要獲取到各個模塊更加詳細的用法,可以使用“ansible-doc -s”命令,比如,我們想要獲取ping模塊的詳細使用方法,則可以使用如下命令查看

ansible-doc -s ping  

在這裏插入圖片描述
即使使用“ansible-doc -s ping”命令查看ping模塊的信息,得到的信息也是比較少的,這是因爲ping模塊本來就比較簡單,而且ping模塊並沒有太多參數可用,但是並非所有模塊都像ping模塊一樣簡單,有的模塊在使用時必須使用參數,比如 fetch 模塊,見名知義,fetch爲”拿來”之意,當我們需要將受管主機中的文件拉取到ansible主機時,則可以使用此模塊,首先,我們可以使用“ansible-doc -s fetch”命令,查看一下fetch模塊的用法,如下圖所示

在這裏插入圖片描述
從幫助信息中可以看出,fetch模塊的作用就是”Fetches a file from remote nodes”,即”從受管主機中拉取文件”之意,而且fetch模塊提供了一些參數供我們使用,我們可用的參數有 dest、fail_on_missing、flat、src、validate_checksum ,如上圖所示,返回信息中註釋了每個參數的作用。

比如src參數,src參數的作用就是指定從受管主機中拉取哪個文件。

比如dest參數,dest參數的作用就是指定拉取文件到本地以後文件存放的位置。

你一定發現了,在上圖中,dest參數和src參數的註釋中都包含”(required)”字樣,這表示,在使用fetch模塊時,dest參數與src參數是必須提供的,如果在使用fetch模塊時,沒有提供這兩個參數,將會報錯,想想也對,如果我們想要從遠程主機中拉取文件,那麼我們必須告訴ansible,從哪裏拉取文件,拉取後將文件存放到哪裏吧,所以,在學習怎樣使用一個模塊時,要注意這些必選參數,那麼,我們就從fetch模塊入手,看看怎樣使用帶有參數的模塊吧~

2. fetch模塊的使用

2.1 配置主機清單

在server1中:

vim /etc/ansible/hosts 
[testA]
server2 ansible_host=172.25.1.2
server3 ansible_host=172.25.1.3

[testB]
server4 ansible_host=172.25.1.4

[test:children]
testA
testB

在這裏插入圖片描述

2.2 調用fetch模塊

假如我們想要將testA組中所有主機的/etc/fstab文件拉取到本地,則可以使用如下命令

ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"

如上述命令所示,-m選項用於調用指定的模塊,-m fetch表示調用fetch模塊,

-a選項用於傳遞模塊所需要使用的參數,-a “src=/etc/fstab dest=/testdir/ansible/”表示我們在使用fetch模塊時,爲fetch模塊傳入了兩個參數,src與dest。

那麼,我們一起來看一下上述命令的執行效果吧,如下

在這裏插入圖片描述

在這裏插入圖片描述

從返回信息可以看出,執行上述ansible命令後,主機server2和主機server3中的文件已經拉取成功,server2的fstab文件被拷貝到了本機的/testdir/ansible目錄中,而且,ansible在/testdir/ansible目錄中自動創建了目錄結構 server2/etc/,由於我們是同時從多臺受管主機中拉取相同名稱的文件,所以ansible會自動爲我們創建各個主機對應的目錄,以區分存放不同主機中的同名文件,有沒有覺得很方便,很人性化呢?

2.3 “冪等性”

之前說過,ansible具有冪等性,冪等性能夠保證我們重複的執行一項操作時,得到的結果是相同的。

“冪等性”是什麼意思呢?舉個例子,你想把一個文件拷貝到目標主機的某個目錄上,但是你不確定此目錄中是否已經存在此文件,當你使用ansible完成這項任務時,就非常簡單了,因爲如果目標主機的對應目錄中已經存在此文件,那麼ansible則不會進行任何操作,如果目標主機的對應目錄中並不存在此文件,ansible就會將文件拷貝到對應目錄中,說白了,ansible是”以結果爲導向的”,我們指定了一個”目標狀態”,ansible會自動判斷,”當前狀態”是否與”目標狀態”一致,如果一致,則不進行任何操作,如果不一致,那麼就將”當前狀態”變成”目標狀態”,這就是”冪等性”,”冪等性”可以保證我們重複的執行同一項操作時,得到的結果是一樣的。

那麼我們就來實驗一下,看看重複執行相同的ansible命令時,會得到什麼效果,效果如下圖所示

ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"

在這裏插入圖片描述

從上圖可以看出,返回信息包含”SUCCESS”字樣,證明ansible命令執行成功,不過很明顯,這次的返回信息爲”綠色”,而且這次綠色的返回信息中,”changed”字段的值爲false,而之前黃色的返回信息中,”changed”字段的值爲true。

當返回信息爲綠色時,”changed”爲false,表示ansible沒有進行任何操作,沒有”改變什麼”。

當返回信息爲黃色時,”changed”爲true,表示ansible執行了操作,”當前狀態”已經被ansible改變成了”目標狀態”。

沒錯,這就是冪等性的體現,當第一次執行上述命令時,ansible發現當前主機中並沒有我們需要的fstab文件,ansible就會按照我們指定的操作,拉取fstab文件,也就是說,ansible”改變”了”當前狀態”,將當前”沒有fstab文件的狀態”變爲了”有fstab文件的狀態”,當我們再次執行同樣的命令時,ansible發現對應文件已經存在與對應目錄中,於是ansible並沒有做出任何操作,也沒有進行任何改變,因爲”當前狀態”與我們預期的”目標狀態”一致,沒有必要再做出重複的無用功。

我們可以通過返回信息的顏色,更加精準的判斷執行命令之前的狀態是否與我們預期的一致。

2.4 文件哈希值

從返回信息中可以看到,當ansible進行fetch操作時,會對對應文件進行哈希計算,算出文件哈希值,也就是說,如果我們改變了文件中的內容,哈希值也將隨之發生改變,這個時候,即使對應目錄中存在同名的文件,ansible也會判斷出兩個文件屬於不同的文件,因爲它們的哈希值並不相同,我們來實驗一下,操作如下

echo 'hello' >> /testdir/ansible/server2/etc/fstab 
ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"

在這裏插入圖片描述

如上圖所示,我們在/testdir/ansible/test61/etc/fstab文件的尾部加入一個”hello”,以改變文件內容,然後又執行了fetch命令,我們發現,server2的返回信息爲黃色,server3主機的返回信息爲綠色,證明ansible已經做出了正確的判斷,將修改過的文件替換了,替換爲重新拉取的文件。

3. 總結

我們對上文的一些命令進行總結,方便以後回顧

列出ansible所支持的模塊

ansible-doc -l  

查看模塊的詳細幫助信息,比如查看fetch模塊的幫助

ansible-doc -s fetch  

調用模塊,比如調用ping模塊

ansible all -m ping  

調用模塊的同時傳入模塊所需要的參數,以fetch模塊爲例

ansible 10.1.1.60 -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章