引入
簡介
saltstack是由thomas Hatch於2011年創建的一個開源項目,設計初衷是為了實現一個快速的遠程執行系統。
早期運維人員會根據自己的生產環境來寫特定腳本完成大量重復性工作,這些腳本復雜且難以維護。系統管理員面臨的問題主要是1、系統配置管理,2、遠程執行命令,因此誕生了很多開源軟件,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟件擅長維護系統狀態或方便的對大量主機進行批量的命令執行。
salt靈活性強大,可以進行大規模部署,也能進行小規模的系統部署。salt的設計架構適用於任意數量的服務器,從少量本地網絡系統到跨越數個數據中心,拓撲架構都是c/s模型,配置簡單。
不管是幾台、幾百台、幾千台服務器,都可以使用salt在一個中心節點上進行管控,靈活定位任意服務器子集來運行命令。
Salt是python編寫的,支持用戶通過python自定義功能模塊,也提供了大量的python API接口,用戶可以根據需要進行簡單快速的擴展。
saltstack的運維方式
- Local 本地運行,交付管理
- Master/Minion (常用方式 )
- Salt SSH 不需要客戶端
salt基本架構
在安裝salt之前,先理解salt架構中各個角色,主要區分是salt-master和salt-minion,顧名思義master是中心控制系統,minion是被管理的客戶端。
salt架構中的一種就是master > minion。
服務器環境准備
服務器環境 | centos7(master) | centos7(master) |
ip地址 |
192.168.178.131 | 192.168.178.132 |
身份 |
master | slave |
軟件包 |
salt-master | salt-minion |
關閉服務器安全策略
# 關閉firewalld systemctl disable firewalld systemctl stop firewalld # 關閉iptables iptables -F # 關閉selinux
安裝saltstack
注意:salt軟件包需要epel源的支持, 如果沒有安裝epel源 <點這里>有教程
在 192.168.178.131 中安裝salt-master
yum install salt-master -y
另一台安裝salt-minion
yum install salt-minion -y
salt端口
安裝好salt之后開始配置,salt-master默認監聽兩個端口:
4505 publish_port # 提供遠程命令發送功能 4506 ret_port # 提供認證,文件服務,結果收集等功能 # 確保客戶端可以通信服務器的此2個端口,保證防火牆允許端口通過。因此在測試環境直接關閉防火牆。
配置文件
salt-master的配置文件是/etc/salt/master # 主機 192.168.178.131 salt-minion的配置文件是/etc/salt/minion # 主機 192.168.178.132 # 配置文件中包含了大量可調整的參數,這些參數控制master和minion各個方面
寫入salt-master配置文件如下:
interface: 0.0.0.0 # 綁定到本地的0.0.0.0地址 publish_port: 4505 user: root worker_threads: 5 ret_port: 4506 pidfile: /var/run/salt-master.pid log_file: /var/log/salt/master # 自動接收minion的key # auto_accept: False

# salt運行的用戶,影響到salt的執行權限 user: root #s alt的運行線程,開的線程越多一般處理的速度越快,但一般不要超過CPU的個數 worker_threads: 10 # master的管理端口 publish_port : 4505 # master跟minion的通訊端口,用於文件服務,認證,接受返回結果等 ret_port : 4506 # 如果這個master運行的salt-syndic連接到了一個更高層級的master,那么這個參數需要配置成連接到的這個高層級master的監聽端口 syndic_master_port : 4506 # 指定pid文件位置 pidfile: /var/run/salt-master.pid
寫入sale-master配置文件如下:
master: 192.168.178.132 # 填自己的端口或者域名 master_port: 4506 user: root id: slave # id自定義 acceptance_wait_time: 10 log_file: /var/log/salt/minion

# minion的識別ID,可以是IP,域名,或是可以通過DNS解析的字符串 id: slave # salt運行的用戶權限 user: root # master的識別ID,可以是IP,域名,或是可以通過DNS解析的字符串 master : master # master通信端口 master_port: 4506 # 備份模式,minion是本地備份,當進行文件管理時的文件備份模式 backup_mode: minion # 執行salt-call時候的輸出方式 output: nested # minion等待master接受認證的時間 acceptance_wait_time: 10 # 失敗重連次數,0表示無限次,非零會不斷嘗試到設置值后停止嘗試 acceptance_wait_time_max: 0 # 重新認證延遲時間,可以避免因為master的key改變導致minion需要重新認證的syn風暴 random_reauth_delay: 60 # 日志文件位置 log_file: /var/logs/salt_minion.log
啟動
# 192.168.178.131中: systemctl start salt-master # 啟動master systemctl status salt-master # 檢查start狀態 ==================================== # 192.168.178.132 systemctl start salt-minion # 啟動minion systemctl status salt-minion # 檢查狀態
注意:如果啟動報錯,查看是否有 /var/log/salt/ 這個文件
在master上接收minion密鑰
在minion啟動后連接master會請求master為其簽發證書,等待證書簽發完成后,master可以信任minion,並且minion和master之間的通信是加密的。
在salt-master執行
salt-key命令用於管理mionion秘鑰
[root@master ~]# salt-key -L # 輸出結果: Accepted Keys: Denied Keys: Unaccepted Keys: slave # 此時已經出現slave Rejected Keys:
此時slave已經出現在unaccepted keys中,說明minion已經和master聯系,並且master已經獲取了minion的公鑰,等待下一步指令。
密鑰匹配
在master上執行:
[root@master ~]# salt-key -f 192.162.178.132 Unaccepted Keys: slave: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
然后在minion上獲取密鑰:
[root@slave ~]# salt-call --local key.finger local: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
此時可確認密鑰匹配,在master上接收密鑰
[root@master ~]# salt-key -a slave The following keys are going to be accepted: Unaccepted Keys: slave Proceed? [n/Y] y Key for minion slave accepted.
確認接收秘鑰后,檢驗minion秘鑰是否被接收
[root@master ~]# salt-key -L Accepted Keys: slave # 表示接收成功 Denied Keys: Unaccepted Keys: Rejected Keys:
好了,配置完成,可以執行命令了。
常用命令
salt-key
只有master接收了minion key后才能進行管理。
[root@master ~]# salt-key -L Accepted Keys: # 已經接受的key Denied Keys: # 拒絕的key Unaccepted Keys:# 未加入的key Rejected Keys:# 吊銷的key #常用參數 -L # 查看KEY狀態 -A # 允許所有 -D # 刪除所有 -a # 認證指定的key -d # 刪除指定的key -r # 注銷掉指定key(該狀態為未被認證) # 在master端/etc/salt/master配置 auto_accept: True # 如果對Minion信任,可以配置master自動接受請求
常用命令參數:

rpm -ql salt-master /etc/salt/master # salt master主配置文件 /usr/bin/salt # salt master 核心操作命令 /usr/bin/salt-cp # salt 文件傳輸命令 /usr/bin/salt-key # salt證書管理 /usr/bin/salt-master # salt master 服務命令 /usr/bin/salt-run # salt master runner命令

rpm -ql salt-minion /etc/salt/minion # minion配置文件 /usr/bin/salt-call # 拉取命令 /usr/bin/salt-minion # minion服務命令 /usr/lib/systemd/system/salt-minion.service # minion啟動腳本
salt命令:
[root@master ~]# salt '*' test.ping # 檢測所有minion主機是否存活 slave: True # salt 是一個命令 # * 表示目標主機, 在這里代表所有目標主機 # test.ping是salt遠程執行的一個模塊下面的方法。 [root@master ~]$salt '*' test.fib 50 # 生成斐波那契數列 [root@master ~]$salt 'slave' sys.list_modules # 列出所有salt的sys模塊

[root@master ~]$salt '*' sys.list_functions test slave: - test.arg - test.arg_repr - test.arg_type - test.assertion - test.attr_call - test.collatz - test.conf_test - test.cross_test - test.echo - test.exception - test.fib - test.get_opts - test.kwarg - test.module_report - test.not_loaded - test.opts_pkg - test.outputter - test.ping - test.provider - test.providers - test.rand_sleep - test.rand_str - test.retcode - test.sleep - test.stack - test.try_ - test.tty - test.version - test.versions_information - test.versions_report
cmd運行命令:
# cmd是超級模塊,所有shell命令都能執行 [root@master ~]$salt 'slave' cmd.run 'ps -ef|grep python'
pkg安裝命令:
#在minion上安裝nginx [root@master ~]$salt 'slave' pkg.install "nginx" #卸載minion上的nginx [root@master ~]$salt 'slave' pkg.remove "nginx" #檢查pkg包的版本 [root@master ~]$salt 'slave' pkg.version "nginx"
service管理服務模塊:
[root@master ~]$salt 'slave' service.start "nginx" # 啟動nginx [root@master ~]$salt 'slave' service.status "nginx" # 重啟nginx [root@master ~]$salt 'slave' service.stop "nginx" # 停止nginx
--out 控制salt命令結果輸出的格式:
# JSON [root@master ~]$salt --out=json '*' cmd.run_all 'hostname' # 返回json格式
# YAML [root@master ~]$salt --out=yaml '*' cmd.run_all 'hostname' # 返回YAML格式