基於Python開發的一套C/S架構配置管理工具,底層使用ZeroMQ消息隊列pub/sub方式通訊,使用SSL證書籤發的方式進行認證管理。html
本文采用salt-bootstrap方式安裝。salt-bootstrap是SaltStack的一個單獨項目,主要用於解決多平臺一鍵部署SaltStack環境node
下載安裝腳本python
curl -L https://bootstrap.saltstack.com -o install_salt.sh
安裝salt-masternginx
sh install_salt.sh -M #安裝最新stable版本的salt-master和salt-minion
安裝salt-minionapache
sh install_salt.sh #安裝最新stable版本的salt-minion
(1) 全部master和minion節點配置hosts文件(生產環境使用DNS)bootstrap
主機名 | IP | 說明 |
node1 | 172.16.37.23 | Master |
node2 | 172.16.37.35 | Minion |
node3 | 172.16.37.41 | Minion |
node4 | 172.16.37.39 | Minion |
node5 | 172.16.37.43 | Minion |
(2) Master防火牆規則安全
salt master啓動後默認會監聽兩個端口:架構
4505/tcp,publish_port,提供遠程執行命令發送功能app
4506/tcp,ret_port,用於文件服務、認證、結果蒐集等功能接口curl
(3) Minion配置
修改/etc/salt/minion
a) 修改minion的master
找到以下行’#master: salt’,取消註釋,修改成實際master主機名
master: node1
b) 爲minion指定id
找到以下行’#id:’,取消註釋,並設置爲minion的主機名(不必定要和主機名同樣),如
id: node2
重啓salt master和salt minion
systemctl restart salt-master salt-minion # Master
systemctl restart salt-minion # Minion
SaltStack使用SSL簽證的方式進行安全認證、通訊加密
Minion第一次啓動後會在/etc/salt/pki/minion生成公鑰祕鑰,而後將公鑰發送給Master,等待Master接受
Master爲其簽發證書後才能與該Minion創建通訊
相關命令
#查看證書籤髮狀況 salt-key -L #爲node2簽發證書 salt-key -a node2 #爲全部等待接受的Minion簽發證書 salt-key -A
salt ‘目標機器’ 函數 [參數](詳細用法見’salt -h’)
在全部Minion遠程執行test模塊中的ping函數( /usr/lib/python2.7/site-packages/salt/modules/test.py ,該函數直接返回True)
salt ‘*’ test.ping
查看函數說明
salt ‘node2’ sys.doc test.ping
遠程命令執行模塊cmd( /usr/lib/python2.7/site-packages/salt/modules/cmdmod.py )
salt ‘*’ cmd.run 「hostname」
列出cmd模塊的函數
salt 'node2' sys.list_functions cmd
查看函數說明
salt 'node2' sys.doc cmd.run
原理都是在匹配的目標機器執行python模塊中的函數,能夠編寫自定義的python模塊推送到Minion上按上述方式執行
經過SLS(SaLt State)文件描述Minion要達到什麼狀態,底層由SaltStack的狀態模塊保證Minion處於該狀態
以安裝httpd服務爲例,採用執行遠程命令的方式以下:
salt ‘node2’ pkg.install httpd
而採用狀態文件進行描述以下:
而後經過狀態模塊確保目標機器中httpd服務處於pkg.installed的狀態:
salt ‘node2’ state.apply apache
二者都達到了在目標機器部署httpd服務的目的,可是執行遠程命令的方式每次都會執行相同的邏輯和指令,而狀態文件則是根據描述讓Minion處於指定狀態,當前狀態和所需狀態不一樣時才執行相關操做
執行遠程命令的方式屬於執行模塊。查看全部執行模塊
salt 'node2' sys.list_modules
查看pkg執行模塊中的全部函數
salt 'node2' sys.list_functions pkg
狀態文件的方式屬於狀態模塊。查看全部狀態模塊
salt 'node2' sys.list_state_modules
查看pkg狀態模塊中的全部函數
salt 'node2' sys.list_state_functions pkg
highstate經過top.sls文件做爲入口對模塊和主機進行管理
使用highstate,能夠用top.sls組織多個狀態文件,對模塊進行拆分和複用,實現多環境的配置和管理等
以下舉例對highstate進行說明
file_roots默認只有一個base環境,位於/srv/salt,top.sls就在base環境的根目錄下。目錄結構以下:
在top.sls中指定狀態文件或狀態文件子目錄
top.sls中引用了myapp,它會按以下順序引用:若是存在myapp.sls則引用myapp.sls,若是不存在,則引用myapp目錄下的init.sls。咱們採用子目錄的方式對目錄進行規劃
在myapp/init.sls中include與myapp相關的各個狀態文件(能夠把狀態文件拆分紅多個,在此處include)
.myconf對應與init.sls同目錄的myconf.sls狀態文件,在該文件中對Minion的/tmp/myconf.txt狀態進行描述
在files/myconf.txt中寫入任意內容,執行以下命令讓Minion處於描述的狀態
salt 'node2' state.apply
參考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt1.html
(2) https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html
SaltStack中記錄Minion靜態信息的組件(OS類型、CPU核數、內存大小、IP地址等),在Minion啓動時採集彙報給Master,所以Grains一般存儲的是靜態、不常變化的數據,存儲在Minion本地
Minion能夠操做本身的Grains數據(增刪改)
可經過以下命令查看每項Grains數據:
salt 'node2' grains.items
與Grains相似,但Pillar存儲的是相對常常變化的數據,存儲在Master本地
Minion只能查看本身的Pillar數據
可經過以下命令查看每項Pillar數據:
salt 'node2' pillar.items
Python模板引擎,經過與Grains和Pillar的結合定義動態的配置
好比,不一樣的Minion經過fqdn能夠獲取各自不一樣的主機名
接下來咱們能夠經過Grains建立動態配置,讓每一個目標機器中的/tmp/myconf.txt顯示本身的主機名
修改狀態文件中的file描述,指定template爲jinja
#cat dev/myapp/myconf.sls conf1: file.managed: - name: /tmp/myconf.txt - source: salt://nginx/files/myconf.txt - user: root - group: root - mode: 644 - template: jinja
在source對應的文件中經過 {{ grains[‘ITEM’] }} 的方式引用Grains數據
#cat dev/myapp/files/myconf.txt [BASE] /srv/salt/dev My hostname is {{ grains['fqdn'] }}
讓全部Minion處於描述的狀態
salt '*' state.apply
參考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt3.html
以下以在不一樣環境的主機中放置不一樣內容的/tmp/myconf.txt文件爲例進行說明
爲了便於區分不一樣環境,先修改各Minion的id加入環境標識
修改master的file_root配置( /etc/salt/master )
file_roots: base: - /srv/salt/base dev: - /srv/salt/dev prod: - /srv/salt/prod
在多環境下,每一個環境的根目錄下維護各自的top.sls
top.sls中指明本身的環境,匹配的目標機器,包含的狀態文件/子目錄等
top.sls中引用了myapp,它會按以下順序引用:若是存在myapp.sls則引用myapp.sls,若是不存在,則引用myapp目錄下的init.sls。咱們採用子目錄的方式對目錄進行規劃。在init.sls中指定該子目錄中的狀態文件
.myconf對應與init.sls同目錄的myconf.sls狀態文件,在該文件中對Minion的/tmp/myconf.txt狀態進行描述
分別在base、dev、prod環境的myconf.txt中寫入不一樣內容,執行以下命令讓不一樣環境的Minion處於對應的描述狀態
salt '*' state.apply # 默認base環境 salt '*' state.apply saltenv=dev # dev環境 salt '*' state.apply saltenv=prod # prod環境
參考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt4.html