saltstack簡介
saltstack是一個配置管理系統,能夠維護預定義狀态的遠端節點。
saltstack是一個分布式遠端執行系統,用來在遠端節點上執行指令和查詢資料。
saltstack是運維人員提高工作效率、規範業務配置與操作的利器。
Salt的核心功能
使指令發送到遠端系統是并行的而不是串行的
使用安全加密的協定
使用最小最快的網絡載荷
提供簡單的程式設計接口
Salt同樣引入了更加細緻化的領域控制系統來遠端執行,使得系統成為目标不止可以通過主機名,還可以通過系統屬性。
saltstack通信機制
SaltStack 采用 C/S模式,minion與master之間通過ZeroMQ消息隊列通信,預設監聽4505端口。

Salt Master運作的第二個網絡服務就是ZeroMQ REP系統,預設監聽4506端口。
saltstack安裝與配置
官網:https://www.saltstack.com/
設定官方YUM倉庫:
#yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
master端設定:
#yum install -y salt-master #安裝master端
#systemctl enable salt-master #設定master自啟動
#systemctl start salt-master #啟動master服務
minion端配置:
#yum install -y salt-minion #安裝minion端
#vim /etc/salt/minion
master: 172.25.0.1 #設定master主機的ip
#systemctl enable salt-minion
#systemctl start salt-minion
master端執行指令允許minion連接配接:
插圖:
master端測試與minion端的連接配接
插圖:
saltstack遠端執行
遠端執行shell指令
Salt指令由三個主要部分構成:
salt ‘’ [arguments]
target: 指定哪些minion, 預設的規則是使用glob比對minion id.
#salt ‘*’ test.ping
Targets也可以使用正規表達式:
#salt -E ‘server[1-3]’ test.ping
Targets也可以指定清單:
#salt -L ‘server2,server3’ test.ping
funcation是module提供的功能,Salt内置了大量有效的functions.
#salt '*' cmd.run 'uname -a'
arguments通過空格來界定參數:
#salt 'server2' sys.doc pkg #檢視子產品文檔
#salt 'server2' pkg.install httpd
#salt 'server2' pkg.remove httpd
salt内置的執行子產品清單:
http://docs.saltstack.cn/ref/modules/all/index.html
編寫遠端執行子產品
編輯master配置檔案:
vim /etc/salt/master
file_roots:
base:
- /srv/salt
重新開機master服務:
systemctl restart salt-master
建立子產品目錄:
#mkdir /srv/salt/_modules
編寫子產品檔案:
vim /srv/salt/_modules/mydisk.py
def df():
return __salt__['cmd.run']('df -h')
同步子產品:
salt server2 saltutil.sync_modules
運作子產品:
#salt server2 mydisk.df
插圖:
了解YAML文法
規則一: 縮進
Salt需要每個縮進級别由兩個空格組成,不要使用tabs。
規則二: 冒号
字典的keys在YAML中的表現形式是一個以冒号結尾的字元串。
my_key: my_value
規則三: 短橫杠
想要表示清單項,使用一個短橫杠加一個空格。
- list_value_one
- list_value_two
配置管理
建立一個sls檔案:
#vim /srv/salt/apache.sls
httpd: # ID聲明
pkg: # 狀态聲明
- installed # 函數聲明
指定主機執行:
#salt server2 state.sls apache
準備Top檔案:
#vim /srv/salt/top.sls
base:
'*':
- apache
批量執行:
#salt ‘*’ state.highstate
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詳解
grains簡介
Grains是SaltStack的一個元件,存放在SaltStack的minion端。
當salt-minion啟動時會把收集到的資料靜态存放在Grains當中,隻有當 minion重新開機時才會進行資料的更新。
由于grains是靜态資料,是以不推薦經常去修改它。
應用場景:
資訊查詢,可用作CMDB。
在target中使用,比對minion。
在state系統中使用,配置管理子產品。
資訊查詢
用于查詢minion端的IP、FQDN等資訊。
預設可用的grains:
#salt ‘*’ grains.ls
插圖:
檢視每一項的值:
salt ‘*’ grains.items
插圖:
取單項的值:
#salt server3 grains.item ipv4
#salt server3 grains.item fqdn
自定義grains項
在/etc/salt/minion中定義:
#vim /etc/salt/minion
grains:
roles:
- apache
- httpd
重新開機salt-minion,否則資料不會更新:
#systemctl restart salt-minion
在/etc/salt/grains中定義:
#vim /etc/salt/grains:
deployment: datacenter1
同步資料:
#salt server3 saltutil.sync_grains
查詢自定義項:
#salt server3 grains.item deployment
編寫grains子產品
在salt-master端建立_grains目錄:
#mkdir /srv/salt/_grains
#vim /srv/salt/_grains/my_grain.py
def my_grain():
grains = {}
grains['roles'] = 'nginx'
grains['hello'] = 'world'
return grains
#salt ‘*’ saltutil.sync_grains #同步grains到minion端
grains比對運用
在target中比對minion:
#salt -G roles:apache cmd.run hostname
在top檔案中比對:
#vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache.install
pillar簡介
pillar和grains一樣也是一個資料系統,但是應用場景不同。
pillar是将資訊動态的存放在master端,主要存放私密、敏感資訊(如使用者名密碼等),而且可以指定某一個minion才可以看到對應的資訊。
pillar更加适合在配置管理中運用。
聲明pillar
定義pillar基礎目錄:
#vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
#mkdir /srv/pillar
重新開機salt-master服務:
#/etc/init.d/salt-master restart
#vim /srv/pillar/top.sls
base:
'*':
- packages
#vim /srv/pillar/apache.sls
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}
重新整理pillar資料:
#salt ‘’ saltutil.refresh_pillar
查詢pillar資料:
#salt '’ pillar.items
#salt ‘*’ grains.item roles
指令行中比對:
#salt -I ‘roles:apache’ test.ping
state系統中使用:
#vim /srv/salt/apache.sls
apache:
pkg.installed:
- name: {{ pillar['package'] }}
-
Jinja模闆
Jinja模闆簡介
Jinja是一種基于python的模闆引擎,在SLS檔案裡可以直接使用jinja模闆來做一些操作。
通過jinja模闆可以為不同伺服器定義各自的變量。
兩種分隔符: {% … %} 和 {{ … }},前者用于執行諸如 for 循環 或指派的語句,後者把表達式的結果列印到模闆上。
Jinja模闆使用方式
Jinja最基本的用法是使用控制結構包裝條件:
#vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
Jinja在普通檔案的使用:
#vim /srv/salt/apache.sls
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd.conf
- template: jinja
- context:
bind: 172.25.2.2
import方式,可在state檔案之間共享:
定義變量檔案:
#vim lib.sls
{% set port = 80 %}
導入模闆檔案:
#vim httpd.conf
{% from ‘lib.sls’ import port %}
…
Listen {{ prot }}
引用變量
直接引用grains變量:
直接引用pillar變量:
在state檔案中引用:
- template: jinja
- context:
bind: {{ pillar['ip'] }}
Job管理
Job簡介
master在下發指令任務時,會附帶上産生的jid。
minion在接收到指令開始執行時,會在本地的/var/cache/salt/minion/proc目錄下産生該jid命名的檔案,用于在執行過程中master檢視目前任務的執行情況。
指令執行完畢将結果傳送給master後,删除該臨時檔案。
Job cache
Job緩存預設儲存24小時:
vim /etc/salt/master
keep_jobs: 24
master端Job緩存目錄:
/var/cache/salt/master/jobs
把Job存儲到資料庫
修改master端配置:
#vim /etc/salt/master
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
重新開機salt-master服務:
安裝mysql資料庫:
執行資料庫初始化腳本:
導入資料模闆:
在這裡插入代碼片
#mysql -p < salt.sql
建立資料庫授權:
salt.sql模闆内容:
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Job管理
檢視所有minion目前正在運作的jobs(在所有minions上運作saltutil.running)
salt-run jobs.active
列出目前master jobs cache中所有job
salt-run jobs.list_jobs
從master jobs cache中查詢指定jid的運作結果
salt-ssh與salt-syndic
salt-ssh簡介
salt-ssh可以獨立運作的,不需要minion端。
salt-ssh 用的是sshpass進行密碼互動的。
以串行模式工作,性能下降。
安裝salt-ssh:
salt-ssh配置
配置roster檔案,預設的本地路徑是 /etc/salt/roster:
server2:
host: 172.25.2.2
user: root
測試:
#salt-ssh ‘*’ test.ping -i //詢問密碼加 -i
#vim ~/.ssh/config
StrictHostKeyChecking no
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的目錄要保持一緻。
salt-syndic配置
topmaster端:
#vim /etc/salt/master
order_masters: True
#作為頂級master
#systemctl start salt-master
#salt-key -L #檢視下級master的連接配接授權
#salt-key -A
下級master端:
#yum install -y salt-syndic
#vim /etc/salt/master
#systemctl restart salt-master
#systemctl start salt-syndic
salt-api配置
salt-ssh可以獨立運作的,不需要minion端。
salt-ssh 用的是sshpass進行密碼互動的。
以串行模式工作,性能下降。
安裝salt-ssh:
#yum install -y salt-ssh
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
salt-api配置
安裝salt-api:
#yum install -y salt-api python-cherrypy
生成證書:
#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/eauth.conf
external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
激活rest_cherrypy子產品:
#vim /etc/salt/master.d/api.conf
rest_cherrypy:
host: 172.25.2.1
port: 8000
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost.key
重新開機服務:
#systemctl restart salt-master
#systemctl start salt-api
擷取認證token:
#curl -sSk https://172.25.2.1:8000/login \
-H 'Accept: application/x-yaml' \
-d username=saltapi \
-d password=westos \
-d eauth=pam
推送任務:
#curl -sSk https://172.25.0.1:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 77e2b1de04b0dbc0a4bf11900712b83e4fa2c241'\
-d client=local \
-d tgt='*' \
-d fun=test.ping
token值是上面指令擷取的toekn值。