ansible筆記(3):ansible模塊的基本使用


ansible筆記(3):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模塊的用法,如下所示

[root@node1 ~]# ansible-doc -s fetch
- name: Fetches a file from remote nodes
  fetch:
      dest:                  # (required) A directory to save the file into. For example, if the `dest' directory is `/backup' a `src' file named `/etc/profile' on host
                               `host.example.com', would be saved into `/backup/host.example.com/etc/profile'
      fail_on_missing:       # When set to 'yes', the task will fail if the remote file cannot be read for any reason.  Prior to Ansible-2.5, setting this would only fail if
                               the source file was missing. The default was changed to "yes" in Ansible-2.5.
      flat:                  # Allows you to override the default behavior of appending hostname/path/to/file to the destination.  If dest ends with '/', it will use the
                               basename of the source file, similar to the copy module. Obviously this is only handy if the filenames are unique.
      src:                   # (required) The file on the remote system to fetch. This `must' be a file, not a directory. Recursive fetching may be supported in a later
                               release.
      validate_checksum:     # Verify that the source and destination checksums match after the files are fetched.

從幫助信息中可以看出,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模塊入手,看看怎樣使用帶有參數的模塊吧~


在開始之前,先來看一下我們的主機清單配置,配置如下

[testA]
test211 ansible_host=10.11.0.211
test212 ansible_host=10.11.0.212

[testB]
test215 ansible_host=10.11.0.215

[test:children]
testA
testB

假如我們想要將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。

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

[root@node1 ~]# ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"
test211 | SUCCESS => {
    "changed": true, 
    "checksum": "a16ede4fdd8bee1d3d7dd17ba215c2c7b02f73c2", 
    "dest": "/testdir/ansible/test211/etc/fstab", 
    "md5sum": "986ef4903bc024ce02128a26bb215754", 
    "remote_checksum": "a16ede4fdd8bee1d3d7dd17ba215c2c7b02f73c2", 
    "remote_md5sum": null
}
test212 | SUCCESS => {
    "changed": true, 
    "checksum": "0d74405ea72d877d5bece3d8ff53bf22d5c7fd21", 
    "dest": "/testdir/ansible/test212/etc/fstab", 
    "md5sum": "a16411efa0a2e753f3e0e8124530d1ea", 
    "remote_checksum": "0d74405ea72d877d5bece3d8ff53bf22d5c7fd21", 
    "remote_md5sum": null
}
從命令的執行結果可以看出,上述命令執行成功了,因為兩個主機對應的返回信息都返回了"SUCCESS"字樣。

你可能會有疑問,為什么命令執行成功了,返回的信息卻是"黃色"的,在我們的印象中,執行成功,返回的信息不應該是"綠色"的嗎?這是為什么呢?此處我們暫且不討論這個話題,后面我們再行解釋。

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


之前說過,ansible具有冪等性,冪等性能夠保證我們重復的執行一項操作時,得到的結果是相同的,我們再來回顧一下冪等性的概念。

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

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

[root@node1 ansible]# ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"
test211 | SUCCESS => {
    "changed": false, 
    "checksum": "a16ede4fdd8bee1d3d7dd17ba215c2c7b02f73c2", 
    "dest": "/testdir/ansible/test211/etc/fstab", 
    "file": "/etc/fstab", 
    "md5sum": "986ef4903bc024ce02128a26bb215754"
}
test212 | SUCCESS => {
    "changed": false, 
    "checksum": "0d74405ea72d877d5bece3d8ff53bf22d5c7fd21", 
    "dest": "/testdir/ansible/test212/etc/fstab", 
    "file": "/etc/fstab", 
    "md5sum": "a16411efa0a2e753f3e0e8124530d1ea"
}

從上圖可以看出,返回信息仍然包含"SUCCESS"字樣,證明ansible命令執行成功,不過很明顯,這次的返回信息為"綠色",而且細心如你一定發現了,這次綠色的返回信息中,"changed"字段的值為false,而之前黃色的返回信息中,"changed"字段的值為true。

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

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

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

看到這里,你應該已經明白,為什么執行ansible命令時,會返回黃色的成功信息或者綠色的成功信息了吧?我們可以通過返回信息的顏色,更加精准的判斷執行命令之前的狀態是否與我們預期的一致。


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

[root@node1 ansible]# echo ' ' >> /testdir/ansible/test212/etc/fstab 
[root@node1 ansible]# ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"
test211 | SUCCESS => {
    "changed": false, 
    "checksum": "a16ede4fdd8bee1d3d7dd17ba215c2c7b02f73c2", 
    "dest": "/testdir/ansible/test211/etc/fstab", 
    "file": "/etc/fstab", 
    "md5sum": "986ef4903bc024ce02128a26bb215754"
}
test212 | SUCCESS => {
    "changed": true, 
    "checksum": "0d74405ea72d877d5bece3d8ff53bf22d5c7fd21", 
    "dest": "/testdir/ansible/test212/etc/fstab", 
    "md5sum": "a16411efa0a2e753f3e0e8124530d1ea", 
    "remote_checksum": "0d74405ea72d877d5bece3d8ff53bf22d5c7fd21", 
    "remote_md5sum": null
}


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

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


列出ansible所支持的模塊

ansible-doc -l

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

ansible-doc -s fetch

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

ansible all -m ping

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM