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

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

#### SaltStack簡介 ##### SaltStack - saltstack是一個新的基礎平臺管理工具,只需要花費數分鐘即可執行起來,可以支撐管理上萬臺伺服器的規模,數秒鐘即可完成資料傳遞。 - saltstack是使用[Python](https://www.linuxidc.com/topicnews.aspx?tid=17)語言開發的,同時也支援restAPI方便二次開發以及和它平臺整合,同時官方也釋出了一個Web管理介面halite。 - Salt是python編寫的,支援使用者通過python自定義功能模組,也提供了大量的python API介面,使用者可以根據需要進行簡單快速的擴充套件。 ##### 優點 - 首先,他速度快,基於訊息佇列+執行緒,跑完多臺裝置,都是毫秒級別的 - 其次,非常靈活,原始碼是python,方便理解和自定義模組(python 語言相對於其他的perl、ruby等還是很好理解的) - 命令簡單,功能強大 ##### **saltstack執行方式** - Local - Master/Minion - Salt SSH ![](https://img2020.cnblogs.com/blog/1871335/202007/1871335-20200705154527897-375148241.png) ##### **saltstack三大功能** - 遠端執行 - 配置管理 - 雲管理 ##### **saltstack資料系統** - Grains (靜態資料) - pillar (動態資料) ##### **saltstack配置管理** - SLS(YAML、Jinja) - Highstate - States Module #### 部署配置SaltStack 準備兩臺機器,這兩臺機器都關閉 selinux,清空防火牆規則。 ##### List ```mysql 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之後,就相當於添加了一個第三方源。 ```python 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 ```mysql # salt-master的配置檔案是/etc/salt/master # salt-minion的配置檔案是/etc/salt/minion # 配置檔案中包含了大量可調整的引數,這些引數控制master和minion各個方面 ``` `salt-master` ```mysql [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` ```mysql [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 ``` ##### 啟動驗證服務 ```mysql 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執行` ```python [root@master ~]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: slave # 此時已出現slave Rejected Keys: # 此時slave已經出現在unaccepted keys中,說明minion已經和master聯絡, # 並且master已經獲取了minion的公鑰,等待下一步指令。 ``` `檢查master和minion的金鑰匹配` ```python [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常用命令 ```mysql [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的使用 ```python # 列出當前所有的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都安裝了什麼檔案,然後才知道怎麼操作` ```mysql # 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命令 ```mysql [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命令組成結構 ##### 完整的一個命令 ```mysql # 在命令列輸入的命令都是     執行模組 # 等到命令寫入到檔案中, 就叫做狀態模組 salt --help # 即可檢視salt幫助 [root@master 192.168.199.155 ~]$salt --help Usage: salt [options] '' [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 ``` ##### 遠端執行命令模組 ```mysql [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 ```python #在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" ``` ##### 遠端管理服務模組 ```python # 管理服務是系統管理員的重要任務,通過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` ```mysql [root@master ~]# salt --out=json '*' cmd.run_all 'hostname' { "slave": { "pid": 13780, "retcode": 0, "stderr": "", "stdout": "slave" } } ``` `YAML` ```python [root@master ~]# salt --out=yaml '*' cmd.run_all 'hostname' slave: pid: 13786 retcode: 0 stderr: '' stdout: sl