【搭建Saltstack運維工具】
目錄
@(Saltstack)
***
所謂Salt
Saltstack是由thomas Hatch於2011年建立的一個開源專案,設計初衷是為了實現一個快速的遠端執行系統
.
Salt有多強大!
系統管理元日常會進行大量的重複性操作,例如安裝軟體,修改配置檔案,建立使用者,批量執行命令等等,如果主機數量龐大, 單靠人工維護是在讓人難以忍受.
早期的運維人員會根據生產環境編寫特定的指令碼來完成大量的重複性工作,這些指令碼複雜且難以維護,系統管理員面臨的問題主要是系統配置管理、遠端執行命令。因此而誕生了很多開源軟體,系統維護方面的有fabric
、puppet
、chef
、ansible
、Saltstack
等,這些軟體擅長維護系統狀態或方便的對大量主機進行批量的命令執行.
Salt靈活性強大,可以進行大規模部署,也能進行小規模的系統部署,Salt的設計構造適用於任意數量的伺服器,從少量本地網路系統到跨越整個資料中心,擴撲架構都是C/S模型,配置簡單.
不管是幾臺、幾百臺、幾千臺伺服器,都可以使用Salt在一箇中心節點上進行管控,靈活定位任意伺服器子集來執行命令.
Salt是使用Python語言編寫的
,支援使用者通過Python自定義功能模組,也提供了大量的Python API介面,使用者可以根據需要進行簡單快速的擴充套件.
Saltstack執行方式
- Local本地執行,交付管理
- Master/Minion 常用管理
- Salt SSH 不需要客戶端
Saltstack部署基本架構
在開始搭建之前,先理解Salt結構中各個角色:
主要區分salt-master
和salt-minion
,前者是中心控制系統
,後者是被管理的客戶端
.
在遠端執行系統中,Salt用Python通過函式呼叫完成任務.
***
開始搭建
搭建環境
- 192.168.43.43 master
- 192.168.43.100 slave01
- 192.168.43.200 slave02
安裝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快取
搞定後,開始在對應的伺服器上安裝物件的包:
yum -y install salt-master # 中心控制系統 yum -y install salt-minion # 被管理的客戶端
Salt埠
安裝好Salt後開始配置,其中salt-master
預設監聽兩個埠:
publish_port 4505
提供遠端命令傳送功能ret_port 4506
提供認證,檔案服務,結果收集等功能
Salt配置檔案
配置檔案中包含了大量可調整的引數,這些引數控制master和minion各個方面.
salt-master的配置檔案為/etc/salt/master
.
salt-minion的配置檔案為/etc/salt/minion
.
salt-master# ⚠️冒號":"後面必須留一個空格 # 繫結到本地的0.0.0.0地址 interface: 0.0.0.0 # 執行salt程式的使用者,影響到salt的執行許可權 user: root # salt的執行執行緒,開的執行緒越多一般處理的速度越快,但一般不要超過CPU的個數 worker_threads: 10 # master的管理埠 publish_port: 4505 # master跟minion的通訊埠,用於檔案服務,認證,接收返回結果等 ret_port: 4506 # 如果這個master執行的salt-syndic連線到了一個更層級別的master # 那麼這個引數需要配置成連線到這個高層級別的master的監聽埠 syndic_master_port: 4506 # 指定pid檔案位置 pidfile: /var/run/salt/master.pid
salt-minion
# minion的識別ID,可以是IP,域名,或是可以通過DNS解析的字串 id: slave01 # 這裡展示的slave01主機的配置檔案,slave02主機的id為slave02 # salt執行的使用者許可權 user: root # master的識別ID,可以是IP,域名,或是可以通過DNS解析的字串 master : master # master通訊埠 master_port: 4506 # 備份模式,minion是本地備份,當進行檔案管理時的檔案備份模式 backup_mode: minion # 執行salt-call時候的輸出方式 output: nested # minion等待master接受認證的時間 acceptance_wait_time: 10 # 失敗重連次數,0表示無限次,非零會不斷嘗試到設定值後停止嘗試 acceptance_wait_time_max: 0 # 重新認證延遲時間,可以避免因為master的key改變導致minion需要重新認證的syn風暴 random_reauth_delay: 60 # 日誌檔案位置 log_file: /var/logs/salt/minion.log
配置檔案寫好之後,還需要指明主機名與其ip的對應關係,可通過在
/etc/hosts
檔案新增主機資訊:192.168.1.100 slave01 192.168.1.200 slave02 # 這裡展示的master的hosts檔案,slave伺服器的hosts檔案請新增上對應的主機與IP
修改後,在對應的伺服器上啟動對應的服務:
systemctl start salt-master systemctl start salt-minion
配置接受金鑰
salt-key的引數
在接受金鑰之前,我們先來看看它有那些引數:
-L
檢視KEY狀態-A
認證所有金鑰-D
刪除所有金鑰-a
認證指定的key-d
刪除指定的key-r
登出掉指定的key(該狀態為未被認證)
開始接受金鑰
啟動minion後,minion會自動去尋找連線master,並請求master為其簽發證書.
待證書籤發完成後,master便會信任minion,此時便可通訊,它們之間的通訊是加密的.
salt-key命令用於管理minion金鑰,在master執行:
在master上檢視minion的金鑰資訊:# '*'代表所有salve主機 [[email protected] ~]# salt-key -f '*' # 還可以指定某一個主機 [[email protected] ~]# salt-key -f slave01</font>
在minion上檢視master的金鑰資訊:
[[email protected] ~]# salt-call --local key.finger
確認金鑰匹配後,在master上接受金鑰:
# -A:將允許所有的salve [[email protected] ~]# salt-key -A -y # -a:將允許指定的salve [[email protected] ~]# salt-key -a slave01
此時已經成功接受了金鑰.
我們再來看看金鑰資訊:
***
salt命令
日常命令引數
首先要知道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命令
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啟動指令碼
開始你的salt命令
***
test.ping# 檢測目標主機是否存活 [[email protected] ~]# salt '*' test.ping slave01: True slave02: True # '*'表示所有主機,將返回所有主機是否存活,也可以指定某一個主機. # test.ping是salt遠端執行的一個模組下面的方法.
test.ping是條很簡單的探測minion主機收否存活的命令,也是遠端執行命令,我們通過master傳送訊息給"*"所有的minion,並且告訴他們執行salt內建的命令(也是python模組中的一個函式),返回true表示slave機器監控存活.
test.echo[[email protected] ~]# salt slave01 test.echo 'is ok' slave01: is ok
test.fib
[[email protected] ~]# salt slave02 test.fib 8 slave02: |_ - 0 - 1 - 1 - 2 - 3 - 5 - 2.86102294922e-06
test.fib可生成斐波那契數列.
斐波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等於前兩項之和.
***
test模組實際上還有許多其它的函式,可通過salt '*' sys.list_functions test
檢視.
salt命令組成結構
在命令列輸入的命令都是 執行模組.
等到命令寫入到檔案中 就叫做狀態模組.
完整的五部分命令:
# --summary引數顯示salt命令的概要 [[email protected] ~]# salt --summary '*' cmd.run > 'hostname' slave02: slave02 slave01: slave01 ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 2 # of Minions Returned: 2 # of Minions Did Not Return: 0 -------------------------------------------
sys模組用於與系統互動,下面的命令將列出所有salt的sys模組:
[[email protected] ~]# salt '*' sys.list_modules
遠端執行命令模組
*
cmd
**
一個超級模組,所有shell命令都能執行:[[email protected] ~]# salt 'slave01' cmd.run hostname slave01: slave01 # 還可以使用cmd.run_all返回更詳細的資訊: [[email protected] ~]# salt 'slave01' cmd.run_all hostname
pkg
用於安裝軟體,其底層呼叫的是yum工具:# 在slave01上安裝nginx [[email protected] ~]# salt 'slave01' pkg.install "nginx" # 解除安裝slave01上的nginx [[email protected] ~]# salt 'slave01' pkg.remove "nginx" # 檢查pkg包的版本 [[email protected] ~]# salt 'slave01' pkg.version "nginx"
server
用於管理服務:[[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=json 與--out=yaml
***
--out=json
:# 返回的資料是Json型別,如下 [[email protected] ~]# salt --out=json 'slave01' cmd.run 'hostname' { "slave01": "slave01" }
--out=json
:[[email protected] ~]# salt --out=yaml 'slave01' cmd.run 'hostname' slave01: slave01
YAML詳解
在學習Saltstack過程中,第一要點就是States編寫技巧,簡稱SLS檔案,這個檔案遵循YAML語法.
json、xml、yaml都是資料序列化格式,yaml容易被解析,應用於配置檔案.
Salt的配置檔案就是yaml格式,不能使用tab鍵.
還有saltstack
、k8s
、ansible
都用的yaml格式配置檔案.
YAML語法規則
- 大小寫敏感
- 使用縮排表示層級關係,縮排不可用tab鍵
- 縮排的空格數不重要,相同層級的元素左側對其即可
- "#"號表示註釋行
YAML是YAML Ain't Markup Language的首字母縮寫,YAML的語法簡單:
結構體通過空格展示
專案使用-
代表
鍵值對通過:
分割
YAML語法遵循固定的縮排風格,表示資料層級結構關係,saltstack需要每個縮排級別由2個空格組成,不可使用tab鍵.
YAML與JSON格式對比
***
YAMLfirst_key: second_key:second_value
JSON
{ 'first_key':{ 'second_key':'second_value', } }
短橫槓
***
YAML語法表示列表,使用一個橫槓加一個空格,多個項使用同樣的縮排級別作為同一個列表的部分,如下圖:
列表可以作為一個鍵值對的value,例如一次性要安裝多個軟體:
目標定位字串
之前的salt命令我們都是使用salt '*'控制所有minion,並且我們只有兩臺minion,但是生產環境的伺服器很可能是成千上百的minion,因此需要靈活地定位所需的伺服器並且執行遠端命令.
全域性匹配
[[email protected] ~]# salt '*' test.ping slave01: True slave02: True
Linux萬用字元
*
代表任意字元,或空字串?
代表任意一個字元,不可以為空[a-z]
任何一個小寫字母[0-9]
任何一個數字
示例:
[[email protected] ~]# salt 'slave0[1-2]' test.ping [[email protected] ~]# salt 'slave0?' test.ping # 以上兩條都可以匹配到slave01和slave02主機
state模組定義主機狀態
之前執行的遠端命令,都是一個過程式的,類似一段shell或者python指令碼執行,執行一次觸發一次相同的功能.
那麼大量的minion上執行遠端命令就必須使用salt提供的“狀態管理”了,狀態是對minion的一種描述和定義,運維不需要關心部署是如何完成的,只需要描述minion需要達到什麼狀態.
下面我們將通過state模組來部署nginx
***
開啟master的配置檔案/etc/salt/master
,加入如下配置:# 必須嚴格遵循語法,空格,不可用tab鍵 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - /srv/salt/prod # 修改master配置檔案後重啟服務
建立資料夾(此步驟master與minion都要執行):
# 在master和minion上都要建立: mkdir -p /srv/salt/{base,dev,test,prod}
在
/srv/salt/base
下建立nginx.sls
檔案,其檔案內容如下(此步驟master與minion都要執行):nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True
此時用state模組部署nginx軟體,通過我們編寫的nginx.sls描述性配置檔案,命令列呼叫state模組的sls函式:
# 啟動命令,執行後nginx將被安裝且啟用,可進行狀態管理 [[email protected] ~]# salt 'slave01' state.sls nginx
解釋下nginx.sls描述檔案:
sls配置檔案都遵循YAML語言描述
第一條命令使用了pkg.install安裝命令,相對於運行了yum install,而此時state模組會判斷nginx是否安裝了,如果沒有安裝就進行安裝,安裝了就什麼都不做.
狀態描述都會遵循這個原則,只有檢測到真實狀態和所需狀態不一就會執行此功能,這種性質叫做冪等性
.
***
Salt採集靜態資訊之GrainsSalt
待