1. 程式人生 > 實用技巧 >01 . SaltStack部署配置及簡單應用

01 . SaltStack部署配置及簡單應用

SaltStack簡介

SaltStack
  • saltstack是一個新的基礎平臺管理工具,只需要花費數分鐘即可執行起來,可以支撐管理上萬臺伺服器的規模,數秒鐘即可完成資料傳遞。
  • saltstack是使用Python語言開發的,同時也支援restAPI方便二次開發以及和它平臺整合,同時官方也釋出了一個Web管理介面halite。
  • Salt是python編寫的,支援使用者通過python自定義功能模組,也提供了大量的python API介面,使用者可以根據需要進行簡單快速的擴充套件。
優點
  • 首先,他速度快,基於訊息佇列+執行緒,跑完多臺裝置,都是毫秒級別的
  • 其次,非常靈活,原始碼是python,方便理解和自定義模組(python 語言相對於其他的perl、ruby等還是很好理解的)
  • 命令簡單,功能強大
saltstack執行方式
  • Local
  • Master/Minion
  • Salt SSH

saltstack三大功能
  • 遠端執行
  • 配置管理
  • 雲管理
saltstack資料系統
  • Grains (靜態資料)
  • pillar (動態資料)
saltstack配置管理
  • SLS(YAML、Jinja)
  • Highstate
  • States Module

部署配置SaltStack

準備兩臺機器,這兩臺機器都關閉 selinux,清空防火牆規則。

List
    CentOS7.3
epel-7.repo
salt-master
salt-minion
# 依賴包
python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2
節點名 IP 軟體版本 硬體 網路 說明
Master 192.168.43.132 list 裡面都有 2C4G Nat,內網 測試環境
192.168.43.234 list 裡面都有 2C4G Nat,內網 測試環境
安裝saltstack

salt軟體包需要epel源的支援,那麼下載

EPEL的全稱叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社群打造,為 RHEL 及衍生髮行版如 CentOS、Scientific Linux 等提供高質量軟體包的專案。裝上了 EPEL之後,就相當於添加了一個第三方源。

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空快取
yum makecache #生成yum快取 # master 安裝salt-master
yum install salt-master -y # slave 安裝salt-minion
yum install salt-minion -y
配置Saltstack
# salt-master的配置檔案是/etc/salt/master
# salt-minion的配置檔案是/etc/salt/minion
# 配置檔案中包含了大量可調整的引數,這些引數控制master和minion各個方面

salt-master

[[email protected] ~]# grep -v ^# /etc/salt/master|grep -v ^$
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-minion

[[email protected] ~]# grep -v ^# /etc/salt/minion|grep -v ^$
master: master
master_port: 4506
user: root
id: slave
acceptance_wait_time: 10
log_file: /var/log/salt/minion
啟動驗證服務
systemctl start salt-minion
systemctl start salt-master #檢查salt狀態
systemctl status salt-minion
systemctl status salt-master # 驗證埠
[[email protected] ~]# ss -atnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=883,fd=3))
LISTEN 0 100 *:4505 *:* users:(("salt-master",pid=1232,fd=13))
LISTEN 0 100 *:4506 *:* users:(("salt-master",pid=1244,fd=21)) # salt-master預設監聽兩個埠
4505 # publish_port 提供遠端命令傳送功能
4506 # ret_port 提供認證,檔案服務,結果收集等功能
# 確保客戶端可以通訊伺服器的此2個埠,保證防火牆允許埠通過。因此在測試環境直接關閉防火牆
配置master認證minion

master上接受minion金鑰

在minion啟動後連線master會請求master為其簽發證書,等待證書籤發完成後,master可以信任minion,並且minion和master之間的通訊是加密的。

salt-master執行

[[email protected] ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave # 此時已出現slave
Rejected Keys: # 此時slave已經出現在unaccepted keys中,說明minion已經和master聯絡,
# 並且master已經獲取了minion的公鑰,等待下一步指令。

檢查master和minion的金鑰匹配

[[email protected] ~]# salt-key -f slave
Unaccepted Keys:
slave: d4:97:1a:81:4d:88:d2:9b:0b:73:e3:66:07:7e:20:6c # 因此可確認金鑰匹配,在master上接受金鑰
[[email protected] ~]# 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祕鑰是否被接收
[[email protected] ~]# salt-key -L
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:
salt-key常用命令
[[email protected] ~]# 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自動接受請求
salt-key的使用
# 列出當前所有的key
[[email protected] ~]# salt-key
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys: # 新增指定minion的key
[[email protected] ~]# salt-key -a salt -y # 新增所有minion的key
[[email protected] ~]# salt-key -A -y # 刪除指定的key
[[email protected] ~]# salt-key -d slave -y # 刪除所有的key
[[email protected] ~]# salt-key -D -y
日常命令引數

首先知道master和minion都安裝了什麼檔案,然後才知道怎麼操作

# master端
[[email protected] ~]# 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命令
/usr/bin/salt-unity
/usr/lib/systemd/system/salt-master.service
/usr/share/man/man1/salt-cp.1.gz
/usr/share/man/man1/salt-key.1.gz
/usr/share/man/man1/salt-master.1.gz
/usr/share/man/man1/salt-run.1.gz
/usr/share/man/man1/salt-unity.1.gz
/usr/share/man/man7/salt.7.gz # slave端
[[email protected] ~]# 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啟動指令碼
/usr/share/man/man1/salt-call.1.gz
/usr/share/man/man1/salt-minion.1.gz

第一條SaltStack命令

第一條salt命令
[[email protected] ~]# salt '*' test.ping
slave:
True [[email protected] ~]# salt '*' test.echo 'zhou'
slave:
zhou
# salt是一個命令
# * 表示目標主機, 在這裡代表所有目標主機
# test.ping是salt遠端執行的一個模組下面的方法。 # 這是條很簡單的探測minion主機存活命令,也是遠端執行命令,我們通過master傳送訊息給"*"所有的minion,
# 並且告訴他們執行salt內建的命令(也是python模組中的一個函式),返回true表示slave機器監控存活。 [[email protected] ~]# salt '*' test.fib 50
slave:
|_
- 0
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- 21
- 34
- 5.00679016113e-06
# test.fib生成斐波那契數列 # 菲波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等於前兩項之和。

Salt命令組成結構

完整的一個命令
# 在命令列輸入的命令都是     執行模組
# 等到命令寫入到檔案中, 就叫做狀態模組 salt --help # 即可檢視salt幫助
[[email protected] 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments] # salt命令 引數 目標 salt模組的函式 遠端執行的引數 # 完整的五部分命令
# summary引數顯示salt命令的概要
[[email protected] ~]# salt --summary '*' cmd.run 'hostname'
slave:
slave -------------------------------------------
Summary
-------------------------------------------
# of Minions Targeted: 1
# of Minions Returned: 1
# of Minions Did Not Return: 0
------------------------------------------- # 列出salt的sys模組
[[email protected] ~]# salt 'slave' sys.list_modules
slave:
- acl
- aliases
- alternatives
- archive
- artifactory
- blockdev
- btrfs
- buildout
- cloud
- cmd
遠端執行命令模組
[[email protected] ~]# salt 'slave' sys.list_modules

# cmd是超級模組,所有shell命令都能執行
[[email protected] ~]# salt 'slave' cmd.run 'ps -ef |grep python'
slave:
root 882 1 0 14:57 ? 00:00:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 1220 1 0 15:13 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 1223 1220 0 15:13 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 13564 1 0 15:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 13565 13564 0 15:31 ? 00:00:00 /bin/sh -c ps -ef |grep python
root 13567 13565 0 15:31 ? 00:00:00 grep python
遠端安裝nginx
#在minion上安裝nginx
[[email protected]~]$salt 'slave' pkg.install "nginx"
#解除安裝minion上的nginx
[[email protected]~]$salt 'slave' pkg.remove "nginx"
#檢查pkg包的版本
[[email protected]~]$salt 'slave' pkg.version "nginx"
遠端管理服務模組
# 管理服務是系統管理員的重要任務,通過salt管理minion服務會很簡單,使用service模組

[[email protected] ~]# salt 'slave' service.start "nginx"
slave:
True
[[email protected] ~]# salt 'slave' service.status "nginx"
slave:
True
[[email protected] ~]# salt 'slave' service.stop "nginx"
slave:
True

--out控制salt命令結果輸出格式

JSON

[[email protected] ~]# salt --out=json '*' cmd.run_all 'hostname'
{
"slave": {
"pid": 13780,
"retcode": 0,
"stderr": "",
"stdout": "slave"
}
}

YAML

[[email protected] ~]# salt --out=yaml '*' cmd.run_all 'hostname'
slave:
pid: 13786
retcode: 0
stderr: ''
stdout: slave