這份文檔如其名,是我本身整理的學習 SaltStack 的過程記錄。只是過程記錄,沒有刻意像教程那樣去作。因此呢,從前至後,中間難免有一些概念不清不明的地方。由於事實上,在某個階段對於一些概念原本就不可能明白。因此,整個過程只求在形式上的能用便可。前面就不要太糾結概念和原理,知道怎麼用就好。php
但願這篇文章可以讓你快速瞭解並使用saltstack。文章還在編寫中。html
SaltStack是開源的管理基礎設置的輕量級工具,容易搭建,爲遠程管理服務器提供一種更好、更快速、更有擴展性的解決方案。經過簡單、可管理的接口,Salt實現了能夠管理成千上百的服務器和處理大數據的能力。node
輕量級配置管理系統,可以維持遠端節點運行在預約狀態(例如,確保指定的軟件包已經安裝和特定的系統服務正在運行)python
分佈式遠程執行系統,用於在遠端節點執行命令和查詢數據,能夠是單獨,也能夠是選定的條件linux
兼顧大規模部署與更小的系統的同時提供多功能性是很困難的,Salt是很是簡單配置和維護,無論項目的大小。Salt能夠勝任管理任意的數量的服務器,不論是本地網絡,仍是跨數據中心。架構採用C/S模式,在一個後臺程序中集成必要功能。默認不須要複雜的配置就能夠工做,同時能夠定製用於特殊的需求。git
Salt的核心功能:github
經過並行方式讓遠端節點執行命令web
採用安全的加密/解析協議正則表達式
最小化使用網絡和負載shell
提供簡單的程序接口
Salt引入了更細粒度的控制,容許不經過目標名字,二是經過系統屬性分類
Salt採用了不少技術和技巧。網絡層採用優秀的ZeroMQ庫,因此守護進程裏面包含AMQ代理。Salt採用公鑰和主控通信,同時使用更快的AES加密通訊,驗證和加密都已經集成在Salt裏面。Salt使用msgpack通信,因此更快速和更輕量網絡交換。
爲了實現簡單的擴展,Salt執行例程能夠寫成簡單的Python模塊。客戶端程序收集的數據能夠發送回主控端,能夠是其餘任意程序。能夠經過Python API調用Salt程序,或者命令行,所以,Salt能夠用來執行一次性命令,或者大型應用程序中的一部分模塊。
結果是一個系統能夠高速在一臺或者一組服務器執行命令。Salt速度很快,配置簡單,擴展性好,提供了一個遠程執行架構,能夠管理多樣化需求的任何數量的服務器。整合了世界上最好的遠程執行方法,加強處理能力,擴展使用範圍,使得能夠適用任何多樣化複雜的網絡。
Salt基於Apache 2.0 licence開發,能夠用於開源或者自有項目。請反饋你的擴展給項目組,以便更多人受益,共同促進Salt發展。請在你的系統部署 系統,讓運維更便捷。
開發語言:Python
常見的系統包能夠直接下載安裝使用:
SaltStack只能安裝在類unix的操做系統上並依賴如下組件:
Python 2.6 >= 2.6 <3.0
ZeroMQ >= 2.1.9
pyzmq >= 2.1.9 - ZeroMQ Python bindings
PyCrypto - The Python cryptography toolkit
msgpack-python - High-performance message interchange format
YAML - Python YAML bindings
Jinja2 - parsing Salt States (configurable in the master settings)
可選的依賴:
mako - an optional parser for Salt States (configurable in the master settings)
gcc - dynamic Cython module compiling
可使用官方提供的Salt Bootstrap來快速安裝SaltStack。
安裝master:
curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N
安裝minion:
wget -O - http://bootstrap.saltstack.org | sudo sh
當前Salt Bootstrap已經在如下操做系統測試經過:
Ubuntu 10.x/11.x/12.x
Debian 6.x
CentOS 6.3
Fedora
Arch
FreeBSD 9.0
RHEL 5系統:
rpm -Uvh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm
RHEL 6系統:
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
在master上運行:
yum install salt-master
在minion上運行:
yum install salt-minion
master上設置開啓啓動並啓動服務:
chkconfig salt-master on service salt-master start
minion上設置開啓啓動並啓動服務:
chkconfig salt-minion on service salt-minion start
當前最新版爲0.17.1,若是你也是使用的這個版本而且啓動提示以下錯誤:
[root@sk1 vagrant]# /etc/init.d/salt-master start Starting salt-master daemon: Traceback (most recent call last): File "/usr/bin/salt-master", line 10, in <module> salt_master() File "/usr/lib/python2.6/site-packages/salt/scripts.py", line 20, in salt_master master.start() File "/usr/lib/python2.6/site-packages/salt/__init__.py", line 114, in start if check_user(self.config['user']): File "/usr/lib/python2.6/site-packages/salt/utils/verify.py", line 296, in check_user if user in e.gr_mem] + [pwuser.gid]) AttributeError: 'pwd.struct_passwd' object has no attribute 'gid'
經過google搜索關鍵字saltstack 'pwd.struct_passwd' object has no attribute 'gid'
,能夠找到這個issues,查看評論能夠發現這是一個bug,將會在0.17.2中被修復。
個人解決方法是:下載saltstack源碼從新編譯
wget https://github.com/saltstack/salt/archive/develop.zip unzip develop cd salt-develop/ python2.6 setup.py install
master不修改配置文件就能夠運行,而minion必須修改配置文件中的master id才能和master通信,配置文件分別在/etc/salt/master
和 /etc/salt/minion
。
master默認監控0.0.0.0上4505和4506端口,你能夠在/etc/salt/master
中修改成指定ip。
master關鍵配置:
interface
publish_port
user
max_open_files
worker_threads
ret_port
pidfile
root_dir
pki_dir
cachedir
keep_jobs
job_cache
ext_job_cache
minion_data_cache
enforce_mine_cache
sock_dir
Master Security配置
open_mode
auto_accept
autosign_file
client_acl
client_acl_blacklist
external_auth
token_expire
Master Module管理
runner_dirs
cython_enable
Master State設置
state_verbose
state_output
state_top
external_nodes
renderer
failhard
test
Master File Server設置
fileserver_backend
file_roots
hash_type
file_buffer_size
Pillar配置
pillar_roots
ext_pillar
Syndic Server設置
order_masters
syndic_master
syndic_master_port
syndic_log_file
syndic_pidfile
Peer發佈設置
peer
peer_run
Node Groups設置
Master Logging設置
log_file
log_level
log_level_logfile
log_datefmt
log_datefmt_logfile
log_fmt_console
log_fmt_logfile
log_granular_levels
Include配置
default_include
include
Minion主要配置:
master
master_port
user
pidfile
root_dir
pki_dir
id
append_domain
cachedir
verify_env
cache_jobs
sock_dir
backup_mode
acceptance_wait_time
random_reauth_delay
cceptance_wait_time_max
dns_check
ipc_mode
tcp_pub_port
tcp_pull_port
Minion Module管理
disable_modules
disable_returners
module_dirs
returner_dirs
states_dirs
render_dirs
cython_enable
providers
State Management 設置
renderer
state_verbose
state_output
autoload_dynamic_modules
environment
File目錄設置
file_client
file_roots
hash_type
pillar_roots
Security設置
open_mode
線程設置
multiprocessing
Minion日誌設置
log_file
log_level
log_level_logfile
log_datefmt
log_datefmt_logfile
log_fmt_console
log_fmt_logfile
log_granular_levels
Include配置
default_include
include
Frozen Build Update Settings
update_url
update_restart_services
參考上面的配置文件說明修改master和minion配置。這裏個人master主機名爲sk1,minion主機名爲sk2。
修改master配置文件/etc/salt/master
interface: 0.0.0.0 auto_accept: True
修改minion配置文件/etc/salt/minion
master: sk1 id: sk2
而後運行salt,啓動master(添加-d
參數可讓其後臺運行):
salt-master
啓動minion(添加-d參數可讓其後臺運行):
salt-minion
若是須要排錯,能夠添加設置日誌級別:
salt-master --log-level=debug
若是想以非用戶運行,能夠添加--user
參數
Salt在master和minion通訊之間使用AES加密。在master和minion通訊以前,minion上的key須要發送到master並被master接受。能夠在master上查看已經接受的key:
[root@sk1 pillar]# salt-key -L Accepted Keys: Unaccepted Keys: sk2 Rejected Keys:
而後運行下面命令能夠接受全部未被接受的key:
[root@sk1 pillar]# salt-key -A
在master上發送ping命令檢測minon是否被認證成功:
[root@sk1 pillar]# salt '*' test.ping sk2:salt '*' test.ping True
True代表測試成功。
## 6.1 states
## 6.1.1 states文件
salt states的核心是sls文件,該文件使用YAML語法定義了一些k/v的數據。
sls文件存放根路徑在master配置文件中定義,默認爲/srv/salt
,該目錄在操做系統上不存在,須要手動建立。
在salt中能夠經過salt://
代替根路徑,例如你能夠經過salt://top.sls
訪問/srv/salt/top.sls
。
在states中top文件也由master配置文件定義,默認爲top.sls,該文件爲states的入口文件。
一個簡單的sls文件以下:
apache: pkg: - installed service: - running - require: - pkg: apache
說明:此SLS數據確保叫作」apache」的軟件包(package)已經安裝,而且」apache」服務(service)正在運行中。
第一行,被稱爲ID說明(ID Declaration)。ID說明代表能夠操控的名字。
第二行和第四行是State說明(State Declaration),它們分別使用了pkg和service states。pkg state經過系統的包管理其管理關鍵包,service state管理系統服務(daemon)。 在pkg及service列下邊是運行的方法。方法定義包和服務應該怎麼作。此處是軟件包應該被安裝,服務應該處於運行中。
第六行使用require。本方法稱爲」必須指令」(Requisite Statement),代表只有當apache軟件包安裝成功時,apache服務才啓動起來。
state和方法能夠經過點連起來,上面sls文件和下面文件意思相同。
apache: pkg.installed service.running - require: - pkg: apache
將上面sls保存爲init.sls並放置在sal://apache
目錄下,結果以下:
/srv/salt ├── apache │ └── init.sls └── top.sls
top.sls如何定義呢?
master配置文件中定義了三種環境,每種環境均可以定義多個目錄,可是要避免衝突,分別以下:
# file_roots: # base: # - /srv/salt/ # dev: # - /srv/salt/dev/services # - /srv/salt/dev/states # prod: # - /srv/salt/prod/services # - /srv/salt/prod/states
top.sls能夠這樣定義:
base: '*': - apache
說明:
第一行,聲明使用base環境
第二行,定義target,這裏是匹配全部
第三行,聲明使用哪些states目錄,salt會尋找每一個目錄下的init.sls文件。
一旦建立完states並修改完top.sls以後,你能夠在master上執行下面命令:
[root@sk1 salt]# salt '*' state.highstate sk2: ---------- State: - pkg Name: httpd Function: installed Result: True Comment: The following packages were installed/updated: httpd. Changes: ---------- httpd: ---------- new: 2.2.15-29.el6.centos old: ---------- State: - service Name: httpd Function: running Result: True Comment: Service httpd has been enabled, and is running Changes: ---------- httpd: True Summary ------------ Succeeded: 2 Failed: 0 ------------ Total: 2
上面命令會觸發全部minion從master下載top.sls文件以及其中定一個的states,而後編譯、執行。執行完以後,minion會將執行結果的摘要信息彙報給master。
## Pillar
## Renderers
在上面的例子中,test.ping是最簡單的一個遠程執行的命令,你還能夠執行一些更加複雜的命令。
salt執行命令的格式以下:
salt '<target>' <function> [arguments]
target: 執行salt命令的目標,可使用正則表達式
function: 方法,由module提供
arguments:function的參數
target可使用正則表達式匹配:
salt '*' test.ping salt 'sk2' test.ping
function是module提供的方法。經過下面命令能夠查看全部的function:
salt '*' sys.doc
function能夠接受參數:
salt '*' cmd.run 'uname -a'
而且支持關鍵字參數:
salt '*' cmd.run 'uname -a' cwd=/ user=salt
上面例子意思是:在全部minion上切換到/目錄以salt用戶運行uname -a
命令。
關鍵字參數能夠參考module的api,經過api你能夠查看cmd.run的定義:
salt.states.cmd.mod_watch(name, **kwargs) Execute a cmd function based on a watch call salt.states.cmd.run(name, onlyif=None, unless=None, cwd=None, user=None, group=None, shell=None, env=(), stateful=False, umask=None, quiet=False, timeout=None, **kwargs)
全部module中的方法定義都與上面相似,說明:
name: 第一個參數,爲執行的命令
中間的key=alue爲keyword參數,都有默認值
最後一個參數爲name中命令的輸入參數
## Returners## Mine