salt介紹
saltstack是由thomas Hatch於2011年建立的一個開源項目,設計初衷是爲了實現一個快速的遠程執行系統。node
salt強大嗎
系統管理員平常會進行大量的重複性操做,例如安裝軟件,修改配置文件,建立用戶,批量執行命令等等。若是主機數量龐大,單靠人工維護實在讓人難以忍受。python
早期運維人員會根據本身的生產環境來寫特定腳本完成大量重複性工做,這些腳本複雜且難以維護。系統管理員面臨的問題主要是一、系統配置管理,二、遠程執行命令,所以誕生了不少開源軟件,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟件擅長維護系統狀態或方便的對大量主機進行批量的命令執行。linux
salt靈活性強大,能夠進行大規模部署,也能進行小規模的系統部署。salt的設計架構適用於任意數量的服務器,從少許本地網絡系統到跨越數個數據中心,拓撲架構都是c/s模型,配置簡單。ios
不論是幾臺、幾百臺、幾千臺服務器,均可以使用salt在一箇中心節點上進行管控,靈活定位任意服務器子集來運行命令。 nginx
Salt是python編寫的,支持用戶經過python自定義功能模塊,也提供了大量的python API接口,用戶能夠根據須要進行簡單快速的擴展。正則表達式
saltstack的運行方式
- Local 本地運行,交付管理
- Master/Minion <<< 經常使用方式
- Salt SSH 不須要客戶端
salt部署基本架構
在安裝salt以前,先理解salt架構中各個角色,主要區分是salt-master和salt-minion,顧名思義master是中心控制系統,minion是被管理的客戶端。shell
salt架構中的一種就是master > minion。數據庫
在遠程執行系統中,salt用python經過函數調用完成任務。json
運行salt依賴包vim
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
解決依賴包最簡單的辦法就是用安裝包管理器,yum工具
服務器環境準備
服務器環境 | centos7(master) | centos7(master) |
ip地址 |
192.168.178.131 | 192.168.178.132 |
身份 |
master | slave |
軟件包 |
salt-master | salt-minion |
修改虛擬機ip地址爲靜態地址,而且確保可上網
![](http://static.javashuo.com/static/loading.gif)
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="7d4f9ede-810f-4976-a01b-250b845c99cc" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.131 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29
![](http://static.javashuo.com/static/loading.gif)
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f9fc5929-8594-466e-a041-34caee8c1e32" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.132 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29
![](http://static.javashuo.com/static/loading.gif)
# Generated by NetworkManager nameserver 119.29.29.29
![](http://static.javashuo.com/static/loading.gif)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.11.132 slave 192.168.11.131 master
關閉服務器安全策略
![](http://static.javashuo.com/static/loading.gif)
關閉firewalld systemctl disable firewalld systemctl stop firewalld 關閉iptables iptables -F 關閉selinux
安裝saltstack
salt軟件包須要epel源的支持,那麼下載
EPEL的全稱叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社區打造,爲 RHEL 及衍生髮行版如 CentOS、Scientific Linux 等提供高質量軟件包的項目。裝上了 EPEL以後,就至關於添加了一個第三方源。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空緩存
yum makecache #生成yum緩存
安裝好epel源就能夠開始安裝salt了
查看salt包
yum list salt
安裝salt-master yum install salt-master -y
安裝salt-minion
yum install salt-minion -y
salt端口
安裝好salt以後開始配置,salt-master默認監聽兩個端口:
4505 publish_port 提供遠程命令發送功能 4506 ret_port 提供認證,文件服務,結果收集等功能 確保客戶端能夠通訊服務器的此2個端口,保證防火牆容許端口經過。所以在測試環境直接關閉防火牆。
配置文件
salt-master的配置文件是/etc/salt/master salt-minion的配置文件是/etc/salt/minion 配置文件中包含了大量可調整的參數,這些參數控制master和minion各個方面
配置salt-master
![](http://static.javashuo.com/static/loading.gif)
# salt運行的用戶,影響到salt的執行權限 user: root #s alt的運行線程,開的線程越多通常處理的速度越快,但通常不要超過CPU的個數 worker_threads: 10 # master的管理端口 publish_port : 4505 # master跟minion的通信端口,用於文件服務,認證,接受返回結果等 ret_port : 4506 # 若是這個master運行的salt-syndic鏈接到了一個更高層級的master,那麼這個參數須要配置成鏈接到的這個高層級master的監聽端口 syndic_master_port : 4506 # 指定pid文件位置 pidfile: /var/run/salt-master.pid
超哥的salt-master文件
[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$ interface: 0.0.0.0 #綁定到本地的0.0.0.0地址 publish_port: 4505 #管理端口,命令發送 user: root #運行salt進程的用戶 worker_threads: 5 #salt運行線程數,線程越多處理速度越快,不要超過cpu個數 ret_port: 4506 #執行結果返回端口 pidfile: /var/run/salt-master.pid #pid文件位置 log_file: /var/log/salt/master #日誌文件地址
#自動接收minion的key
auto_accept: False
![](http://static.javashuo.com/static/loading.gif)
# minion的識別ID,能夠是IP,域名,或是能夠經過DNS解析的字符串 id: slave # salt運行的用戶權限 user: root # master的識別ID,能夠是IP,域名,或是能夠經過DNS解析的字符串 master : master # master通訊端口 master_port: 4506 # 備份模式,minion是本地備份,當進行文件管理時的文件備份模式 backup_mode: minion # 執行salt-call時候的輸出方式 output: nested # minion等待master接受認證的時間 acceptance_wait_time: 10 # 失敗重連次數,0表示無限次,非零會不斷嘗試到設置值後中止嘗試 acceptance_wait_time_max: 0 # 從新認證延遲時間,能夠避免由於master的key改變致使minion須要從新認證的syn風暴 random_reauth_delay: 60 # 日誌文件位置 log_file: /var/logs/salt_minion.log
超哥的satl-minion文件
[root@slave ~]# grep -v ^# /etc/salt/minion|grep -v ^$ master: master master_port: 4506 user: root id: slave acceptance_wait_time: 10 log_file: /var/log/salt/minion
啓動salt-master和salt-minion
systemctl start salt-minion systemctl start salt-master
#檢查salt狀態
systemctl status salt-minion
systemctl status salt-master
在master上接收minion祕鑰
在minion啓動後鏈接master會請求master爲其簽發證書,等待證書籤發完成後,master能夠信任minion,而且minion和master之間的通訊是加密的。
在salt-master執行
salt-key命令用於管理mionion祕鑰
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave #此時已經出現slave
Rejected Keys:
此時slave已經出如今unaccepted keys中,說明minion已經和master聯繫,而且master已經獲取了minion的公鑰,等待下一步指令。
檢查master和minion的祕鑰匹配
在master上執行
[root@master ~]# salt-key -f slave Unaccepted Keys: slave: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
而後能夠在minion上獲取minion的祕鑰
[root@slave ~]# salt-call --local key.finger local: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
所以可確認祕鑰匹配,在master上接收祕鑰
[root@master ~]# salt-key -a slave The following keys are going to be accepted: Unaccepted Keys: slave Proceed? [n/Y] y Key for minion slave accepted.
確認接收祕鑰後,檢驗minion祕鑰是否被接收
[root@master ~]# salt-key -L
Accepted Keys: slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:
祕鑰接收完成後,就能夠執行第一條salt啦
salt-key
只有Master
接受了Minion Key
後,才能進行管理。具體的認證命令爲salt-key
經常使用的有以下命令。
[root@linux-node1 ~]# salt-key -L Accepted Keys: #已經接受的key Denied Keys: #拒絕的key Unaccepted Keys:#未加入的key Rejected Keys:#吊銷的key #經常使用參數 -L #查看KEY狀態 -A #容許全部 -D #刪除全部 -a #認證指定的key -d #刪除指定的key -r #註銷掉指定key(該狀態爲未被認證) #在master端/etc/salt/master配置 auto_accept: True #若是對Minion信任,能夠配置master自動接受請求
salt-key的使用
#列出當前全部的key [root@salt0-master ~]# salt-key Accepted Keys: salt1-minion.example.com salt2-minion.example.com salt3-minion.example.com salt4-minion.example.com Denied Keys: Unaccepted Keys: Rejected Keys: #添加指定minion的key [root@salt0-master ~]# salt-key -a salt1-minion.example.com -y #添加全部minion的key [root@salt0-master ~]# salt-key -A -y #刪除指定的key [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y #刪除全部的key [root@salt0-master ~]# salt-key -D -y
平常命令參數
首先知道master和minion都安裝了什麼文件,而後才知道怎麼操做
master端
rpm -ql salt-master
/etc/salt/master # salt master主配置文件 /usr/bin/salt #salt master 核心操做命令 /usr/bin/salt-cp #salt 文件傳輸命令 /usr/bin/salt-key #salt證書管理 /usr/bin/salt-master #salt master 服務命令 /usr/bin/salt-run #salt master runner命令
slave端
[root@slave ~]$rpm -ql salt-minion
/etc/salt/minion #minion配置文件 /usr/bin/salt-call #拉取命令 /usr/bin/salt-minion #minion服務命令 /usr/lib/systemd/system/salt-minion.service #minion啓動腳本
第一條salt命令
[root@master ~]# salt '*' test.ping
slave:
True
# salt 是一個命令
# * 表示目標主機, 在這裏表明全部目標主機
# test.ping是salt遠程執行的一個模塊下面的方法。
這是條很簡單的探測minion主機存活命令,也是遠程執行命令,咱們經過master發送消息給"*"全部的minion,而且告訴他們運行salt內置的命令(也是python模塊中的一個函數),返回true表示slave機器監控存活。
test模塊實際上還有許多其餘的函數
![](http://static.javashuo.com/static/loading.gif)
[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test slave: - test.arg - test.arg_repr - test.arg_type - test.assertion - test.attr_call - test.collatz - test.conf_test - test.cross_test - test.echo - test.exception - test.fib - test.get_opts - test.kwarg - test.module_report - test.not_loaded - test.opts_pkg - test.outputter - test.ping - test.provider - test.providers - test.rand_sleep - test.rand_str - test.retcode - test.sleep - test.stack - test.try_ - test.tty - test.version - test.versions_information - test.versions_report
測試下test.echo
[root@master 192.168.199.155 ~]$salt '*' test.echo 'chaoge nb666' slave: chaoge nb666
test.fib生成斐波那契數列
菲波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等於前兩項之和。
[root@master 192.168.199.155 ~]$salt '*' test.fib 50 slave: |_ - 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 1.09672546387e-05
小結
此前在機器上安裝了salt minion和salt master,進行了最簡單的鏈接,而後master接受了minion的祕鑰,運行了第一條test.ping命令
salt命令組成結構
在命令行輸入的命令都是 執行模塊
等到命令寫入到文件中, 就叫作狀態模塊
salt --help #便可查看salt幫助
[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]
salt命令 參數 目標 salt模塊的函數 遠程執行的參數
完整的五部分命令
#--summary參數顯示salt命令的概要
[root@master 192.168.199.155 ~]$salt --summary '*' cmd.run 'hostname' slave: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------
列出全部salt的sys模塊
#與系統交互的sys模塊
[root@master 192.168.11.72 ~]$salt 'slave' sys.list_modules
遠程執行命令模塊
cmd是超級模塊,全部shell命令都能執行
[root@master 192.168.11.72 ~]$salt 'slave' cmd.run 'ps -ef|grep python' slave: root 905 1 0 07:31 ? 00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P root 3843 1 0 11:05 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 3846 3843 0 11:05 ? 00:00:01 /usr/bin/python /usr/bin/salt-minion root 4031 1 0 11:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 4032 4031 0 11:31 ? 00:00:00 /bin/sh -c ps -ef|grep python root 4034 4032 0 11:31 ? 00:00:00 grep python
遠程安裝nginx
#在minion上安裝nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.install "nginx" #卸載minion上的nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx" #檢查pkg包的版本 [root@master 192.168.11.72 ~]$salt 'slave' pkg.version "nginx"
遠程管理服務模塊
管理服務是系統管理員的重要任務,經過salt管理minion服務會很簡單,使用service模塊
[root@master 192.168.11.72 ~]$salt 'slave' service.start "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'slave' service.status "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'slave' service.stop "nginx" slave: True
與標準的Linux命令同樣,salt的命令同樣用法
--out控制salt命令結果輸出的格式
JSON
[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname' { "slave": { "pid": 2268, "retcode": 0, "stderr": "", "stdout": "slave" } }
YAML
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname' slave: pid: 2289 retcode: 0 stderr: '' stdout: slave
YAML講解
在學習saltstack過程當中,第一要點就是States編寫技巧,簡稱SLS文件。這個文件遵循YAML語法。初學者看這玩意很容易懵逼,來,超哥拯救你學習YAML語法 json xml yaml 數據序列化格式 yaml容易被解析,應用於配置文件 salt的配置文件是yaml配置文件,不能用tab saltstack,k8s,ansible都用的yaml格式配置文件 語法規則 大小寫敏感 使用縮進表示層級關係 縮進時禁止tab鍵,只能空格 縮進的空格數不重要,相同層級的元素左側對其便可 # 表示註釋行 yaml支持的數據結構 對象: 鍵值對,也稱做映射 mapping 哈希hashes 字典 dict 冒號表示 key: value key冒號後必須有 數組: 一組按次序排列的值,又稱爲序列sequence 列表list 短橫線 - list1 純量: 單個不可再分的值 對象:鍵值對 yaml first_key: second_key:second_value python { 'first_key':{ 'second_key':'second_value', } }
YAML是YAML Ain't Markup Language的首字母縮寫,YAML的語法簡單,
結構體經過空格展現
項目使用 '-' 表明
鍵值對經過 ':' 分割
YAML語法遵循固定的縮進風格,表示數據層級結構關係,saltstack須要每一個縮進級別由2個空格組成,禁止用tabs!!!
Python中的字典是簡單的鍵值對,go語言中稱做哈希表map
字典的key經過冒號分割
key在YAML中表現形式是一個冒號結果的字符串
my_key: my_value
轉化到python語法中,上述命令爲
{'my_key':'my_value'}
value還能夠經過縮進和key關聯,四個空格!!
my_key:
my_value
轉化爲python語法一樣的
{'my_key':'my_value'}
YAML語法中字典是能夠嵌套的
one_dict_key:
two_dict_key:value_dict
轉化爲python語法
{
'one_dict_key':{
'two_dict_key':'value_dict'
}
}
短橫槓
YAML語法表示列表,使用一個橫槓加一個空格
多個項使用一樣的縮進級別做爲同一個列表的部分
- list_value_one
- list_value_two
- list_value_three
列表能夠做爲一個鍵值對的value,例如一次性要安裝多個軟件
my_dict:
- l1
- l2
- l3
轉化爲python代碼理解就是
{
'my_dict':['l1','l2',;l3]
}
目標定位字符串
以前的salt命令咱們都是使用 salt '*'控制全部minion,而且咱們只有一個「slave」,可是生產環境的服務器極可能是成千上百的minion,所以須要靈活地定位所需的服務器而且執行遠程命令。
1.全局匹配 [root@master 192.168.11.72 ~]$salt '*' test.ping slave: True
Linux通配符 * 表明任意字符,或空字符串 ? 表明一個字符,不能夠爲空 [a-z] [0-9] 表明任何一個小寫字母 [root@master 192.168.11.72 ~]$salt 'slav?' test.ping slave: True [root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping slave: True
salt海支持python的re正則表達式
state模塊定義主機狀態
以前執行的遠程命令,都是一個過程式的,相似一段shell或者python腳本執行,執行一次觸發一次相同的功能。
那麼大量的minion上運行遠程命令就必須使用salt提供的「狀態管理」了,狀態是對minion的一種描述和定義,運維不須要關心部署是如何完成的,只須要描述minion須要達到什麼狀態。
接下來經過state模塊部署nginx
master端
vim /etc/salt/master
#打開註釋,寫入如下,必須嚴格遵循語法,空格 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod
#此步驟在master和minion都須要執行,都須要文件夾,和nginx.sls文件
[root@master ~]$mkdir -p /srv/salt/{base,dev,test,prod}
[root@slave ~]$mkdir -p /srv/salt/{base,dev,test,prod}
#這個nginx.sls狀態文件,在master和minion上都得有
[root@master /srv/salt/base]$cat nginx.sls nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True
解釋下nginx.sls描述文件
sls配置文件都遵循YAML語言描述
第一條命令使用了pkg.install安裝命令,相對於運行了yum install,而此時state模塊會判斷nginx是否安裝了,若是沒有安裝就進行安裝,安裝了就什麼都不作。
狀態描述都會遵循這個原則,只有檢測到真實狀態和所需狀態不一就會執行此功能,這種性質叫作冪等性。
此時用state模塊部署nginx軟件,經過咱們編寫的nginx.sls描述性配置文件,命令行調用state模塊的sls函數。
#啓動命令,此時slave已經安裝且存活了nginx,進行狀態管理 [root@master /srv/salt/base]$salt 'slave' state.sls nginx
能夠去slave測試關閉nginx,刪除nginx,從新執行命令,同樣能夠安裝啓動nginx
經過master檢查slave的nginx狀態
[root@master 192.168.199.155 /srv/salt/base]$salt 'slave' cmd.run 'ps -ef|grep nginx' slave: root 8543 1 0 Sep14 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 8544 8543 0 Sep14 ? 00:00:00 nginx: worker process root 8592 8591 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx root 8594 8592 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx
Salt採集靜態信息之Grains
若是你入職了,你的老闆讓你收集公司300臺服務器的相關硬件信息,你是一臺臺登陸呢?仍是選擇用salt收集呢?又或者用python的salt-api寫腳本呢
Grains 是saltstack組件中很是重要之一,在配置部署時候回常用,Grains記錄minion的靜態信息,好比經常使用屬性,CPU、內存、磁盤、網絡信息等。
Minions的Grains信息是Minion啓動時採集彙報給Master的
Grains是以 key value形式存儲的數據庫,能夠看作Host的元數據(metadata)
Grains保存着收集到的客戶端的詳細信息
若是slave機器數據變化,grains就過時了
在生產環境中須要自定義Grains,能夠經過
Minion配置文件
Grains相關模塊定義
Python腳本定義
salt 'slave' sys.doc grains#查看grains的命令用法
Grains
Grains人爲是描述minion自己固有的靜態屬性數據,列出主機全部Grains數據
[root@master 192.168.11.72 ~]$salt 'slave' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00
信息過長,已經省略
salt 'slave' grains.ls #列出全部grains方法
檢索某些數據
[root@master 192.168.11.72 ~]$salt 'slave' grains.item os id host slave: ---------- host: slave id: slave os: CentOS
利用Grains靜態信息定位主機
超哥之前公司有100+的redhat操做系統,80+的centos,在不知道salt以前非常懵逼。。
除了系統的不一樣,還有不一樣的系統版本,redhat6.x centos6.x..
兩種寫法:
salt '*' grains.item key1 key2 key3
salt '*' -G
#定位Cenots的機器
[root@master 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True
#定位操做系統系統是7系列的機器
[root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping
slave:
True
#找出ip地址
salt '*' grains.item fqdn_ip4
所以用grains.items列出全部的數據匹配主機,以及根據單一信息定位數據,Grains還能夠自定義來知足不一樣的需求。
自定義設置Grains數據
#設置數據
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8 slave: ---------- cpu_num: 8
#查詢數據
[root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_num slave: ---------- cpu_num: 8
在master端設置Grains靜態數據,原理會將此數據添加到minion服務器的配置文件的/etc/salt/grains
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_num: 8
對於複雜的數據結構,能夠添加靈活的JSON語法
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]' slave: ---------- cpu_info: - Intel - Xeon - 10 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_info slave: ---------- cpu_info: - Intel - Xeon - 10
此時能夠檢查minion服務器上的grains文件
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_info: - Intel - Xeon - '10' cpu_num: 8
所以Grains數據寫入配置文件後,重啓salt-minion服務,數據也不會丟失
想要刪除能夠經過grains.delval命令刪除,或者去minion的配置文件刪除配置同樣完成操做(或者刪除文件)
1.方法一,清空值 [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info slave: None [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num slave: None
2.方法二 刪除minion的grains配置文件,重啓服務
[root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains
[root@slave 192.168.11.71 ~]$!sys
systemctl restart salt-minion
檢查結果刪除成功
數據管理中心之Pillar組件
Pillar也是saltstack組件中很是重要的組件之一,稱做數據管理中心,常常配合states在大規模的配置管理中使用。
Pillar是動態的,存儲在master端,提供和給minion端
Pillar在SaltStack中主要的做用是存儲和定義配置管理中須要的一些數據,好比軟件版本號,用戶帳號密碼等,保證敏感數據不被其餘minion看到
存儲格式與Grains相似,都是YAML格式
在master配置文件中有一段Pillar settings選項專門定義Pillar的參數
cat /etc/salt/master
#此配置表明pillar的工做根目錄,在/srv/pillar下,而後能夠新建sls文件 #pillar_roots: # base: # - /srv/pillar
默認pillar的工做目錄在/srv/pillar目錄下,執行以下代碼
mkdir -p /srv/pillar #指定環境,標記,引用packages.sls和services.sls vim /srv/pillar/top.sls base: '*': - packages - services
vim /srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2 vim /srv/pillar/packages.sls nginx: port: 80 user: root
檢查咱們設置的pillar值
[root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx slave: ---------- nginx: ---------- packages-name: nginx port: 80 user: root version: 1.12.2
Pillar與Grains對比
pillar與Grains對比
類型 數據採集方式 應用場景 定義位置
Grains 靜態 minion啓動時收集 數據查詢 目標選擇 配置管理 minion
Pillar 動態 master進行自定義 目標選擇 配置管理 敏感數據 master
Python API調用SaltStack
SaltStack自己提供salt(usr/bin/salt)來交互管理,可是去服務器上敲命令確定不是一個長遠之計,這時候python就體現了nb的功能。
Python API就是給Python提供的API使用,須要在SaltStack master上運行
實例代碼
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向全部minion發送命令 {'slave': 'slave'}
所以python API就是提供了向saltstack發送命令的入口。
經過API獲取saltstack的配置文件
獲取master配置文件
>>> import salt.config #導入salt配置模塊 >>> m_opts=salt.config.client_config('/etc/salt/master') #讀取salt配置文件,獲得一個字典數據
獲取minion配置文件
Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> salt.config.minion_config('/etc/salt/minion') #讀取minion配置文件,獲得字典數據,經過字典方法能夠查看信息
Python API介紹
/usr/bin/salt默認使用的接口是LocalClient,該接口只能在salt master上使用
[root@master ~]$python
Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向全部minion發送命令 {'slave': 'slave'}
逐條返回結果,local.cmd_iter()
>>> ret=local.cmd_iter('*','test.ping') >>> ret <generator object cmd_iter at 0x7f886d455c80> >>> for i in ret: ... print i ... {'slave': {'retcode': 0, 'ret': True}}
菲波那切數列
>>> local.cmd('*','test.fib',[10]) {'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]}
檢查minion服務器信息
>>> local.cmd('*','cmd.run',['hostname']) {'slave': 'slave'} >>> local.cmd('*','cmd.run',['ifconfig']) >>> local.cmd('*','cmd.run',['crontab -l']) >>> local.cmd('*','cmd.run',['df -h'])
啓停minion的服務,如nginx
>>> local.cmd('*','service.stop',['nginx']) {'slave': True} >>> local.cmd('*','service.status',['nginx']) {'slave': False} >>> local.cmd('*','service.start',['nginx']) {'slave': True}