基於Python開發的一套C/S架構配置管理工具,底層使用ZeroMQ消息隊列pub/sub方式通信,使用SSL證書簽發的方式進行認證管理。
本文采用salt-bootstrap方式安裝。salt-bootstrap是SaltStack的一個單獨項目,主要用於解決多平台一鍵部署SaltStack環境
下載安裝腳本
curl -L https://bootstrap.saltstack.com -o install_salt.sh
安裝salt-master
sh install_salt.sh -M #安裝最新stable版本的salt-master和salt-minion
安裝salt-minion
sh install_salt.sh #安裝最新stable版本的salt-minion
(1) 所有master和minion節點配置hosts文件(生產環境使用DNS)
主機名 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,提供遠程執行命令發送功能
4506/tcp,ret_port,用於文件服務、認證、結果搜集等功能接口
(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
http://xxxxxx/Linuxjc/1162618.html TechArticle