之前梳理了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