Saltstack自動化操作記錄(2)-配置使用

kunlunzhiying發表於2017-07-03

 

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

 

相關文章