saltstack是由thomas Hatch於2011年建立的一個開源項目,設計初衷是爲了實現一個快速的遠程執行系統。在市面上,如同salt的批量管理工具ansible、fabric、puppet、chef、ansible。node
在安裝salt以前,先理解salt架構中各個角色,主要區分是salt-master和salt-minion,顧名思義master是中心控制系統,minion是被管理的客戶端。python
salt架構中的一種就是master > minion。linux
在遠程執行系統中,salt用python經過函數調用完成任務。ios
服務器環境 | centos7(master) | centos7(slave) |
ip地址nginx |
192.168.11.92 | 192.168.11.231 |
身份正則表達式 |
master | slave |
軟件包shell |
salt-master | salt-minion |
關閉firewalld systemctl disable firewalld systemctl stop firewalld 關閉iptables iptables -F 關閉selinux
在master機器安裝 yum install salt-master
在minion機器安裝 yum install salt-minion
1.確保機器通訊
2.修改兩臺機器的/etc/hosts強制解析(公司會搭建一個私有dns服務器,dnsmasq)數據庫
master /etc/hosts 192.168.11.231 slave slave /etc/hosts 192.168.11.92 master
3.關閉兩臺機器的防火牆策略json
mastercentos
[root@master ~]# cat /etc/salt/master 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 #日誌文件地址
slave
[root@localhost yum.repos.d]# cat /etc/salt/minion master: master master_port: 4506 user: root # salt運行的用戶,影響到salt的執行權限
id: bbn
acceptance_wait_time: 10
log_file: /var/log/salt/minion
注意光標大小一致,不一致會致使啓動失敗!!!
systemctl start salt-master
systemctl start salt-minion
在minion啓動後鏈接master會請求master爲其簽發證書,等待證書籤發完成後,master能夠信任minion,而且minion和master之間的通訊是加密的
此時bbn已經出如今unaccepted keys中,說明minion已經和master聯繫,而且master已經獲取了minion的公鑰,等待下一步指令。
若是不能正常出現Unaccepted Keys,多重啓幾遍服務
主人機器輸入: salt-key -f qishiminion 兒子機器輸入: salt-call --local key.finger
salt-key -a bbn #這個命令,是單獨接受祕鑰
只有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自動接受請求
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端
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啓動腳本
[root@master ~]# salt '*' test.ping slave: True # salt 是一個命令 # * 表示目標主機, 在這裏表明全部目標主機 # test.ping是salt遠程執行的一個模塊下面的方法。
這是條很簡單的探測minion主機存活命令,也是遠程執行命令,咱們經過master發送消息給"*"全部的minion,而且告訴他們運行salt內置的命令(也是python模塊中的一個函數),返回true表示slave機器監控存活
在命令行輸入的命令都是 執行模塊
等到命令寫入到文件中, 就叫作狀態模塊
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' bbn: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------
列出全部salt的sys模塊
[root@master 192.168.11.72 ~]$salt 'bbn' sys.list_modules
遠程執行命令模塊
cmd是超級模塊,全部shell命令都能執行
[root@master 192.168.11.72 ~]$salt 'bbn' 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 'bbn' pkg.install "nginx" #卸載minion上的nginx [root@master 192.168.11.72 ~]$salt 'bbn' pkg.remove "nginx" #檢查pkg包的版本 [root@master 192.168.11.72 ~]$salt 'bbn' pkg.version "nginx"
遠程管理服務模塊
管理服務是系統管理員的重要任務,經過salt管理minion服務會很簡單,使用service模塊
[root@master 192.168.11.72 ~]$salt 'bbn' service.start "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'bbn' service.status "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'bbn' service.stop "nginx" slave: True
out控制salt命令結果輸出的格式
[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname' { "bbn": { "pid": 6542, "retcode": 0, "stderr": "", "stdout": "slave" } }
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname' bbn: pid: 2289 retcode: 0 stderr: '' stdout: slave
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語法表示列表,使用一個橫槓加一個空格 多個項使用一樣的縮進級別做爲同一個列表的部分 - list_value_one - list_value_two - list_value_three 列表能夠做爲一個鍵值對的value,例如一次性要安裝多個軟件 my_dict: - l1 - l2 - l3 轉化爲python代碼理解就是 { 'my_dict':['l1','l2',;l3] }
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' } }
以前的salt命令咱們都是使用 salt '*'控制全部minion,而且咱們只有一個「slave」,可是生產環境的服務器極可能是成千上百的minion,所以須要靈活地定位所需的服務器而且執行遠程命令。
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正則表達式
Grains 是saltstack組件中很是重要之一,在配置部署時候回常用,Grains記錄minion的靜態信息,好比經常使用屬性,CPU、內存、磁盤、網絡信息等。 Minions的Grains信息是Minion啓動時採集彙報給Master的 Grains是以 key value形式存儲的數據庫,能夠看作Host的元數據(metadata) Grains保存着收集到的客戶端的詳細信息 若是slave機器數據變化,grains就過時了 在生產環境中須要自定義Grains,能夠經過 Minion配置文件 Grains相關模塊定義 Python腳本定義 salt 'bbn' sys.doc grains#查看grains的命令用法
Grains
Grains人爲是描述minion自己固有的靜態屬性數據,列出主機全部Grains數據 [root@master 192.168.11.72 ~]$salt 'bbn' grains.items slave: ---------- SSDs: biosreleasedate: 05/19/2017 biosversion: 6.00 信息過長,已經省略 salt 'bbn' grains.ls #列出全部grains方法
檢索某些數據
[root@master 192.168.11.72 ~]$salt 'bbn' grains.item os id host slave: ---------- host: slave id: bbn os: CentOS
利用Grains靜態信息定位主機
兩種寫法: 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
#設置數據 [root@master 192.168.11.72 ~]$salt 'bbn' grains.setval cpu_num 8 slave: ---------- cpu_num: #查詢數據 [root@master 192.168.11.72 ~]$salt 'bbn' grains.item cpu_num slave: ---------- cpu_num:
在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
所以Grains數據寫入配置文件後,重啓salt-minion服務,數據也不會丟失
想要刪除能夠經過grains.delval命令刪除,或者去minion的配置文件刪除配置同樣完成操做(或者刪除文件)
1.方法一,清空值 [root@master 192.168.11.72 ~]$salt 'bbn' grains.delval cpu_info slave: None [root@master 192.168.11.72 ~]$salt 'bbn' 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 檢查結果刪除成功
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發送命令的入口。
獲取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配置文件,獲得字典數據,經過字典方法能夠查看信息
/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}