saltstack是由thomas Hatch於2011年建立的一個開源項目,設計初衷是爲了實現一個快速的遠程執行系統。前端
系統管理員平常會進行大量的重複性操做,例如安裝軟件,修改配置文件,建立用戶,批量執行命令等python
等。若是主機數量龐大,單靠人工維護實在讓人難以忍受。linux
早期運維人員會根據本身的生產環境來寫特定腳本完成大量重複性工做,這些腳本複雜且難以維護。系統管理員面臨的問題主要是一、系統配置管理,二、遠程執行命令,所以誕生了不少開源軟件,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟件擅長維護系統狀態或方便的對大量主機進行批量的命令執行。nginx
salt靈活性強大,能夠進行大規模部署,也能進行小規模的系統部署。salt的設計架構適用於任意數量的服務器,從少許本地網絡系統到跨越數個數據中心,拓撲架構都是c/s模型,配置簡單。docker
不論是幾臺、幾百臺、幾千臺服務器,均可以使用salt在一箇中心節點上進行管控,靈活定位任意服務器子集來運行命令。 json
Salt是python編寫的,支持用戶經過python自定義功能模塊,也提供了大量的python API接口,用戶能夠根據須要進行簡單快速的擴展。vim
在安裝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
準備3臺機器,配置好ip地址,互相能夠通訊,便可 互ping一下看看通沒通 ping192.168.61.138 一個master 一個minion 一個minion
配置hosts解析文件,強制進行主機名解析,加速salt的minion查找,分別在三臺機器上,寫入解析 vim /etc/hosts 192.168.16.142 s20 192.168.16.7 docker01 192.168.16.47 bogon
配置阿里雲的源,下載saltstack軟件包, 注意區分 服務端和客戶端 1.在master上安裝 yum install salt-master -y 2.在minion1上安裝 yum install salt-minion -y 3.在minion2上安裝 yum install salt-minion -y
配置文件在/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
salt通訊是在minion初次啓動時候,創建新的鏈接的
systemctl restart salt-master systemctl restart salt-minion
【在master上執行】
【在minion上獲取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自動接受請求
1
2
3
4
5
|
[root@szx ~]
# salt-key -L
Accepted Keys:
#已經接受的key
Denied Keys:
#拒絕的key
Unaccepted Keys:
#未加入的key
Rejected Keys:
#吊銷的key
|
salt "*" test.ping
將輸出的結果,轉化爲json信息,能夠序列化後,丟給前端渲染
salt "*" test.ping --out=json
上面咱們已經配置完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端】
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模塊實際上還有許多其餘的函數
測試下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
【 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', } }
1
2
3
4
|
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] }