一. SaltStack簡介
- saltstack是一個配置管理系統,能夠維護預定義狀態的遠程節點
- saltstack是一個分佈式遠程執行系統,用來在遠程節點上執行命令和查詢數據
- saltstack是運維人員提高工作效率、規範業務配置與操作的利器
1. Salt的核心功能
- 使命令發送到遠程系統是並行的而不是串行的
- 使用安全加密的協議
- 使用最小最快的網絡載荷
- 提供簡單的編程接口
Salt同樣引入了更加細緻化的領域控制系統來遠程執行,使得系統成爲目標不止可以通過主機名,還可以通過系統屬性。
2. Salt的基本原理
SaltStack 採用 C/S模式,server端就是salt的master,client端就是minion,minion與master之間通過ZeroMQ消息隊列通信,默認監聽4505端口
minion上線後先與master端通信,將pub key發過去,此時master端通過salt-key -L命令可以查看minion的key,通過salt-key -a添加連接
二. SaltStack安裝
官網:https://www.saltstack.com/
設置官方YUM倉庫:
master端設置 :
yum install -y salt-master #安裝master端
systemctl enable --now salt-master.service #啓動master並設置master自啓動
minion 端配置:
vim /etc/salt/minion master: 192.168.1.21 #設置master主機的ip
systemctl enable --now salt-minion.service ##啓動minion並設置開機自啓動
master端查看連接請求:
salt-key -L
master端執行命令允許minion連接:
salt-key -A ##添加所有 -a可指定添加
查看結果:
master端測試與minion端的連接:
salt '*' test.ping
三. saltstack遠程執行
1. Salt命令由三個主要部分構成:
salt '<target>' <function> [arguments]
target: 指定minion, 默認的規則是使用glob匹配minion id.
# salt '*' test.ping
Targets也可以使用正則表達式:
salt -E 'server1[2-3]' test.ping
Targets也可以指定列表:
salt -L 'server12,server13' test.ping
funcation是module提供的功能,Salt內置了大量有效的functions.
salt '*' cmd.run 'uname -a'
arguments通過空格來界定參數:
salt 'server13' sys.doc pkg #查看模塊文檔
salt內置的執行模塊列表:
http://docs.saltstack.cn/ref/modules/all/index.html
2. 編寫遠程執行模塊
編輯master配置文件:
vim /etc/salt/master
重啓master服務:
systemctl restart salt-master.service
創建模塊目錄:
mkdir -p /srv/salt/_modules
編寫模塊文件:
vim /srv/salt/_modules/mydisk.py
同步模塊:
salt server12 saltutil.sync_modules
運行模塊:
salt server12 mydisk.df
YAML語法:
規則一: 縮進
Salt需要每個縮進級別由兩個空格組成,不要使用tabs。
規則二: 冒號
字典的keys在YAML中的表現形式是一個以冒號結尾的字符串。 my_key: my_value
規則三: 短橫槓
想要表示列表項,使用一個短橫槓加一個空格。 - list_value_one - list_value_two
配置管理:
創建一個sls文件:
vim /srv/salt/apache.sls
指定主機執行:
salt server2 state.sls apache
準備Top文件:
vim /srv/salt/top.sls
批量執行:
salt '*' state.highstate
可以看到server12因爲剛纔安裝過了,所以是綠色的,表示狀態一致不需要進行,server13是藍色的,成功安裝httpd,這和ansible很相似
Salt 狀態系統的核心是SLS,或者叫SaLt State 文件。
SLS表示系統將會是什麼樣的一種狀態,而且是以一種很簡單的格式來包含這些數據,常被叫做配置管理。
sls文件命名:
- sls文件以”.sls”後綴結尾,但在調用時是不需要寫後綴的。
- 使用子目錄來做組織是個很好的選擇。
- init.sls 在一個子目錄裏面表示引導文件,也就表示子目錄本身, 所以``apache/init.sls`` 就是表示``apache``. 如果同時存在apache.sls 和 apache/init.sls,則 apache/init.sls 被忽略,apache.sls將被用來表示apache.
四. grains與pillar
1. grains
a) grains簡介
Grains是SaltStack的一個組件,存放在SaltStack的minion端。
當salt-minion啓動時會把收集到的數據靜態存放在Grains當中,只有當minion重啓時纔會進行數據的更新。 由於grains是靜態數據,因此不推薦經常去修改它。
應用場景:
- 信息查詢,可用作CMDB。
- 在target中使用,匹配minion。
- 在state系統中使用,配置管理模塊。
b) 信息查詢:
用於查詢minion端的IP、FQDN等信息。
默認可用的grains:
salt '*' grains.ls
查看每一項的值:
salt '*' grains.items #items表示查看所有
salt '*' grains.item ipv4 #只查看ip
c) 自定義grains項:
在/etc/salt/minion中定義:
minion(server1):
vim /etc/salt/minion
重啓salt-minion,否則數據不會更新:
查看:
salt server1 grains.item roles
在/etc/salt/grains中定義:
vim /etc/salt/grains
同步數據:
salt server1 saltutil.sync_grains
查詢自定義項:
salt server1 grains.item deployment
d) 編寫grains模塊
在salt-master端創建_grains目錄:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
1 def my_grain():
2 grains = {}
3 grains['roles'] = 'nginx'
4 grains['hello'] = 'world'
5 return grains
同步grains到minion端:
salt '*' saltutil.sync_grains
e) grains匹配運用
在target中匹配minion:
salt -G roles:memcache cmd.run hostname
salt -G roles:nginx cmd.run hostname
在top文件中匹配:
vim /srv/salt/top.sls
2. pillar
a) 簡介
- pillar和grains一樣也是一個數據系統,但是應用場景不同。
- pillar是將信息動態的存放在master端,主要存放私密、敏感信息(如用戶名密碼等),而且可以指定某一個minion纔可以看到對應的信息。
- pillar更加適合在配置管理中運用。
b) 聲明pillar
定義pillar基礎目錄:
vim /etc/salt/master
mkdir /srv/pillar
重啓salt-master服務:
systemctl restart salt-master.service
c) 自定義pillar項
vim /srv/pillar/top.sls
mkdir /srv/pillar/packages
vim /srv/pillar/packages/init.sls
刷新pillar數據:
salt '*' saltutil.refresh_pillar
查詢pillar數據:
salt '*' pillar.items
d) pillar數據匹配
命令行中匹配:
salt -I 'package:httpd' test.ping
salt -I 'package:mairadb' test.ping
系統中使用pillar數據:
vim /srv/salt/apache.sls
salt server13 state.sls apache
五. Jinja模板
1. Jinja模板簡介
Jinja是一種基於python的模板引擎,在SLS文件裏可以直接使用jinja模板來做一些操作。 通過jinja模板可以爲不同服務器定義各自的變量。
兩種分隔符: {% ... %} 和 {{ ... }},前者用於執行諸如 for 循環或賦值的語句,後者把表達式的結果打印到模板上。
2. Jinja模板使用方式
Jinja最基本的用法是使用控制結構包裝條件:
vim /srv/salt/testjinjia.sls
salt '*' state.sls testjinjia
Jinja在普通文件的使用:
複製一份http配置文件到salt目錄下:
cp /mnt/httpd.conf /srv/salt/
修改模板文件(引用變量port):
vim /srv/salt/httpd.conf
vim /srv/salt/apache.sls
salt '*' state.sls apache
查看結果:
cat /etc/httpd/conf/httpd.conf | grep '^Listen'
import方式,可在state文件之間共享:
定義變量文件
vim lib.sls
導入
vim /srv/salt/httpd.conf
salt '*' state.sls apache
六. Job管理
1. 簡介
- master在下發指令任務時,會附帶上產生的jid。
- minion在接收到指令開始執行時,會在本地的/var/cache/salt/minion/proc目錄下產生該jid命名的文件,用於在執行過程中master查看當前任務的執行情況。
- 指令執行完畢將結果傳送給master後,刪除該臨時文件。
2. Job cache
Job緩存默認保存24小時:
vim /etc/salt/master
master端Job緩存目錄:
/var/cache/salt/master/jobs
3. Job持久化(存儲到數據庫)
修改master端配置:
vim /etc/salt/master
重啓salt-master服務:
安裝數據庫以及相關插件:
yum install -y mariadb-server MySQL-python
MySQL-python插件必須安裝,否則salt無法與mysql通信
啓動數據庫:
systemctl start mariadb.service
安全初始化:
mysql_secure_installation
創建sql模板(官網文檔上可以找到):
vim salt.sql
導入數據庫:
mysql -p < salt.sql
數據庫授權:
grant all on salt.* to salt@'192.168.1.%' identified by 'salt';
這裏是因爲master和數據庫在同一主機,所以授權本機就可以,如果從minion上傳數據庫,那也要進行相應的授權
查看數據庫:
執行一次遠程任務:
查看數據庫:
select * from salt_returns;
4. Job管理
查看所有minion當前正在運行的jobs(在所有minions上運行saltutil.running)
salt-run jobs.active
列出當前master jobs cache中所有job
salt-run jobs.list_jobs
從master jobs cache中查詢指定jid的運行結果
salt-run jobs.lookup_jid <jid>
七、salt-ssh與salt-syndic
1. salt-ssh
a) 簡介
- salt-ssh可以獨立運行的,不需要minion端。
- salt-ssh 用的是sshpass進行密碼交互的。
- 以串行模式工作,性能下降。
安裝salt-ssh:
yum install -y salt-ssh
b) salt-ssh配置
配置roster(相當於ansible的inventory清單)文件,默認的本地路徑是 /etc/salt/roster
vim /etc/salt/roster
測試:
salt-ssh '*' test.ping -i ##連接詢問加 -i 參數
或者編寫配置文件添加以下內容
vim ~/.ssh/config
StrictHostKeyChecking no
salt-ssh是串行的,效率低下,是爲了補充salt需要客戶端的缺陷,但推薦使用ansible(不需要客戶端),ansible相比salt-ssh效率提升很多
2. salt-syndic
a) salt-syndic簡介
- 如果大家知道zabbix proxy的話那就很容易理解了,syndic其實就是個代理,隔離master與minion。
- Syndic必須要運行在master上,再連接到另一個topmaster上。
- Topmaster 下發的狀態需要通過syndic來傳遞給下級master,minion傳遞給master的數據也是由syndic傳遞給topmaster。
- topmaster並不知道有多少個minion。
- syndic與topmaster的file_roots和pillar_roots的目錄要保持一致。
b) salt-syndic配置
topmaster端:
安裝salt-master
yum install -y salt-master
vim /etc/salt/master ##作爲頂級master
systemctl start salt-master.service
# salt-key -L #查看下級master的連接授權
# salt-key -A
下級master端 :
安裝salt-syndic
yum install -y salt-syndic
vim /etc/salt/master
指向topmaster
重啓服務:
systemctl restart salt-master
systemctl start salt-syndic
八. salt-api配置
1. salt-api簡介
SaltStack 官方提供有REST API格式的 salt-api 項目,將使Salt與第三方系統集成變得尤爲簡單。
官方提供了三種api模塊:
- rest_cherrypy
- rest_tornado
- rest_wsgi
官方鏈接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules
2. salt-api配置
安裝salt-api:
yum install -y salt-api.noarch python-cherrypy.noarch
生成證書:
cd /etc/pki/tls/private
openssl genrsa 2048 > localhost.key
cd /etc/pki/tls/certs
make testcert //根據提示填寫相關信息即可
創建用戶認證文件:
useradd -s /sbin/nologin saltapi
echo westos | passwd --stdin saltapi
vim /etc/salt/master.d/auth.conf
激活rest_cherrypy模塊:
vim /etc/salt/master.d/api.conf
重啓服務:
systemctl restart salt-master
systemctl start salt-api
3. salt-api使用
獲取認證token:
curl -sSk https://192.168.1.24:8000/login \
-H 'Accept: application/x-yaml' \
-d username=saltapi \
-d password=redhat \
-d eauth=pam
推送任務:
curl -sSk https://192.168.1.24:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 244c45ae5e3329f085a930eeb2d8ebab479ba469'\
-d client=local \
-d tgt='*' \
-d fun=test.ping
token值是上面命令獲取的toekn值。