1. 程式人生 > >Ansible 常用模組詳解(3)

Ansible 常用模組詳解(3)

Ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能,ansible是基於模組工作的,本身沒有批量部署的能力,真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架.

經過前面的介紹,我們已經熟悉了 Ansible 的一些常識性的東西和如何編譯安裝Ansible,從本章開始我們將全面介紹 Ansible 的各種生產常用模組,這些也是我們使用 Ansible 的過程中必須掌握的重點,本章將介紹和使用 Ansible 中經常使用的一些模組,大體模組分為: 檔案操作類,命令執行類,系統管理類,等使我們能對 Ansible 有一個全面的瞭解.

命令執行模組

◆Command◆

Command模組是Ansible的預設呼叫模組,它可以幫助我們在遠端主機上執行任意命令,但是需要注意的是,使用Command模組執行命令時,如果需要執行的命令是單一的命令那沒什麼,但如要需要使用含有管道符,重定向,等特殊字元,這些符號我們的Command是不能識別出來的,當你需要使用管道符的時候應該考慮shell模組來實現,如果遠端節點是 windows 系統,則需要使用 win_command 模組.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
free_form 必要引數,預設會使用,無需手動新增
chdir 指定一個目錄,在執行命令前首先會切換到指定目錄中去
creates 當指定的檔案存在時,就不執行對應命令,起到判斷的作用
removes 與creates引數相反,當指定的檔案不存在時,就不執行對應命令

首先通過root使用者執行一條ls命令,ls預設會打印出/root/家目錄下的檔案,這是因為ansible預設的執行路徑就是自己的家目錄.

[[email protected] ~]# ansible all -m command -a "ls"

192.168.10.20 | SUCCESS | rc=0 >>

接下來我們通過chdir選項改變一下工作目錄的位置,並再次ls查詢一下,你會發現目錄變化了,chdir 引數在執行命令前,會先進入到指定的目錄中然後執行後續的命令.

[[email protected] ~]# ansible all -m command -a "chdir=/boot ls"

192.168.10.20 | SUCCESS | rc=0 >>
config-3.10.0-862.el7.x86_64
efi
grub2
initramfs-3.10.0-862.el7.x86_64.img
symvers-3.10.0-862.el7.x86_64.gz
vmlinuz-3.10.0-862.el7.x86_64

接下來看一下下面的兩個引數,creates引數當/root目錄不存在則執行echo,而removes則是當檔案存在則執行,兩個可以形成鮮明的對比啊.

[[email protected] ~]# ansible all -m command -a 'creates=/root echo "check ok"'

192.168.10.20 | SUCCESS | rc=0 >>
skipped, since /root exists

[[email protected] ~]# ansible all -m command -a 'removes=/root echo "check ok"'

192.168.10.20 | SUCCESS | rc=0 >>
check ok

◆Shell◆

shell 模組可以幫助我們在遠端主機上執行命令,它與 command 模組不同之處是 shell 模組在遠端主機中執行命令時,會執行遠端主機上的 /bin/sh 程式處理,也就是說它不是直接執行命令,而是交給了bash來託管執行,這樣一來我們的管道符也就被支援了,筆者還是常用shell這個模組的,因為方便.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
free_form 必要引數,預設會使用,無需手動新增
chdir 指定一個目錄,在執行命令前首先會切換到指定目錄中去
creates 當指定的檔案存在時,就不執行對應命令,起到判斷的作用
removes 與creates引數相反,當指定的檔案不存在時,就不執行對應命令
executable 預設系統會使用bash這個shell執行,如果要切換shell則使用這個選項

shell 模組中 chdir、creates、removes引數的作用與 command 模組中的作用都是相同的,這裡為了節約篇幅只舉一個小例子,改變一下它的預設路徑.

[[email protected] ~]# ansible all -m shell -a "chdir=/boot ls"

192.168.10.20 | SUCCESS | rc=0 >>
config-3.10.0-862.el7.x86_64
efi
grub2
initramfs-3.10.0-862.el7.x86_64.img
symvers-3.10.0-862.el7.x86_64.gz
vmlinuz-3.10.0-862.el7.x86_64

緊接著我們看一下executable這個引數來指定一個預設shell,由於這裡沒有其他shell我們就用bash來演示一下吧.

[[email protected] ~]# ansible all -m shell -a "executable=/bin/bash uname -r"

192.168.10.20 | SUCCESS | rc=0 >>
3.10.0-862.el7.x86_64

[[email protected] ~]# ansible all -m shell -a "executable=/bin/bash uname -r" -o

192.168.10.20 | SUCCESS | rc=0 | (stdout) 3.10.0-862.el7.x86_64

◆Script◆

script 模組可以幫助我們在遠端主機上執行我們編寫的管理主機的指令碼,也就是說,指令碼一直存在於你的管理主機本地,無需手動拷貝到遠端主機,你當然也可以使用copy模組將你的指令碼拷貝到遠端主機,然後執行/bin/bash呼叫指令碼執行,但是這樣就太麻煩了,幸好Ansible為我們提供了script管理模組.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
free_form 必要引數,預設會使用,無需手動新增
chdir 指定一個目錄,在執行命令前首先會切換到指定目錄中去
creates 當指定的檔案存在時,就不執行對應命令,起到判斷的作用
removes 與creates引數相反,當指定的檔案不存在時,就不執行對應命令

我們來編寫一個列印系統日期的指令碼,然後在使用script模組執行,看一下遠端主機的執行情況,這裡需要注意的是/root/data.sh是本地路徑下指令碼的儲存位置.

[[email protected] ~]# cat data.sh 
#!/bin/bash

date

[[email protected] ~]# ansible all -m script -a "/root/data.sh"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.10.20 closed.\r\n", 
    "stdout": "Tue Dec  4 14:11:34 EST 2018\r\n", 
    "stdout_lines": [
        "Tue Dec  4 14:11:34 EST 2018"
    ]
}

接下來,我們通過使用creates關鍵字,先判斷/etc/passwd是否存在,如果存在則不執行data.sh這個指令碼,否則執行.

[[email protected] ~]# ansible all -m script -a "creates=/etc/passwd /root/data.sh"
192.168.10.20 | SKIPPED

[[email protected] ~]# ansible all -m script -a "removes=/etc/passwd /root/data.sh"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.10.20 closed.\r\n", 
    "stdout": "Tue Dec  4 14:15:13 EST 2018\r\n", 
    "stdout_lines": [
        "Tue Dec  4 14:15:13 EST 2018"
    ]
}


檔案管理模組

◆File◆

file 模組可以幫助我們完成一些對檔案的基本操作,比如,建立檔案或目錄、刪除檔案或目錄、修改檔案許可權、修以及軟硬連結的建立,檔案操作File在實際環境中應用還是很廣泛的.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
path 必選引數,用於指定檔案或者目錄的路徑,使用dest或name也可以
state 用於指定一個檔案的狀態,比如state=directory代表針對目錄操作
src 被連結原始檔路徑/只應用於state=link,只用於軟連線或硬連結
dest 被連結到的路徑/只應用於state=link,只用於軟連線或硬連結
force 強制建立軟連線/本選項只有兩個屬性 yes或no
owner 指定檔案/目錄的屬主,也就是所有者
group 指定檔案/目錄的屬組,也就是所屬組
mode 指定檔案/目錄的許可權,也就是chmod設定的許可權
recurse 遞迴設定目錄的屬性,相當於chmod -R操作
directory 檔案狀態:如果目錄不存在則建立
file 檔案狀態:即使目錄不存在也不建立
link 檔案狀態:建立軟連結選項
hard 檔案狀態:建立硬連結選項
touch 檔案狀態:檔案不存在則建立
absent 檔案狀態:刪除或取消一個連結

1.通過命令給遠端主機建立一個名為lyshark.log檔案,如果/tmp/lyshark.log檔案已存在則更新時間戳,否則建立這個檔案.

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark.log state=touch"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/lyshark.log", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

2.在遠端主機建立一個名為lyshark的目錄,如果/tmp/lyshark這個目錄存在,則不進行任何操作.

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark state=directory"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/lyshark", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

3.在遠端主機給/bin/bash命令,建立一個名為lyshark.link的軟連結,檔案存在則不進行任何操作.

[[email protected] ~]# ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.link state=link"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/lyshark.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 9, 
    "src": "/bin/bash", 
    "state": "link", 
    "uid": 0
}

3.在遠端主機給/bin/bash命令,建立一個名為lyshark.hard的硬連結,檔案存在則不進行任何操作.

[[email protected] ~]# ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.hard state=hard"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/lyshark.hard", 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "secontext": "system_u:object_r:shell_exec_t:s0", 
    "size": 964544, 
    "src": "/bin/bash", 
    "state": "hard", 
    "uid": 0
}

4.在遠端主機給/bin/bash命令,建立一個名為lyshark.hard的硬連結,若檔案存在則強制覆蓋一遍.

[[email protected] ~]# ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.hard state=hard force=yes"

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "dest": "/tmp/lyshark.hard", 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "secontext": "system_u:object_r:shell_exec_t:s0", 
    "size": 964544, 
    "src": "/bin/bash", 
    "state": "hard", 
    "uid": 0
}

5.通過state=absent關鍵字,刪除遠端機器上的指定檔案或目錄,這裡我們刪除上面的/tmp/lyshark.hard這個硬連結.

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark.hard state=absent"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "path": "/tmp/lyshark.hard", 
    "state": "absent"
}

6.在建立檔案或目錄的時候指定屬主與屬組,或直接修改遠端主機上的檔案或目錄的屬主與屬組.

[[email protected] ~]# ansible all -m shell -a "rm -fr /tmp/*" -o      #清空演示目錄
192.168.10.20 | SUCCESS | rc=0 | (stdout) 

[[email protected] ~]# ansible all -m shell -a "useradd admin"         #建立一個使用者與組
192.168.10.20 | SUCCESS | rc=0 >>

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark state=directory owner=root group=admin"

192.168.10.20 | SUCCESS => {                                        #建立/tmp/lyshark目錄
    "changed": true, 
    "gid": 1001, 
    "group": "admin",                                               #指定屬組為admin
    "mode": "0755", 
    "owner": "root",                                                #指定屬主為root
    "path": "/tmp/lyshark", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark mode=777"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "gid": 1001, 
    "group": "admin", 
    "mode": "0777",                                                  #修改目錄許可權為777
    "owner": "root", 
    "path": "/tmp/lyshark", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

7.當操作遠端主機中的目錄時,同時遞迴的將/tmp/lyshark目錄中的檔案的屬主屬組都設定為admin.

[[email protected] ~]# ansible all -m file -a "path=/tmp/lyshark state=directory owner=admin group=admin mode=777 recurse=yes"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "gid": 1001, 
    "group": "admin", 
    "mode": "0777", 
    "owner": "admin", 
    "path": "/tmp/lyshark", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 1001
}

◆Copy◆

檔案的複製也是最常用的功能之一,在Ansible中我們可以使用copy模組本模組的作用就是拷貝檔案它與fetch模組類似,不過fetch模組是從遠端主機中拉取檔案到 ansible 管理主機,而 copy 模組是將 ansible 管理主機上的檔案拷貝到遠端主機中,檔案的變化是通過MD5值來判斷的.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
src 用於指定本地檔案的儲存位置,也就是ansible管理主機的檔案位置
dest 指定檔案將被拷貝到遠端主機的哪個目錄中,此選項必選
content 用於替代src引數使用,可以直接設定指定檔案的值
force 遠端主機檔案存在強制拷貝,預設兩個選項yes/no
backup 在覆蓋前是否備份,此引數有兩個選項yes/no
owner 在拷貝到遠端主機以後,設定屬主,遠端主機上必須有對應的使用者
group 在拷貝到遠端主機以後,設定屬組,遠端主機上必須有對應的使用者
mode 在拷貝到遠端主機以後,設定檔案的許可權資訊
others 所有的file模組裡的選項都可以在這裡使用
directory_mode 遞迴設定目錄的許可權,預設為系統預設許可權

1.將 ansible 管理主機中 /etc/passwd 檔案複製到遠端主機的 /tmp 目錄下.

[[email protected] ~]# ansible all -m copy -a "src=/etc/passwd dest=/tmp"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "checksum": "368beabb02de303b193dbdc9c10daf8b6a3a8220", 
    "dest": "/tmp/passwd", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "c4bb3905d05e0e1ebe4582afbd993c62", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 898, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543954320.59-199213984528293/source", 
    "state": "file", 
    "uid": 0
}

#注:如果執行失敗,請在被控機上安裝 yum install libselinux-python -y

2.通過使用content指定文字資料,覆蓋寫入遠端/tmp/passwd檔案裡,注意這裡只能是目錄.

[[email protected] ~]# ansible all -m copy -a 'content="www.mkdirs.com\nby:LyShark\n" dest=/tmp/passwd'

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "checksum": "de467565daf9f6c33a94b646df0e8c30776a565b", 
    "dest": "/tmp/passwd", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "919b8b7a326ade5b2b12aba512234488", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 26, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543954542.01-120613474339806/source", 
    "state": "file", 
    "uid": 0
}

[[email protected] tmp]# cat passwd      ←遠端主機檔案內容已被更改.
www.mkdirs.com
by:LyShark

3.將ansible主機上的/etc/shadow檔案拷貝到遠端主機的/tmp/目錄下,並指定檔案的屬組等資訊,需要注意,遠端主機上必須存在對應的組.

[[email protected] ~]# ansible all -m copy -a 'src=/etc/shadow dest=/tmp/shadow owner=admin group=admin mode=777'

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "checksum": "a343f7209f0243ff02c9ec9c7ede5d8470858de4", 
    "dest": "/tmp/shadow", 
    "gid": 1001, 
    "group": "admin", 
    "md5sum": "0ebfc482fbc77f326f46a97936b69a10", 
    "mode": "0777", 
    "owner": "admin", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 714, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543954764.54-185568488946158/source", 
    "state": "file", 
    "uid": 1001
}

4.將遠端主機/bin/bash檔案通過feth模組,拉取到本地/root目錄下.

[[email protected]ost ~]# ansible all -m fetch -a "src=/bin/bash dest=/root"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "checksum": "d4bd3ab2983b6cc0ecfe4391365924841f254b1d", 
    "dest": "/root/192.168.10.20/bin/bash", 
    "md5sum": "9127a3b202f7ad0cf4558d93ebb655ae", 
    "remote_checksum": "d4bd3ab2983b6cc0ecfe4391365924841f254b1d", 
    "remote_md5sum": null
}


◆Find◆

find命令用來在指定目錄下查詢檔案,任何位於引數之前的字串都將被視為欲查詢的目錄名,如果使用該命令時,不設定任何引數,則find命令將在當前目錄下查詢子目錄與檔案,並且將查詢到的子目錄和檔案全部進行顯示,下面的find 模組也可以幫助我們在被管理主機中查詢符合條件的檔案,就像 find 命令一樣.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
paths 指定在哪個目錄中查詢檔案,可以指定多個路徑用逗號隔開
recurse 是否為遞迴子目錄查詢檔案,引數有兩個選項yes/no
hidden 是否查詢隱藏檔案,當hidden=yes才會查詢隱藏檔案
file_type 指定查詢檔案的型別,可指定any、directory、file、link 四種
patterns 指定需要查詢檔案的名稱,想要使用python正則去匹配檔案需要使用use_regex=yes
use_regex 是否啟用python正則來查詢檔案,兩種選項yes/no
contains 根據文章內容查詢檔案,此引數的值為一個正則表示式
age 指定檔案間隔時間,可使用單位有秒(s)、分(m)、時(h)、天(d)、星期(w)
age_stamp 根據時間範圍查詢檔案,檔案時間屬性有三個時間種類,atime、ctime、mtime
size 根據檔案的大小來查詢,可以使用的單位有 t、g、m、k、b
get_checksum 當有符合查詢條件的檔案被找到時,會同時返回對應檔案的sha1校驗碼

1.查詢遠端主機中/etc目錄下,包含 passwd 字串的檔案,隱藏檔案會被忽略,不會進行遞迴查詢.

[[email protected] ~]# ansible all -m find -a 'paths=/etc contains="*passwd*"'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 180, 
    "files": [], 
    "matched": 0, 
    "msg": ""
}

2.查詢遠端主機中/etc目錄以及子目錄中,查詢檔案內容中包含 passwd 字串的檔案,隱藏檔案會被忽略.

[[email protected] ~]# ansible all -m find -a 'paths=/etc contains="*passwd*" recurse=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 2414, 
    "files": [], 
    "matched": 0, 
    "msg": ""
}

3.查詢遠端主機中/etc目錄下以 .sh 結尾的檔案,包括隱藏檔案,但是不包括目錄或其他檔案型別,不會進行遞迴查詢.

[[email protected] ~]# ansible all -m find -a 'paths=/etc patterns="*.sh" file_type=any hidden=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 180, 
    "files": [], 
    "matched": 0, 
    "msg": ""
}

4.查詢遠端主機中/etc目錄下以 .sh 結尾的檔案,包括隱藏檔案,包括所有檔案型別,比如檔案、目錄、或者軟連結,但是不會進行遞迴查詢.

[[email protected] ~]# ansible all -m find -a 'paths=/etc patterns="*.sh" file_type=any hidden=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 180, 
    "files": [], 
    "matched": 0, 
    "msg": ""
}

5.查詢遠端主機中/etc目錄中以及其子目錄中查詢 mtime 在1天以內的檔案,不包含隱藏檔案,不包含目錄或軟連結檔案等檔案型別.

[[email protected] ~]# ansible all -m find -a 'paths=/etc age=-1d recurse=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 2414, 
    "files": [
        {
            "atime": 1544004010.3749297, 
            "ctime": 1544004009.4279296, 
            "dev": 64768, 
        }
    ]

6.查詢遠端主機中/etc目錄中以及其子目錄中查詢大於 1m 的檔案,不包含隱藏檔案,不包含目錄或軟連結檔案等檔案型別.

[[email protected] ~]# ansible all -m find -a 'paths=/etc size=1m recurse=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 2414, 
    "files": [
        {
            "atime": 1543948732.8400002, 
            "ctime": 1539448763.0409997, 
            "dev": 64768, 
        }
    ]

7.查詢遠端主機中/etc目錄中以及其子目錄中查詢以 .sh 結尾的檔案,並且返回符合條件檔案的 sha1 校驗碼,包括隱藏檔案.

[[email protected] ~]# ansible all -m find -a 'paths=/etc patterns=*.sh get_checksum=yes hidden=yes recurse=yes'

192.168.10.20 | SUCCESS => {
    "changed": false, 
    "examined": 2414, 
    "files": [
        {
            "atime": 1543948795.1880422, 
            "checksum": "1e39e9c628803da5b6f5a5d9e77fbe3cfefc996a", 
            "ctime": 1539448365.4729974, 
            "dev": 64768, 
            "gid": 0, 
        }
    ]

◆Unarchive◆

unarchive模組的功能是,解壓縮,這個模組有兩種用法

1.將ansible主機上的壓縮包在本地解壓縮後傳到遠端主機上,這種情況下copy=yes
2.將遠端主機上的某個壓縮包解壓縮到指定路徑下,這種情況下,需要設定copy=no

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
copy 在解壓檔案之前,是否先將檔案複製到遠端主機,預設為yes
creates 指定一個檔名,當該檔案存在時,則解壓指令不執行
src 如果copy為yes,則需要指定壓縮檔案的源路徑
dest 遠端主機上的一個路徑,即檔案解壓的路徑
list_files 列出壓縮包裡的檔案,預設兩個引數yes/no
mode 解壓後文件的許可權設定
group 解壓後的目錄或檔案的屬組
owner 解壓後文件或目錄的屬主

將ansible控制主機上的/root/lyshark.tar.gz解壓縮到遠端主機的/tmp/目錄下,並設定許可權777.

[[email protected] ~]# ansible all -m unarchive -a "src=/root/lyshark.tar.gz dest=/tmp/ mode=777"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/", 
    "extract_results": {
        "cmd": [
            "/usr/bin/gtar", 
            "--extract", 
            "-C", 
            "/tmp/", 
            "-z", 
            "-f", 
            "/root/.ansible/tmp/ansible-tmp-1544005363.57-45479136087498/source"
        ]


文字修改模組

◆Replace◆

replace 模組可以根據我們指定的正則表示式替換檔案中的字串,檔案中所有被匹配到的字串都會被替換,也就是說它是一種全域性替換的工具.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
path 必須引數,指定要操作的檔名稱
regexp 必須引數,指定一個正則表示式
replace 指定最終要替換成的文字
backup 在修改檔案之前對檔案進行備份,yes/no

1.首先我們建立一個文字檔案並傳輸到遠端主機上去.

[[email protected] ~]# vim lyshark.log
[[email protected] ~]# cat lyshark.log 
lyshark
www.mkdirs.com
www.wangrui.com

[[email protected] ~]# ansible all -m copy -a "src=./lyshark.log dest=/tmp/"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "checksum": "8115005c643689fcde3cd1d317a27f75a5748f6f", 
    "dest": "/tmp/lyshark.log", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0e6401405e9ff1f17b02b483cb8e303c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 39, 
    "src": "/root/.ansible/tmp/ansible-tmp-1544005922.28-230333570888422/source", 
    "state": "file", 
    "uid": 0
}

2.接著我們將遠端檔案的www欄位全部替換成wangrui,並且在替換前做備份操作.

[[email protected] ~]# ansible all -m replace -a 'path=/tmp/lyshark.log regexp="www" replace="wangrui" backup=yes'

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "msg": "2 replacements made"
}

◆Lineinfile◆

lineinfile模組相當的重要,在自動化運維中起到了至關重要的目的,他可以通過正則表示式替換指定文字,例如開啟一些配置選項等,還可以新加一行文字,或者是刪除指定的行,本命令一定認證的掌握下來.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
path 必須引數,指定要操作的檔案路徑
line 必須引數,指定要替換的文字內容
regexp 匹配正則語句,與要過濾的關鍵字
state 狀態語句:state=absent則是刪除,state=present預設
backrefs 表示是否開啟後向引用,預設no,yes/no
create 當檔案不存在時,是否建立對應的檔案,yes/no
backup 是否在修改檔案之前對檔案進行備份
insertafter 藉助insertafter引數可以將文字插入到"指定的行"之後
insertbefore 藉助insertafter引數可以將文字插入到"指定的行"之前

1.通過正則匹配查詢/etc/selinux/config文字中開頭是SELINUX=的行,並替換成SELINUX=disabled.

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "msg": "line replaced"
}

2.通過正則匹配查詢/etc/selinux/config文字,並在文字末尾插入一行www.mkdirs.com

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="EOF" line="www.mkdirs.com"'

192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "msg": "line added"
}

3.通過正則匹配查詢/etc/selinux/config文字,並在文字行首插入一行www.mkdirs.com.

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="BOF" line="www.mkdirs.com"'


192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "msg": "line added"
}

4.通過正則匹配查詢/etc/selinux/config文字,刪除所有的www.mkdirs.com欄位.

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^www.mkdirs.com" state=absent'

192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "found": 1, 
    "msg": "1 line(s) removed"
}

5.通過正則匹配查詢/etc/selinux/config文字中在開頭是SELINUX=disabled行的行後插入一段話www.mkdirs.com.

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config insertafter="^SELINUX=" line="www.mkdirs.com"'

192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "msg": "line added"
}

6.通過正則匹配查詢/etc/selinux/config文字中在開頭是SELINUX=disabled行的行前插入一段話www.mkdirs.com.

[[email protected] ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config insertbefore="^SELINUX=" line="www.mkdirs.com"'

192.168.10.20 | SUCCESS => {
    "backup": "", 
    "changed": true, 
    "msg": "line added"
}


系統管理模組

◆Setup◆

setup 模組用於收集遠端主機的一些基本資訊,其可以收集幾乎主機上的任何資料,方便我們後期的分析工作.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
ansible_all_ipv4_addresses 僅顯示ipv4的資訊
ansible_devices 僅顯示磁碟裝置資訊
ansible_distribution 顯示是什麼系統,例:centos,suse等
ansible_distribution_major_version 顯示是系統主版本
ansible_distribution_version 僅顯示系統版本
ansible_machine 顯示系統型別,例:32位還是64位
ansible_eth0 僅顯示eth0的資訊
ansible_hostname 僅顯示主機名
ansible_kernel 僅顯示核心版本
ansible_lvm 顯示lvm相關資訊
ansible_memtotal_mb 顯示系統總記憶體
ansible_memfree_mb 顯示可用系統記憶體
ansible_memory_mb 詳細顯示記憶體情況
ansible_swaptotal_mb 顯示總的swap記憶體
ansible_swapfree_mb 顯示swap記憶體的可用記憶體
ansible_mounts 顯示系統磁碟掛載情況
ansible_processor 顯示cpu個數(具體顯示每個cpu的型號)
ansible_processor_vcpus 顯示cpu個數(只顯示總的個數)

1.通過setup命令獲取遠端主機的主機資訊.

[[email protected] ~]# ansible all -m setup
192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.10.20"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::897c:d72d:cd95:b9ec"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        },
    ].......

2.獲取遠端主機的 IPV4 地址,或者是IPV6地址.

[[email protected] ~]# ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.10.20"
        ]
    }, 
    "changed": false
}

[[email protected] ~]# ansible all -m setup -a "filter=ansible_all_ipv6_addresses"
192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv6_addresses": [
            "fe80::897c:d72d:cd95:b9ec"
        ]
    }, 
    "changed": false
}

3.獲取遠端主機的記憶體資訊列表.

[[email protected] ~]# ansible all -m setup -a "filter=ansible_memory_mb"

192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_memory_mb": {
            "nocache": {
                "free": 41, 
                "used": 177
            }, 
            "real": {
                "free": 5, 
                "total": 218, 
                "used": 213
            }, 
            "swap": {
                "cached": 0, 
                "free": 2027, 
                "total": 2047, 
                "used": 20
            }
        }
    }, 
    "changed": false
}

4.通過萬用字元實現模糊匹配,比如以"mb"關鍵字結尾的資訊.

[[email protected] ~]# ansible all -m setup -a "filter=*mb"

192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_memfree_mb": 4, 
        "ansible_memory_mb": {
            "nocache": {
                "free": 41, 
                "used": 177
            }, 
            "real": {
                "free": 4, 
                "total": 218, 
                "used": 214
            }, 
            "swap": {
                "cached": 0, 
                "free": 2027, 
                "total": 2047, 
                "used": 20
            }
        }, 
        "ansible_memtotal_mb": 218, 
        "ansible_swapfree_mb": 2027, 
        "ansible_swaptotal_mb": 2047
    }, 
    "changed": false
}

5.查詢系統eth0介面相關資訊列表.

[[email protected] ~]# ansible all -m setup -a "filter=ansible_ens32"

192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_ens32": {
            "active": true, 
            "device": "ens32", 
            "features": {
                "busy_poll": "off [fixed]", 
                "vlan_challenged": "off [fixed]"
            }, 
            "hw_timestamp_filters": [], 
            "ipv4": {
                "address": "192.168.10.20", 
                "broadcast": "192.168.10.255", 
                "netmask": "255.255.255.0", 
                "network": "192.168.10.0"
            }, 
            "ipv6": [
                {
                    "address": "fe80::897c:d72d:cd95:b9ec", 
                    "prefix": "64", 
                    "scope": "link"
                }
            ], 
            "macaddress": "00:50:56:35:f2:62", 
            "speed": 1000, 
            "timestamping": [
                "software"
            ], 
            "type": "ether"
        }
    }, 
    "changed": false
}

◆Yum◆

yum 模組可以幫助我們在遠端主機上通過yum源管理軟體包,軟體的安裝也是至關重要的,這裡我們介紹Yum模組,主要使用者批量部署常用元件.yum 模組可以提供的status狀態:latest,present,installed:這3個分別代表安裝,後面2個是解除安裝.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
name 必須引數,用於指定需要管理的軟體包
state 用於指定軟體包的狀態,預設值為present
disable_gpg_check 用於禁用對 rpm 包的公鑰 gpg 驗證,預設值為 no
enablerepo 用於指定安裝軟體包時臨時啟用的 yum 源
disablerepo 用於指定安裝軟體包時臨時禁用的 yum 源

1.安裝軟體:通過Yum模組批量的安裝httpd服務到指定主機上.

[[email protected] ~]# ansible all -m yum -a "name=httpd state=installed" -o

192.168.10.20 | SUCCESS => {"changed": true, .....}
192.168.10.30 | SUCCESS => {"changed": true, .....}

[[email protected] ~]# ansible all -m shell -a "rpm -qa httpd" -o

192.168.10.30 | SUCCESS | rc=0 | (stdout) httpd-2.4.6-80.el7.x86_64
192.168.10.20 | SUCCESS | rc=0 | (stdout) httpd-2.4.6-80.el7.x86_64

2.解除安裝軟體:通過Yum模組批量的解除安裝httpd服務主機.

[[email protected] ~]# ansible all -m yum -a "name=httpd state=removed" -o

192.168.10.20 | SUCCESS => {"changed": true, .....}
192.168.10.30 | SUCCESS => {"changed": true, .....}

[[email protected] ~]# ansible all -m shell -a "rpm -qa httpd" -o

192.168.10.30 | SUCCESS | rc=0 | (stdout)
192.168.10.20 | SUCCESS | rc=0 | (stdout)

◆Cron◆

cron 模組可以幫助我們管理遠端主機中的計劃任務,功能相當於 crontab 命令.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
user 用於設定當前計劃任務屬於哪個使用者,當不使用此引數時,預設為管理員使用者
job 指定計劃的任務中需要實際執行的命令或者指令碼
name 用於設定計劃任務的名稱,計劃任務的名稱會在註釋中顯示
state 相關狀態資訊,當刪除計劃任務時,需要將 state 的值設定為 absent
disabled 當計劃任務有名稱時,我們可以根據名稱使對應的任務失效
backup 此引數的值設定為yes,那麼當修改或者刪除對應的計劃任務時,會對計劃任務備份
$time 指定具體的執行時間,minute分,hour時,day天,month月,weekday 0-7 代表周

1.建立計劃任務,任務名稱為mkdirs test 任務於每天1點5分,執行輸出一段話echo hello lyshark.

[[email protected] ~]# ansible all -m cron -a "name='mkdirs test' minute=5 hour=1 job='echo hello lyshark'"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "mkdirs test"
    ]
}

2.建立計劃任務任務名稱為mkdirs test1 任務每3天執行一次,於執行當天的1點1分開始執行,任務內容為輸出wangrui字元.

[[email protected] ~]# ansible all -m cron -a "name='mkdirs test1' minute=1 hour=1 day=*/3 job='echo wangrui'"

192.168.10.20 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "mkdirs test", 
        "mkdirs test1"
    ]
}

3.刪除計劃任務mkdirs test1,刪除前做好備份.

[[email protected] ~]# ansible all -m cron -a "name='mkdirs test1' state=absent backup=yes"

192.168.10.20 | SUCCESS => {
    "backup_file": "/tmp/crontabqzSJZn", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "mkdirs test"
    ]
}

4.查詢遠端主機上的任務列表.

[[email protected] ~]# ansible all -m shell -a "crontab -l" -o

192.168.10.20 | SUCCESS | rc=0 | (stdout) #Ansible: mkdirs test\n5 1 * * * echo hello lyshark

5.其他配置過程.

[[email protected] ~]# ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/lyshark.sh' weekday=6"
[[email protected] ~]# ansible all -m cron -a "name='test admin' job='/bin/bash /tmp/lyshark.sh' weekday=6 minute=30 hour='*/8'"
[[email protected] ~]# ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/lyshark.sh' minute=30 hour='*/8' day='1,10,20' weekday=6"

◆Service◆

service 模組可以幫助我們管理遠端主機上的服務,它完全可以替代Linux系統下的,相關操作比如啟動服務,設定開機自啟動.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
name 此引數用於指定需要操作的服務名稱
state 此引數用於指定服務的狀態,started、stopped、restarted、reloaded
enabled 此引數用於指定是否將服務設定為開機 啟動項

1.設定服務開機自啟動,設定httpd服務開機自啟動.

[[email protected] ~]# ansible all -m service -a "name=httpd runlevel=3 state=started enabled=yes"

192.168.10.20 | SUCCESS => {"changed": true, .....}
192.168.10.30 | SUCCESS => {"changed": true, .....}

2.關閉服務開機自啟動,關閉httpd服務開機自啟動.

[[email protected] ~]# ansible all -m service -a "name=httpd runlevel=3 state=stopped enabled=no"

192.168.10.20 | SUCCESS => {"changed": true, .....}
192.168.10.30 | SUCCESS => {"changed": true, .....}


其他控制模組

◆Get_url◆

get_url模組用於下載指定檔案到本地,在生產環境中也是最常用的東西啦.

下面來看它的幾個常用引數:

命 令 參 數 參 數 解 釋
dest 檔案下載到遠端的那個目錄下
force 是否強制覆蓋yes/no
url 指定一個URL地址

1.下載一個指定檔案到遠端主機,我這裡沒有網路,這裡只做演示吧.

[[email protected] ~]# ansible all -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"

192.168.10.20 | FAILED! => {
    "changed": false, 
    "dest": "/root", 
    "gid": 0, 
    "group": "root", 
    "mode": "0550", 
    "msg": "Request failed: <urlopen error [Errno -2] Name or service not known>", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 156, 
    "state": "directory", 
    "uid": 0, 
    "url": "http://mirrors.aliyun.com/repo/Centos-7.repo"
}