Linux -- SaltStack

一. 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值。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章