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"
}