1 概述
1. 關於saltstack
Salt是用Python編寫的一個基礎管理工具,能夠非常快速的運行以及具有良好的擴展性來管理成千上萬的服務器。Salt通過發送一個動態通訊總線來實現遠程執行、配置管理等等工作。
Salt採用zeromq消息隊列來進行通信,能夠提供很強的拓展性、靈活性和實時性。
2. 與Puppet、Fabric等的比較
Puppet作爲自動化配置管理工具,可以完成初始化和配置等一系列工作(比如,靜態 IP 配置,DNS 設置,NFS/SAN 掛載,LDAP/Kerberos 登錄,安全加固配置,內核參數優化,防火牆規則配置等等),等初始化完成後開始運行,運行一段時間後有一些需要自動和手動操作的任務(比如升級、重啓、備份等),這時候我們使用 Fabric來批量執行這些臨時任務。運維工作內容:
操作系統和軟件的安裝、配置、初始化等——Puppet、Chef、CFEngine、Ansible、Salt
自動執行任務,比如定期備份、清除日誌等——Fabric、Ansible、Salt
手動執行任務,比如部署應用、升級、重啓、檢查和校驗文件系統,增加用戶等——Fabric、Rake、Func、Ansible、Salt
可見,Salt(或Ansible)可以完成上述幾種不同的任務。
2 安裝、配置
Salt是基於主從模式的架構來實現配置管理的,在主控服務器上安裝服務器端軟件,即salt master,在多臺需要被管理和配置的受控機器上安裝客戶端軟件,即salt minion。在主控機器上給下屬(受控)發命令,在受控機器上接受和執行上級(主控)的命令。
1. 主控端
在官網上有很多安裝方式,CentOS上可使用rpm安裝(yum)
首先需要添加RPM源:
rpm -ivh http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-8.noarch.rpm
安裝:
yum install salt-master -y
配置:/etc/salt/master
配置好服務端監聽IP字段,此處爲主控服務器的IP:
interface: 192.168.56.1
啓動運行:
調試模式:salt-master -l debug
後臺daemon模式:salt-master -d
service模式:service salt-master start
監聽的端口:
4505(publish_port):salt消息發佈系統使用的tcp端口
4506(ret_port):salt客戶端與服務端通信的端口,包括文件服務器、認證等通信的執行,主要用來接受消息
需要配置好iptables等防火牆工具來確保客戶端能與服務端的這兩個端口通信
2. 受控端
安裝:yum install salt-minion -y
配置:/etc/salt/minion
master: salt 服務端主機名
id: 客戶端主機名 在服務端上顯示的客戶端的名字,若爲空則顯示受控端的hostname
運行:
調試模式:salt-minion -l debug
後臺daemon模式:salt-minion -d
service模式:service salt-minion start
3. 認證
salt minion和master的認證過程:
minion在第一次啓動時,會在/etc/salt/pki/minion下自動生成minion.pem(private key),然後將minion.pem發送給master
master在接收到minion的public key
後,通過salt-key命令accept minion public key,在master的/etc/salt/pki/master/minions下會存放以minion id命名的public key,然後master就能對minion發送指令了
具體執行如下:
啓動服務端:service salt-master start
啓動客戶端:service salt-minion start
服務端查看key:salt-key
Accepted Keys:
Unaccepted Keys:
vm1.sysu
vm2.sysu
vm3.sysu
vm4.sysu
Rejected Keys:
服務端接受key:
salt-key -A
測試:salt ‘vm1.sysu’ test.ping
vm1.sysu:
True
查看salt更多命令和手冊:salt ‘*’ sys.doc
3 salt使用
1. 幾個關鍵詞
targeting:目標匹配
salt ‘*’ test.ping
引號中配合shell正則表達式能夠實現很強大的minion的過濾和匹配技術
示例:salt -C ‘webserv* and G@os:Debian or E@web-dc1-srv.*’ test.ping
nodegroup:minion分組管理
在master的配置文件中按如下格式定義:
nodegroups:
group1:‘vm1.sysu,vm2.sysu’
group2:‘vm3.sysu,vm4.sysu’
grains:minion基本信息管理
基本使用:
salt '*' grains.ls 查看grains分類
salt '*' grains.items 查看grains的所有信息
salt 'vm3.sysu' grains.item pythonversion 查看單個信息
在用salt進行客戶端管理或編寫state的時候都可以引用grains的變量
pillar:salt對敏感信息的管理,只有匹配到的節點才能獲取和使用
默認位置:pillar數據定義文件存儲在:/srv/pillar
入口文件:/srv/pillar/top.sls
格式:
base:
“targeting”:
- $pillar #名字爲pillar.sls的文件來存放匹配到的minion的變量
查看節點的pillar數據:
salt ‘vm1.sysu’ pillar.data
2. 實時命令執行
臨時的執行一些命令,比如查看多臺機器的iptables情況,或者執行某個命令(重啓apache)
內建命令:
cmd.run:salt '*' cmd.run "hostname"
test.ping: salt '*' test.ping
salt有非常多的內建命令,以模塊的方式集成,查看salt所有內建模塊:
http://docs.saltstack.com/en/latest/ref/modules/all/index.html
3. 狀態管理
類似於puppet(Mcollective)的狀態管理,salt通過在服務端(主控)上定義好系統配置應該有的狀態,然後客戶端自動完成相應的操作和配置。salt基於state對minion進行狀態管理,state文件默認在/srv/salt目錄下。
查看salt所有狀態的模塊類型:http://docs.saltstack.com/en/latest/ref/states/all/index.html
state的結構:
$ID: #state的名字
$state: #要管理的模塊類型
- states #該模塊的狀態
示例:在所有受控機器上安裝vim軟件包,並使用自己定義的vimrc文件:/srv/salt/vim.sls
vim:
pkg.installed
/etc/vimrc文件:
syntax enable
set textwidth=79
set shiftwidth=4
set expandtab
set softtabstop=4
set shiftround
set fileencodings=utf-8
set ending=utf8
set tenc=utf8
強制執行這個狀態:
salt '*' state.sls vim
邏輯關係:
require:依賴於某個state,在運行此state之前,先運行依賴的state,可有多個依賴,類似於ansible的notify
httpd:
pkg.installed
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/httpd.conf
- require:
- pkg: httpd
watch:當某個state變化時運行此模塊
官方文檔中的一個例子是:service.running state使用watch,即當一個service watch一個state之後,那麼當被監視的狀態發生改變時,這個服務將被重新加載或者重啓,另外,salt能確保這個服務在運行狀態。
ntpd: service.running: - watch: - file: /etc/ntp.conf file.managed: - name: /etc/ntp.conf - source: salt://ntp/files/ntp.conf
ps:watch除具備require功能外,還增加了關注狀態的功能,另外還有與watch、require相反的watch_in和require_in
order:優先級設定,但比watch和require的優先級低;具有order指定的state比沒有order指定的優先級高。
vim:
pkg.installed:
- order: 1 #讓當前狀態第一個運行,如果該狀態依賴於其他狀態,依賴的狀態會在這個狀態運行前執行。
ps:使用值last可以讓某個state最後一個運行。
state與minion:臨時給某個minion部署一個state,即強制執行。
salt 'vm1.sysu' state.sls 'vim'
執行該命令後可以立即看到輸出結果。
highstate:給minion添加永久性的state。
狀態樹是位於定義在salt配置文件中的file_roots字段所指定的目錄下的SLS文件的集合,狀態樹能被組織成SLS模塊,從而形成永久性的state。
默認配置文件:/srv/salt/top.sls
語法:
base:
‘*’:
- core
- wsproxy
/srv/salt/目錄結構:
.
|— core.sls
|— top.sls
|— wsproxy
|— init.sls
|— websocket.py
|— websockify
應用:salt ‘vm1.sysu’ state.highstate
測試模式:salt ‘vm1.sysu’ state.highstate -v test=True
state schedule: salt的scheduling系統能夠使得minion定時自動去執行一些state,而不是要等到服務端被調用時才執行。
入口文件:/srv/pillar/top.sls
base:
'*':
- schedule
示例:/srv/pillar/schedule.sls
schedule:
job1:
function: state.sls
seconds: 3600
args:
- httpd
kwargs:
test: True
上述schedule將會排定一個命令:state.sls httpd test=True every 3600 seconds (every hour)
4. peer
peer提供了一種讓某些minions去發送命令的機制,目的是允許minions能夠互相傳遞命令。
peer的配置在master的配置文件的peer塊,默認爲:
peer:
.*: #有管理權限的minion節點,此處爲所有的minions
- .* #可以使用的module
默認爲所有的minion節點都有權限執行peer,而且能夠使用所有模塊。
5. runner
salt runner提供了一種靈活、快捷調用salt的方式,通過salt-run能直接運行在master上的代碼,即在master上執行命令而不是遠程的salt minions上。
runner代碼目錄配置在master的配置文件的runner_dirs字段:
runner_dirs: ['/srv/salt/_runner',]
實例測試:/srv/salt/_runner/foo.py:
def test():
print "Hello Jay!"
運行:salt-run foo.test
Hello Jay!
6. returner
默認情況下,salt發送到minion端的命令執行後的返回值會返回到master端,通過使用salt的returner,結果數據可以被重定向到外部的數據存儲區,以便用來分析和歸檔。returner接口能允許將結果數據發送到Redis服務器、MongoDB服務器、MySQL服務器等任何可以接收數據的系統。
使用示例:
salt '*' test.ping --return redis_return
上述命令會將ping執行後的結果發一份到redis數據庫中,其中redis_return是salt的一個returner接口,類似還有mongo_return,cassandra_returnd等。
由於salt的returner需要在minion上做配置,這樣子會比較麻煩,所以可以考慮自定義returner:
returner是一個包含了一個returner函數的python模塊,該函數需要接收一個返回數據的參數,示例如下:/srv/salt/_returners/local_return.py
import redis
import json
def returner(ret):
'''
Return information to a redis server
'''
#Get a redis connection
serv = redis.Redis(
host='redis-host',
port=6379
db='0')
serv.sadd("%(id)s:jobs" % ret, ret['jid'])
serv.set("%(jid)s:%(id)s" % ret, json.dumps(ret['return']))
serv.sadd('jobs', ret['jid'])
serv.sadd(ret['jid'], ret['id'])
同步到所有節點:salt '*' saltutil.sync_returners
7. Python client API:實現salt編程開發
示例:
import salt.client
local = salt.client.LocalClient()
ret = local.cmd('vm1.sysu', 'cmd.run', ['hostname'])
print ret
更多文檔參考:http://docs.saltstack.cn/ref/clients/index.html#python-api
——遊響雲停