salt介紹
saltstack是由thomas Hatch於2011年創建的一個開源項目,設計初衷是為了實現一個快速的遠程執行系統。
salt強大嗎
系統管理員日常會進行大量的重復性操作,例如安裝軟件,修改配置文件,創建用戶,批量執行命令等
等。如果主機數量龐大,單靠人工維護實在讓人難以忍受。
早期運維人員會根據自己的生產環境來寫特定腳本完成大量重復性工作,這些腳本復雜且難以維護。系統管理員面臨的問題主要是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。
在遠程執行系統中,salt用python通過函數調用完成任務。
運行salt依賴包
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
服務器環境准備
關閉服務器安全策略
關閉firewalld systemctl disable firewalld systemctl stop firewalld 關閉iptables iptables -F 關閉selinux
安裝saltstack
1、環境准備
准備3台機器,配置好ip地址,互相可以通信,即可 互ping一下看看通沒通 ping192.168.61.138 一個master 一個minion 一個minion
2、配置hosts解析文件
配置hosts解析文件,強制進行主機名解析,加速salt的minion查找,分別在三台機器上,寫入解析 vim /etc/hosts 192.168.16.142 s20 192.168.16.7 docker01 192.168.16.47 bogon
3、下載saltstack軟件包
配置阿里雲的源,下載saltstack軟件包, 注意區分 服務端和客戶端 1.在master上安裝 yum install salt-master -y 2.在minion1上安裝 yum install salt-minion -y 3.在minion2上安裝 yum install salt-minion -y
4、配置文件
【salt-master配置文件】
配置文件在/etc/salt/master
vim master # 打開配置文件,填入如下內容
interface: 0.0.0.0 #綁定到本地的0.0.0.0地址 publish_port: 4505 #管理端口,命令發送 user: root #運行salt進程的用戶 worker_threads: 5 #salt運行線程數,線程越多處理速度越快,不要超過cpu個數 ret_port: 4506 #執行結果返回端口 pidfile: /var/run/salt-master.pid #pid文件位置 log_file: /var/log/salt/master #日志文件地址 #自動接收minion的key auto_accept: False
【salt-minion1配置文件】
vim /etc/salt/minion # 打開配置文件,填入如下內容
master: s20 #指定mastet的通信地址 master_port: 4506 user: root id: s20minion1 #id用於指定minion的身份信息 ,待會可以在master上查看到的 acceptance_wait_time: 10 log_file: /var/log/salt/minion
【salt-minion2配置文件】
vim /etc/salt/minion # 打開配置文件,填入如下內容
master: s20 master_port: 4506 user: root id: s20minion2 acceptance_wait_time: 10 log_file: /var/log/salt/minion
5、重啟master和minion,檢查密鑰是否匹配
重啟
salt通信是在minion初次啟動時候,建立新的連接的
systemctl restart salt-master
systemctl restart salt-minion
檢查master和minion的秘鑰匹配
【在master上執行】
【在minion上獲取minion的秘鑰】
確認密鑰匹配進行下一步
6、查看minion的密鑰信息
在minion啟動后連接master會請求master為其簽發證書,等待證書簽發完成后,master可以信任minion,並且minion和master之間的通信是加密的。
在salt-master執行
salt-key命令用於管理mionion秘鑰
在master機器上,查看minion的密鑰信息 salt-key -L #查看所有密鑰 salt-key -a s20minion1 #-a參數 單獨接受一個密鑰信息 salt-key -A #-A 接受所有的key信息 #常用參數 -L #查看KEY狀態 -A #允許所有 -D #刪除所有 -a #認證指定的key -d #刪除指定的key -r #注銷掉指定key(該狀態為未被認證) #在master端/etc/salt/master配置 auto_accept: True #如果對Minion信任,可以配置master自動接受請求
[root@szx ~]# salt-key -L Accepted Keys: #已經接受的key Denied Keys: #拒絕的key Unaccepted Keys:#未加入的key Rejected Keys:#吊銷的key
7、驗證salt minion信息是否存活
salt "*" test.ping
轉化為json信息
將輸出的結果,轉化為json信息,可以序列化后,丟給前端渲染
salt "*" test.ping --out=json
salt的命令學習
上面我們已經配置完master和minion的通信,接下來我們就可以通過salt命令來批量管理minion機器了
【驗證salt minion信息是否存活】 salt "*" test.ping 【轉化為json信息】 salt "*" test.ping --out=json 【讓機器遠程返回主機名給我】 salt --summary '*' cmd.run 'hostname' 【遠程安裝軟件】 salt "*" cmd.run "yum install nginx -y" 【salt安裝軟件的接口】 遠程安裝nginx:salt '*' pkg.install 'nginx' 遠程卸載nginx:salt '*' pkg.remove "nginx" 檢查pkg包的版本:salt '*' pkg.version "nginx" 【遠程管理服務模塊】 # 管理服務是系統管理員的重要任務,通過salt管理minion服務會很簡單,使用service模塊 salt '*' service.start "nginx" salt '*' service.stop "nginx" salt '*' service.restart "nginx"
查看master和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命令
【minion端】
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啟動腳本
【test模塊】
[root@master ~]# salt '*' test.ping slave: True # salt 是一個命令 # * 表示目標主機, 在這里代表所有目標主機 # test.ping是salt遠程執行的一個模塊下面的方法。
這是條很簡單的探測minion主機存活命令,也是遠程執行命令,我們通過master發送消息給"*"所有的minion,並且告訴他們運行salt內置的命令(也是python模塊中的一個函數),返回true表示slave機器監控存活。
test模塊實際上還有許多其他的函數

[root@master 192.168.199.155 ~]$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 test其他函數
測試下test.echo
[root@master 192.168.199.155 ~]$salt '*' test.echo 'henry nb666' slave: henry nb666
test.fib生成斐波那契數列
菲波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等於前兩項之和。
[root@master 192.168.199.155 ~]$salt '*' test.fib 50 slave: |_ - 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 1.09672546387e-05
salt命令的兩種輸出格式
【 json】
salt "*" test.ping --out=json
【yaml】
salt "*" test.ping --out=yaml
【yaml語法學習】
在學習saltstack過程中,第一要點就是States編寫技巧,簡稱SLS文件。這個文件遵循YAML語法。初學者看這玩意很容易懵逼,來,超哥拯救你學習YAML語法 json xml yaml 數據序列化格式 yaml容易被解析,應用於配置文件 salt的配置文件是yaml配置文件,不能用tab saltstack,k8s,ansible都用的yaml格式配置文件 語法規則 大小寫敏感 使用縮進表示層級關系 縮進時禁止tab鍵,只能空格 縮進的空格數不重要,相同層級的元素左側對其即可 # 表示注釋行 yaml支持的數據結構 對象: 鍵值對,也稱作映射 mapping 哈希hashes 字典 dict 冒號表示 key: value key冒號后必須有 數組: 一組按次序排列的值,又稱為序列sequence 列表list 短橫線 - list1 純量: 單個不可再分的值 對象:鍵值對 yaml first_key: second_key:second_value python { 'first_key':{ 'second_key':'second_value', } }
YAML是YAML Ain't Markup Language的首字母縮寫,YAML的語法簡單, 結構體通過空格展示 項目使用 '-' 代表 鍵值對通過 ':' 分割
YAML語法遵循固定的縮進風格,表示數據層級結構關系,saltstack需要每個縮進級別由2個空格組成,禁止用tabs!!!
Python中的字典是簡單的鍵值對,go語言中稱作哈希表map 字典的key通過冒號分割 key在YAML中表現形式是一個冒號結果的字符串 my_key: my_value 轉化到python語法中,上述命令為 {'my_key':'my_value'} value還可以通過縮進和key關聯,四個空格!! my_key: my_value 轉化為python語法同樣的 {'my_key':'my_value'} YAML語法中字典是可以嵌套的 one_dict_key: two_dict_key:value_dict 轉化為python語法 { 'one_dict_key':{ 'two_dict_key':'value_dict' } }
短橫杠 YAML語法表示列表,使用一個橫杠加一個空格 多個項使用同樣的縮進級別作為同一個列表的部分 - list_value_one - list_value_two - list_value_three 列表可以作為一個鍵值對的value,例如一次性要安裝多個軟件 my_dict: - l1 - l2 - l3 轉化為python代碼理解就是 { 'my_dict':['l1','l2',;l3] }