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
Tags: