之前梳理了Saltstack自動化操作記錄(1)-環境部署,下面說說saltstack配置及模組使用:
為了試驗效果,再追加一臺被控制端minion機器192.168.1.118
需要在master控制端機器上做好主機名對映關係
[root@linux-node1 ~]# cat /etc/hosts 127.0.0.1 localhost wutao localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.101 linux-node1 192.168.1.102 linux-node2 192.168.1.118 linux-node3
配置新追加的這臺minion機器(配置步驟和之前一樣)
[root@linux-node3 ~]# cat /etc/salt/minion|grep -v "^#"|grep -v "^$"
master: 192.168.1.101 id: minion-192-168-1-118
[root@linux-node3 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon: [ OK ]
在master控制端檢視:
[root@linux-node1 ~]# salt-key -L Accepted Keys: minion-192-168-1-102 minion-192-168-1-118 Unaccepted Keys: Rejected Keys:
下面針對saltstack在運維中的常規操作做一詳細解析:
1)利用Saltstack遠端執行命令
saltstack的一個比較突出優勢就是具備執行遠端命令的功能。操作方法與func相似,可以幫助運維人員完成集中化的操作平臺。
命令格式:
slat '<操作目標>' <方法> [引數]
如下示例:
檢視被控制機的記憶體使用情況
[root@linux-node1 ~]# salt '*' cmd.run 'free -m' minion-192-168-1-102: total used free shared buffers cached Mem: 3832 3639 193 0 223 1552 -/+ buffers/cache: 1863 1969 Swap: 1535 13 1522 minion-192-168-1-118: total used free shared buffers cached Mem: 3832 3680 152 0 175 1958 -/+ buffers/cache: 1545 2286 Swap: 1535 38 1497
其中針對<操作目標>,saltstack提供了多種方法對被控制端(id)進行過濾。下面列舉常用的具體引數:
a)-E:--pcre 通過正規表示式進行匹配。
示例:檢視被控制端minion-192-168-字元開頭的主機id名是否連通。
[root@linux-node1 ~]# salt -E '^minion-192-168*' test.ping minion-192-168-1-102: True minion-192-168-1-118: True
b)-L:--list 以主機id名列表的形式進行過濾,格式與Python的列表相似,即不同主機id名稱使用逗號分隔。
示例:獲取主機id名為minion-192-168-1-102、minion-192-168-1-118;獲取完整作業系統發行版名稱。
[root@linux-node1 ~]# salt -L 'minion-192-168-1-102,minion-192-168-1-118' grains.item osfullname minion-192-168-1-102: ---------- osfullname: CentOS minion-192-168-1-118: ---------- osfullname: CentOS
c)-G:--grain 根據被控主機的grains資訊(grains是saltstack重要元件之一,重要作用是收集被控主機的基本系統資訊)進行匹配過濾,格式為'<grain value>:<glob expression>'。
比如過濾核心為Linux的主機可以寫成'kernel:Linux',如果同時需要正規表示式的支援可以切成--grain-pcre引數來執行。
示例:獲取主機發行版本為6.8的Python版本號
[root@linux-node1 ~]# salt -G 'osrelease:6.8' cmd.run 'python -V' minion-192-168-1-102: Python 2.7.8 minion-192-168-1-118: Python 2.7.8
d)-I:--pillar 根據被控主機的pillar(作用是定義與被控主機相關的任何資料,定義好的資料可以被其他元件使用)資訊進行過濾匹配,格式為'物件名稱:物件值',比如過濾所有具備'apache:httpd' pillar值的主機。
示例:探測具有"nginx:root:/data"資訊的主機連通性
[root@linux-node1 ~]# salt -I 'nginx:root:/data' test.ping minion-192-168-1-102: True minion-192-168-1-118: True
其中pillar屬性配置檔案如下(後面會講到)
nginx: root:/data
e)-N:--nodegroup 根據主控端master配置檔案中的分組名稱進行過濾。
如下配置的組資訊(主機資訊支援正規表示式、grain、條件運算子等),通常根據業務型別劃分,不同業務具備相同的特點,包括部署環境、應用平臺、配置檔案等。
[root@linux-node1 ~]# vim /etc/salt/master ....... nodegroups: web1group: 'L@minion-192-168-1-102,minion-192-168-1-118' //前面空兩格,冒號後面空一格 web2group: 'L@minion-192-168-1-102'
其中:
L@ 表示後面的主機id格式為列表,即主機id以逗號隔開;
G@ 表示以grain格式描述;
S@ 表示以ip子網或地址格式描述
示例:探測web1group(或web2group)被控主機的連通性
[root@linux-node1 ~]# salt -N web1group test.ping minion-192-168-1-102: True minion-192-168-1-118: True [root@linux-node1 ~]# salt -N web2group test.ping minion-192-168-1-102: True
f)-C:--compound 根據條件運算子not、and、or去匹配不同規則的主機資訊。
示例:探測minion-192開頭並且作業系統為Centos的主機連通性。
[root@linux-node1 ~]# salt -C 'E@^minion-192-168* and G@os:Centos' test.ping minion-192-168-1-102: True minion-192-168-1-118: True
其中:
not語句不能作為第一個條件執行,不過可以通過以下方法來規避:
示例:探測非192-168-1-102開頭的主機連通性
[root@linux-node1 ~]# salt -C '* and not E@^192-168-1-102*' test.ping minion-192-168-1-118: True minion-192-168-1-102: True
g)-S:--ipcidr 根據被控主機的ip地址或ip子網進行匹配。
示例:
[root@linux-node1 ~]# salt -S 192.168.0.0/16 test.ping minion-192-168-1-102: True minion-192-168-1-118: True [root@linux-node1 ~]# salt -S 192.168.1.0/24 test.ping minion-192-168-1-102: True minion-192-168-1-118: True [root@linux-node1 ~]# salt -S 192.168.1.118 test.ping minion-192-168-1-118: True
2)Saltstack常用模組及API
saltstack提供了非常豐富的功能模組,涉及作業系統的基礎功能、常用工具支援等,更多模組資訊請見:https://docs.saltstack.com/en/latest/ref/modules/all/index.html
當然,也可以通過sys模組列出當前版本支援的所有模組:
[root@linux-node1 ~]# salt '*' sys.list_modules minion-192-168-1-102: - acl - aliases - alternatives - archive - blockdev - buildout - cloud - cmd - composer - config - cp - cron .......
接下來抽取出常見的模組進行介紹,並列舉模組API的用法。
API原理:通過呼叫master client模組,例項化一個LocalClient物件,再呼叫cmd()方法來實現的。
如下是API實現test.ping的示例:
import salt.client client = salt.client.LocalClient() ret = client.cmd('*','test.ping') print ret
結果以一個標準的python字典形式的字串返回嗎,可以通過eval()函式轉換成python的字典型別,方便後續的業務邏輯處理,程式執行結果如下:
{'minion-192-168-1-102': True, 'minion-192-168-1-118': True}
截圖如下:
-----------------------------------------------------------------------------------------------------------------
注意:將字元字典轉換成python的字典型別,推薦使用ast模組的literal_eval()方法,
可以過濾表示式中的惡意函式。
-----------------------------------------------------------------------------------------------------------------
a)Archive模組
功能:實現系統層面的壓縮包呼叫,支援gunzip、gzip、rar、tar、unrar、unzip等。
示例1:採用gunzip解壓被控制機的/tmp/wangshibo.gz包
[root@linux-node1 ~]# salt '*' archive.gunzip /tmp/wangshibo.gz minion-192-168-1-102: minion-192-168-1-118:
示例2:採用gzip壓縮被控制機的/opt/test.txt檔案
[root@linux-node1 ~]# salt '*' archive.gzip /opt/test.txt minion-192-168-1-102: minion-192-168-1-118:
到被控制機上檢視是否做了壓縮:
192.168.1.102:
[root@linux-node2 ~]# ll /opt/test.txt.gz -rw-r--r--. 1 root root 29 Feb 13 22:09 /opt/test.txt.gz
192.168.1.118:
[root@linux-node3 ~]# ll /opt/test.txt.gz -rw-r--r--. 1 root root 29 Feb 13 22:09 /opt/test.txt.gz
其他示例:
將被控制機的/mnt/nginx-1.9.7.tar.gz包解壓,解壓預設放到被控制機的當前使用者家目錄(即/root)路徑下(注意:archive.tar後面的引數前不能加-) [root@linux-node1 ~]# salt '*' archive.tar zxf /mnt/nginx-1.9.7.tar.gz minion-192-168-1-118: minion-192-168-1-102: 到其中一臺被控制機上檢查: [root@linux-node2 ~]# cd /root/ [root@linux-node2 ~]# ls nginx-1.9.7 將被控制機的/mnt/heihei.tar.bz2包解壓,解壓預設放到被控制機的當前使用者家目錄(即/root)路徑下 [root@linux-node1 ~]# salt '*' archive.tar jxf /mnt/heihei.tar.bz2 minion-192-168-1-102: minion-192-168-1-118: ------------------------------------------------------ 將被控制機的/mnt/test打包到/mnt下的test.tar.gz [root@linux-node1 ~]# salt '*' archive.tar zcf /mnt/test.tar.gz /mnt/test minion-192-168-1-118: - tar: Removing leading `/' from member names minion-192-168-1-102: - tar: Removing leading `/' from member names 將被控制機的/mnt/huihui打包到/opt下的huihui.tar.bz2 [root@linux-node1 ~]# salt '*' archive.tar jcf /opt/test.huihui.bz2 /mnt/huihui minion-192-168-1-102: - tar: Removing leading `/' from member names minion-192-168-1-118: - tar: Removing leading `/' from member names 針對上面通過archive模板壓縮後的包再進行解壓縮,發現解壓縮後的檔案路徑會帶有它原來的上級目錄!如下: [root@linux-node1 ~]# salt '*' archive.tar zxf /mnt/test.tar.gz minion-192-168-1-102: minion-192-168-1-118: [root@linux-node1 ~]# salt '*' archive.tar jxf /opt/test.huihui.bz2 minion-192-168-1-102: minion-192-168-1-118: 到其中一臺被控制機上檢查: [root@linux-node2 ~]# cd /root/ [root@linux-node2 ~]# ls mnt [root@linux-node2 ~]# ls mnt/ huihui test