1. 程式人生 > 實用技巧 >自動化運維工具SaltStack(1)

自動化運維工具SaltStack(1)

目錄

1. SaltStack介紹


1.1 自動化運維工具

作為一個運維人員,很大一部分工作是在業務的配置管理和狀態維護以及版本釋出上,而當業務場景及公司規模上了一定規模後,人為手工的去做這些工作將變得極其困難,此時我們將需要利用一些自動化運維的工具來達到批量管理的目的。

常用的自動化運維工具有:

  • puppet
  • ansible
  • saltstack

此三款屬同類工具,皆可用來提高運維管理的效率,但它們又各有優勢,目前主流的自動化運維工具是ansiblesaltstack。其中ansible無需安裝客戶端,這是其最大的優勢,而saltstack則需要安裝客戶端工具,類似zabbix的agent。應用場景方面,ansible常用於小型企業,而saltstack則常用於中大型企業,因為ansible無法並行執行而saltstack可以並行。但不論其特點如何,本質上均屬同類,所以只需要掌握一種即可輕鬆勝任運維工作。

可以將SaltStack理解為神筆馬良的那隻筆!

1.2 saltstack的特點

  • 基於python開發的C/S架構配置管理工具
  • 底層使用ZeroMQ訊息佇列pub/sub方式通訊
  • 使用SSL證書籤發的方式進行認證管理,傳輸採用AES加密

1.3 saltstack服務架構

saltstack架構中伺服器端叫Master,客戶端叫Minion

MasterMinion端都是以守護程序的模式執行,一直監聽配置檔案裡面定義的ret_port(接受minion請求)和publish_port(釋出訊息)的埠。

Minion執行時會自動連線到配置檔案裡面定義的Master地址ret_port埠進行連線認證。

saltstack除了傳統的C/S架構外,其實還有一種叫做masterless

的架構,其不需要單獨安裝一臺 master 伺服器,只需要在每臺機器上安裝 Minion端,然後採用本機只負責對本機的配置管理機制服務的模式。

2. SaltStack四大功能與四大執行方式


SaltStack有四大功能,分別是:

  • 遠端執行
  • 配置管理/狀態管理
  • 雲管理(cloud)
  • 事件驅動

SaltStack可以通過遠端執行實現批量管理,並且通過描述狀態來達到實現某些功能的目的。

SaltStack四大執行方式:

  • local本地執行
  • Master/Minion傳統方式
  • Syndic分散式
  • Salt ssh

3. SaltStack元件介紹

元件 功能
Salt Master 用於將命令和配置傳送到在受管系統上執行的Salt minion
Salt Minions 從Salt master接收命令和配置
Execution Modules 從命令行鍼對一個或多個受管系統執行的臨時命令。對...有用:
1. 實時監控,狀態和庫存
2. 一次性命令和指令碼
3. 部署關鍵更新
Formulas (States) 系統配置的宣告性或命令式表示
Grains Grains是有關底層受管系統的靜態資訊,包括作業系統,記憶體和許多其他系統屬性。
Pillar 使用者定義的變數。這些安全變數被定義並存儲在Salt Master中,然後使用目標“分配”給一個或多個Minion。
Top File 將Formulas (States)和Salt Pillar資料與Salt minions匹配。
Runners 在Salt master上執行的模組,用於執行支援任務。Salt runners報告作業狀態,連線狀態,從外部API讀取資料,查詢連線的Salt minions等。
Returners 將Salt minions返回的資料傳送到另一個系統,例如資料庫。Salt Returners可以在Salt minion或Salt master上執行。
Reactor 在SaltStack環境中發生事件時觸發反應。
Salt Cloud / Salt Virt 在雲提供商/虛擬機器管理程式上提供系統,並立即將其置於管理之下。
Salt SSH 在沒有Salt minion的系統上通過SSH執行Salt命令。

4. SaltStack安裝與最小化配置

環境說明:

主機型別 IP地址 所需應用
控制機 192.168.159.136 salt
salt-cloud
salt-master
salt-minion
salt-ssh
salt-syndic
被控機 192.168.159.137 salt-minion

官方yum源地址

4.1 在控制機上安裝saltstack主控端軟體

//配置yum源
[root@node01 ~]# wget https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
--2020-08-04 20:11:08--  https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
正在解析主機 repo.saltstack.com (repo.saltstack.com)... 143.204.131.116, 143.204.131.17, 143.204.131.6, ...
正在連線 repo.saltstack.com (repo.saltstack.com)|143.204.131.116|:443... 已連線。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:5748 (5.6K) [application/octet-stream]
正在儲存至: “salt-repo-latest-2.el7.noarch.rpm”

100%[============================================>] 5,748       --.-K/s 用時 0s      

2020-08-04 20:11:19 (494 MB/s) - 已儲存 “salt-repo-latest-2.el7.noarch.rpm” [5748/5748])

[root@node01 ~]# ls
anaconda-ks.cfg  salt-repo-latest-2.el7.noarch.rpm

//安裝saltstack主控端
[root@node01 ~]# yum -y install salt salt-cloud salt-master salt-minion salt-ssh salt-syndic

//修改主控端的配置檔案
[root@node01 ~]# sed -i '/^#master:/a master: 192.168.159.136' /etc/salt/minion
[root@node01 ~]# sed -n '/^master/p' /etc/salt/minion
master: 192.168.159.136

//啟動主控端的salt-master和salt-minion,並設定開機自啟
[root@node01 ~]# systemctl enable --now salt-master salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.
[root@node01 ~]# ss -anlt
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128             *:22                          *:*                  
LISTEN     0      100             *:4505                        *:*                  
LISTEN     0      100     127.0.0.1:25                          *:*                  
LISTEN     0      100             *:4506                        *:*                  
LISTEN     0      128            :::22                         :::*                  
LISTEN     0      100           ::1:25                         :::* 

4.2 在被控機上安裝salt-minion客戶端

//配置yum源
[root@node02 ~]# wget wget https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
--2020-07-31 18:09:54--  http://wget/
Resolving wget (wget)... failed: Name or service not known.
wget: unable to resolve host address ‘wget’
--2020-07-31 18:10:09--  https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
Resolving repo.saltstack.com (repo.saltstack.com)... 13.225.146.4, 13.225.146.26, 13.225.146.60, ...
Connecting to repo.saltstack.com (repo.saltstack.com)|13.225.146.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5748 (5.6K) [application/octet-stream]
Saving to: ‘salt-repo-latest-2.el7.noarch.rpm’

100%[============================================>] 5,748       --.-K/s   in 0s      

2020-07-31 18:10:10 (1.76 GB/s) - ‘salt-repo-latest-2.el7.noarch.rpm’ saved [5748/5748]

FINISHED --2020-07-31 18:10:10--
Total wall clock time: 16s
Downloaded: 1 files, 5.6K in 0s (1.76 GB/s)

//安裝saltstack備控端
[root@node02 ~]# yum -y install salt-minion

//修改被控端的配置檔案,將master設為主控端的IP
[root@node02 ~]# sed -i '/^#master:/a master: 192.168.159.136' /etc/salt/minion
[root@node02 ~]# sed -n '/^master/p' /etc/salt/minion
master: 192.168.159.136

//啟動受控端的salt-minion並設定開機自啟
[root@node02 ~]# systemctl enable --now salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.

4.3 saltstack配置檔案

saltstack的配置檔案在/etc/salt目錄
saltstack配置檔案說明:

配置檔案 說明
/etc/salt/master 主控端(控制端)配置檔案
/etc/salt/minion 受控端配置檔案

配置檔案/etc/salt/master預設的配置就可以很好的工作,故無需修改此配置檔案。
配置檔案/etc/salt/minion常用配置引數

  • master:設定主控端的IP
  • id:設定受控端本機的唯一識別符號,可以是ip也可以是主機名或自取某有意義的單詞

在日常使用過程中,經常需要調整或修改Master配置檔案,SaltStack大部分配置都已經指定了預設值,只需根據自己的實際需求進行修改即可。下面的幾個引數是比較重要的

  • max_open_files:可根據Master將Minion數量進行適當的調整
  • timeout:可根據Master和Minion的網路狀況適當調整
  • auto_accept和autosign_file:在大規模部署Minion時可設定自動簽證
  • master_tops和所有以external開頭的引數:這些引數是SaltStack與外部系統進行整合的相關配置引數

5. SaltStack認證機制


saltstack主控端是依靠openssl證書來與受控端主機認證通訊的,受控端啟動後會傳送給主控端一個公鑰證書檔案,在主控端用salt-key命令來管理證書。
salt-minion與salt-master的認證過程:

  • minion在第一次啟動時,會在/etc/salt/pki/minion/下自動生成一對金鑰,然後將公鑰發給master
  • master收到minion的公鑰後,通過salt-key命令接受該公鑰。此時master的/etc/salt/pki/master/minions目錄將會存放以minion id命名的公鑰,然後master就能對minion傳送控制指令了
//salt-key常用選項
    -L      //列出所有公鑰資訊
    -a minion    //接受指定minion等待認證的key
    -A      //接受所有minion等待認證的key
    -r minion    //拒絕指定minion等待認證的key
    -R      //拒絕所有minion等待認證的key
    -f minion   //顯示指定key的指紋資訊
    -F      //顯示所有key的指紋資訊
    -d minion   //刪除指定minion的key
    -D      //刪除所有minion的key
    -y      //自動回答yes

//接受所有的key
[root@node01 salt]# salt-key -Ay
The following keys are going to be accepted:
Unaccepted Keys:
node01
node02
Key for minion node01 accepted.
Key for minion node02 accepted.

//檢視當前證書情況
[root@node01 salt]# salt-key -L
Accepted Keys:
node01
node02
Denied Keys:
Unaccepted Keys:
Rejected Keys:

6. SaltStack遠端執行


//測試指定受控端node02主機是否存活
[root@node01 ~]# salt 'node02' test.ping
node02:
    True
[root@node01 ~]# salt 'node02' cmd.run hostname
node02:
    node02

//測試所有受控端主機是否存活
[root@node01 ~]# salt '*' test.ping
node02:
    True
node01:
    True

7. salt命令使用


//語法:salt [options] '<target>' <function> [arguments]

//常用的options
    --version       //檢視saltstack的版本號
    --versions-report   //檢視saltstack以及依賴包的版本號
    -h      //檢視幫助資訊
    -c CONFIG_DIR   //指定配置檔案目錄(預設為/etc/salt/)
    -t TIMEOUT      //指定超時時間(預設是5s)
    --async     //非同步執行
    -v      //verbose模式,詳細顯示執行過程
    --username=USERNAME     //指定外部認證使用者名稱
    --password=PASSWORD     //指定外部認證密碼
    --log-file=LOG_FILE     //指定日誌記錄檔案
    
//常用target引數
    -E      //正則匹配
    -L      //列表匹配 
    -S      //CIDR匹配網段
    -G      //grains匹配
    --grain-pcre    //grains加正則匹配
    -N      //組匹配
    -R      //範圍匹配
    -C      //綜合匹配(指定多個匹配)
    -I      //pillar值匹配

//示例
[root@node01 ~]# salt -E 'node*' test.ping
node02:
    True
node01:
    True

[root@node01 ~]# salt -L node01,node02 test.ping
node02:
    True
node01:
    True

[root@node01 ~]# salt -S '192.168.159.0/24' test.ping
node02:
    True
node01:
    True