Saltstack簡介及部署
一、Saltstack簡介
saltstack是一個配置管理系統,能夠維護預定義狀態的遠程節點。
saltstack是一個分佈式遠程執行系統,用來在遠程節點上執行命令和查詢數據。
saltstack是運維人員提高工作效率、規範業務配置與操作的利器。
Salt的核心功能:
- 使命令發送到遠程系統是並行的而不是串行的
- 使用安全加密的協議
- 使用最小最快的網絡載荷
- 提供簡單的編程接口
Salt同樣引入了更加細緻化的領域控制系統來遠程執行,使得系統成爲目標不止可以通過主機名,還可以通過系統屬性。
二、saltstack通信驗證機制
SaltStack 的通訊架構模型
Salt 採用服務端-代理的通訊模型(也可以通過 SSH 方式實現非代理模式)。服務端稱爲 Salt master,代理端稱爲 Salt minion。
Salt master 負責發送命令予 Salt minion,隨後收集並展示這些命令的執行結果。一臺 Salt master 可以管理幾千臺的系統。
saltstack通信機制
SaltStack 採用 C/S模式,minion與master之間通過ZeroMQ消息隊列通信,默認監聽4505端口。
Salt Master運行的第二個網絡服務就是ZeroMQ REP系統,默認監聽4506端口。
Salt minion 驗證機制:
(1).當 minion 啓動時,其將搜索網絡中的 master。當找到時, minion 將發送公鑰給 Salt master,從而實現初次握手。其過程如下圖所示。
(2).當初次握手後,Salt minion 的公鑰將被保存在服務端,此時 master 需要使用過 salt-key 命令接收公鑰(也可以採用自動機制)。注意:在 Salt minion 的公鑰被接收前,Salt master 是不會將密鑰發放給 minion 的,也就是說 minion 在此之前不會執行任何命令。
(3).當 Salt minion 的公鑰被接收後,Salt master 就會把公鑰連同用於加解密 master 信息的可變動 AES 密鑰發送至 Salt minion。其中,返回給 Salt minion 的 AES 密鑰由 minion 的公鑰加密,可由 Salt minion 解密。
三、saltstack安裝與配置
主機準備
主機名 | ip | 作用 |
---|---|---|
server1 | 172.25.63.1 | salt-master |
server2 | 172.25.63.2 | salt-minion |
server3 | 172.25.63.3 | salt-minion |
以上主機系統爲 rhel7.6,且防火牆和selinux均爲關閉狀態。
安裝可以參考:https://repo.saltstack.com/#rhel
設置官方YUM倉庫(每個主機都要操作):
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
master主機配置
安裝master端:
[root@server1 yum.repos.d]# yum install salt-master -y
設置master自啓動並啓動服務:
[root@server1 ~]# systemctl enable --now salt-master
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
master端的配置文件爲/etc/salt/master
。
啓動後查看端口可以看出開啓了4505和4506兩個端口:
minion端配置
安裝minion端:
以下操作以server2爲例,server3和server2的操作相同:
[root@server2 ~]# yum install -y salt-minion
minion端的配置文件爲/etc/salt/minion
:
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion
[root@server2 salt]# cat -n minion | grep 16
第16行設置master主機的ip:
16 master: 172.25.63.1
自啓動:
[root@server2 salt]# systemctl enable --now salt-minion
server3與server2操作相同。
配置連接
當打開server2時使用lsof工具查看4506端口情況:
[root@server1 salt]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 4717 root 23u IPv4 33911 0t0 TCP *:4506 (LISTEN)
/usr/bin/ 4717 root 30u IPv4 37251 0t0 TCP server1:4506->server2:40236 (ESTABLISHED)
可以看出4506端口接收到了server2的信息,查看公鑰情況:
[root@server1 salt]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
Rejected Keys:
可以看出server2正在等待確認,使用以下命令確認:
[root@server1 salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server2
Proceed? [n/Y] y
Key for minion server2 accepted.
-A
表示接受所有,-a
表示指定接受,-d
表示指定刪除,-D
表示全部刪除。
再次查看公鑰情況可以看出server2已經確認:
[root@server1 salt]# salt-key -L
Accepted Keys:
server2
Denied Keys:
Unaccepted Keys:
Rejected Keys:
此時server2已經與server1連接成功:
[root@server1 salt]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 4711 root 15u IPv4 33856 0t0 TCP *:4505 (LISTEN)
/usr/bin/ 4711 root 17u IPv4 38277 0t0 TCP server1:4505->server2:34148 (ESTABLISHED)
他們之間的公鑰保存在/etc/salt/pki
目錄中。
server3打開salt-minion後接受公鑰與server1連接。
連接後Saltstack集羣部署完成。
部署完成後可以使用以下命令測試:
[root@server1 minions]# salt '*' test.ping
server2:
True
server3:
True
其中,'*'
代表集羣中的所有主機(即server2和server3),test
表示模塊,作用與python中的模塊類似,ping
表示test
模塊中的函數,作用與python中的函數類似。
從返回值可以看出部署沒有問題。
[root@server1 minions]# salt server2 test.ping
server2:
True
[root@server1 minions]# salt server3 test.ping
server3:
True
minion端更改主機名後
當minion端更改主機名後我們在master端查看會發現沒有改變,此時我們需要將保存minion端主機名的緩存刪除,緩存保存在/etc/salt/minion_id
文件中,刪除這個文件後重啓salt-minion
即可。
[root@server2 minion]# cd /etc/salt/
[root@server2 salt]# ls
cloud cloud.deploy.d cloud.profiles.d master minion minion_id proxy roster
cloud.conf.d cloud.maps.d cloud.providers.d master.d minion.d pki proxy.d
[root@server2 salt]# cat minion_id
server2