SaltStack是一個開源的、新的基礎平臺管理工具,使用Python語言開發,同時提供Rest API方便二次開發以及和其他運維管理系統進行集成。相對於出道比較早的Puppet,SaltStack先天的優勢就是簡單、易用,可以非常快速的在團隊中推廣和使用,而且運行多平臺。
SaltStack目前擁有四大主要功能
- 遠程執行:就是在管理節點上實現在上百臺、上千臺機器上同時執行一個命令。
- 配置管理:也可以稱之爲狀態管理,你可以描述一個狀態。例如,某臺機器要安裝Nginx軟件包、Nginx必須是啓動的狀態、Nginx有一個配置文件(內容和某個地方的一樣)。你用一種描述語法描述出來後交給SaltStack,SaltStack就可以幫你實現,而不用你手動進行Nginx軟件包的安裝、配置文件的修改、啓動等。
- 雲管理:SaltStack有一個組件叫作salt-cloud,它可以幫你自動化的進行雲主機的創建和管理,支持很多公有云或私有云,例如AWS、阿里雲、HP雲、OpenStack、CloudStack等。
- 事件驅動:事件驅動基礎設施是SaltStack最強大也是最神祕的功能,前面的遠程執行和配置管理是最基礎的的,事件驅動是指SaltStack在日常運行中可以產生和捕捉事件,並根據捕捉到的事件觸發對應的操作。
SaltStack的四種運行方式
- Local:在本地運行或者說單臺使用SaltStack
- Minion/Master: 傳統的客戶端/服務器端(C/S)架構
- Syndic: 使用代理實現架構擴展,用於管理更多的節點
- Salt SSH: 無須安裝客戶端,直接通過SSH通信
目標機器匹配方法
SaltStack有以下幾種方式來選擇目標機器,靈活而又強大。大的來講分爲兩大類:
1. 基於Minion ID
Minion ID是客戶端(minion)的唯一標識符。可以在minion配置文件裏面使用ID選項進行配置,如果不指定,其默認是主機的FQDN名。Minion ID是不能變動的,因爲在進行key認證的時候,生成的文件名是以Minion ID命名的。如果Minion發生變動,就需要使用salt-key -d刪除老的Minion ID,然後重新加入新的Minion ID。
- Globbing(通配符)
- regex(正則表達式)
- list(列表)
2. 不基於Minion ID
- 子網/IP地址
- Grains
- Grains PCRE
- Pillar
- Compound matchers(複合匹配)
- Node groups(節點組)
- Batching execution(批處理執行)
演示
指定Minion ID是最直接的選擇目標的方法
查看所有minion節點
[root@salt ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
128.docker.itnotebooks.com
Rejected Keys:
授權minion節點
可以修改/etc/salt/master的配置auto_accept:True自動認證
[root@salt ~]# salt-key -a 128.docker.itnotebooks.com
The following keys are going to be accepted:
Unaccepted Keys:
128.docker.itnotebooks.com
Proceed? [n/Y] y
Key for minion 128.docker.itnotebooks.com accepted.
- salt-key -L: 顯示已經或未認證的minion節點,Accepted Keys爲已認證清單
- salt-key -D: 刪除所有Minion節點的證書
- salt-key -d id: 刪除單個minion節點的證書
- salt-key -A: 接受所有minion節點的請求
- salt-key -a id: 接受單個minion節點的請求
Globbing是指在Minion ID的基礎上,通過通配符來定位Minion。SaltStack默認使用Shell風格通配符(如“” “?” “[]”)來匹配Minion ID。不過需要注意的是,使用salt命令時必須將’’放在單引號中,或是用’\’轉義,用來避免shell解析。
匹配所有itnotebooks.com域的所有minion
[root@salt ~]# salt '*.itnotebooks.com' test.ping
匹配docker後面單個任意字符的Minion
[root@salt ~]# salt 'docker?.itnotebooks.com' test.ping
匹配docker節點1到節點3的Minion
[root@salt ~]# salt 'docker[1-3].itnotebooks.com' test.ping
匹配docker不是節點1和節點3的Minion
[root@salt ~]# salt 'docker[!13].itnotebooks.com' test.ping
list和直接Minion ID都是最基本的模式,可以列出每一個Minion ID來指定多個目標機器,使用選項’-L’
[root@salt ~]# salt -L 'docker1.itnotebooks.com,docker2.itnotebooks.com' test.ping
Salt可以使用Perl風格的正則表達式來匹配Minion ID,使用選項-E
[root@salt ~]# salt -E 'linux-(node1|node2)*' test.ping
規範的Minion ID可以很好的反映出該服務器運行的相關服務及所在位置
redis-node1-redis03-idc04-soa.itnotebooks.com
- redis-node1:運行的服務是Redis,這是第一個節點
- redis03:說明這個redis是Redis集羣編號03裏面的節點
- idc04:這臺服務器運行在編號04的IDC機房中
- soa:這臺服務器是給SOA服務使用的
- itnotebooks.com:運行的服務器是itnotebooks.com業務
也可以使用IP地址或CIDR子網來指定目標,目前僅支持IPv4的地址
[root@salt ~]# salt -S '192.168.18.33' test.ping
[root@salt ~]# salt -S '192.168.18.0/24' test.ping
也可以使用Grains對Trageting進行匹配,使用選項’-G’
匹配所有CentOS系統的Minion
[root@salt ~]# salt -G 'os:CentOS' test.ping
通過Grain匹配非常靈活,如果你想進行更復雜的基於Grains的匹配,SaltStack提供了Grain PCRE,可以在Grains的基礎上使用正則表達式
[root@salt ~]# salt --grain-pcre 'os_family:Red(Hat|Flag)' test.ping
Pillar的數據可以用來定位Minion,爲定位Minions提供了靈活性和終極控制
[root@salt ~]# salt -I 'apache:httpd' test.ping
Compound matchers(混合匹配)可以使用布爾操作符連接多個目標條件。混合匹配可以用前面討論的多種方式實現精確的匹配。混合配匹配默認使用Globbing,如果要使用其它匹配方式,需要加上類型前綴字母如下表所示。
複合匹配中也可以使用and、or、not操作符,例如要匹配主機名以及webserv開始且運行Debain系統的Minion,還能匹配主機名滿足正則表達式web-dc1-srv.*的Minion
[root@salt ~]# salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping
- G表示用shell通配符匹配Grains
- E表示用正則表達式匹配Minion ID
需要注意的是not不能用於第一個條件,需要用時可以像下面這樣寫:
[root@salt ~]# salt -C '* and not G@kernel:Darwin' test.ping
Node group是在Master中nodegroup用複合條件字義的一組Minion
[root@salt ~]# vim /etc/salt/master
nodegroups:
group1: '[email protected],linux-node2.itnotebooks.com'
[root@salt ~]# systemctl restart salt-master
[root@salt ~]# salt -N group1 test.ping
linux-node2.itnotebooks.com
True
linux-node1.itnotebooks.com
True
遠程執行命令-查看內存使用
[root@salt ~]# salt 'linux-node1.itnotebooks.com' cmd.run 'free -m'
total used free shared buff/cache available
Mem: 1838 749 119 0 969 887
Swap: 0 0 0
遠程執行命令-查看操作系統類型
[root@salt ~]# salt 'linux-node1.itnotebooks.com' grains.item osfullname
linux-node1.itnotebooks.com:
osfullname: CentOS
遠程執行命令-查看指定發行版本號爲6.4的主機的python版本
[root@salt ~]# salt -G 'osrelease:6.4' cmd.run 'python -V'
linux-node1.itnotebooks.com:
Python 2.6.6
遠程執行命令-解壓文件
[root@salt ~]# salt 'linux-node1.itnotebooks.com' archive.gunzip /tmp/jdk-8.1.0.gz
遠程執行命令-壓縮文件
[root@salt ~]# salt 'linux-node1.itnotebooks.com' archive.gzip /tmp/test.txt
除了上面所提到的外,其它類似的模塊還有很多很多
如cp、cron、file、iptables、network、dnsuti、service、pkg等等,詳細的自己用過就知道了,當然你也可以在cmd.run裏面去完成這一切