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 //mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo //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
[root@master ~]# 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
[root@slave ~]# 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
# 驗證端口
[root@master ~]# 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執行
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave # 此時已出現slave
Rejected Keys:
# 此時slave已經出現在unaccepted keys中,說明minion已經和master聯繫,
# 並且master已經獲取了minion的公鑰,等待下一步指令。
檢查master和minion的密鑰匹配
[root@master ~]# salt-key -f slave
Unaccepted Keys:
slave: d4:97:1a:81:4d:88:d2:9b:0b:73:e3:66:07:7e:20:6c
# 因此可確認密鑰匹配,在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常用命令
[root@linux-node1 ~]# 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
[root@master ~]# salt-key
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:
# 添加指定minion的key
[root@master ~]# salt-key -a salt -y
# 添加所有minion的key
[root@master ~]# salt-key -A -y
# 刪除指定的key
[root@master ~]# salt-key -d slave -y
# 刪除所有的key
[root@master ~]# salt-key -D -y
日常命令參數
首先知道master和minion都安裝了什麼文件,然後才知道怎麼操作
# master端
[root@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命令
/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端
[root@slave ~]# 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命令
[root@master ~]# salt '*' test.ping
slave:
True
[root@master ~]# salt '*' test.echo 'zhou'
slave:
zhou
# salt是一個命令
# * 表示目標主機, 在這裡代表所有目標主機
# test.ping是salt遠程執行的一個模塊下面的方法。
# 這是條很簡單的探測minion主機存活命令,也是遠程執行命令,我們通過master發送消息給"*"所有的minion,
# 並且告訴他們運行salt內置的命令(也是python模塊中的一個函數),返回true表示slave機器監控存活。
[root@master ~]# 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幫助
[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]
# salt命令 參數 目標 salt模塊的函數 遠程執行的參數
# 完整的五部分命令
# summary參數顯示salt命令的概要
[root@master ~]# salt --summary '*' cmd.run 'hostname'
slave:
slave
-------------------------------------------
Summary
-------------------------------------------
# of Minions Targeted: 1
# of Minions Returned: 1
# of Minions Did Not Return: 0
-------------------------------------------
# 列出salt的sys模塊
[root@master ~]# salt 'slave' sys.list_modules
slave:
- acl
- aliases
- alternatives
- archive
- artifactory
- blockdev
- btrfs
- buildout
- cloud
- cmd
遠程執行命令模塊
[root@master ~]# salt 'slave' sys.list_modules
# cmd是超級模塊,所有shell命令都能執行
[root@master ~]# 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
[root@master~]$salt 'slave' pkg.install "nginx"
#卸載minion上的nginx
[root@master~]$salt 'slave' pkg.remove "nginx"
#檢查pkg包的版本
[root@master~]$salt 'slave' pkg.version "nginx"
遠程管理服務模塊
# 管理服務是系統管理員的重要任務,通過salt管理minion服務會很簡單,使用service模塊
[root@master ~]# salt 'slave' service.start "nginx"
slave:
True
[root@master ~]# salt 'slave' service.status "nginx"
slave:
True
[root@master ~]# salt 'slave' service.stop "nginx"
slave:
True
--out控制salt命令結果輸出格式
JSON
[root@master ~]# salt --out=json '*' cmd.run_all 'hostname'
{
"slave": {
"pid": 13780,
"retcode": 0,
"stderr": "",
"stdout": "slave"
}
}
YAML
[root@master ~]# salt --out=yaml '*' cmd.run_all 'hostname'
slave:
pid: 13786
retcode: 0
stderr: ''
stdout: slave