SaltStack介紹html
saltstack是一個開源的批量分發管理工具,具備很是強大的管理功能,能同時管理上萬臺服務器。由python語言編寫,並提供API.node
saltstack有四種運行方式:Local, Master/Minion, Salt SSH,Syndicpython
saltstack有三大功能:遠程執行,配置管理(狀態),雲管理。mysql
saltstack支持多種常見的操做系統,包括Windows(只能作爲minion)。web
saltstack是依賴於ZeroMQ來實現的(訂閱發佈模式),監聽4505端口(發佈系統端口)。全部的minion都會鏈接到master上的4505端口,而master上的4506端口用於接受minion返回的數據。因爲使用的是TCP長鏈接,因此在master上對海量的服務器執行命令時,會獲得很是迅速的響應。sql
SaltStack的安裝配置數據庫
http://repo.saltstack.com/#rhel apache
SaltStack提供了很是豐富的安裝方式,能夠在官方網站找到對應的說明。vim
這裏使用兩臺CS7的系統,一臺做爲master(node1),另外一臺做爲Minion(node2)。centos
安裝SaltStack倉庫:
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
在master端安裝服務端和客戶端:
yum install salt-master salt-minion -y
在minoin安裝客戶端:
yum install salt-minion -y
啓動master:
# systemctl start salt-master
修改master和minion端的minion配置文件,爲minion指定master,:
vim /etc/salt/minion master: 172.16.10.60 #能夠是主機名或IP #id: #id默承認以不改,爲主機名 # systemctl start salt-minion #啓動minion服務
啓動成功後,會生成一個/etc/salt/minion_id的文件,記錄了minion的ID信息。
# cat /etc/salt/minion_id node2
在pki目錄下會生成一系列的密鑰:
[root@node1 salt]# tree pki pki ├── master │ ├── master.pem #master私鑰 │ ├── master.pub #master公鑰 │ ├── minions │ ├── minions_autosign │ ├── minions_denied │ ├── minions_pre #未被管理的密鑰 │ │ ├── node1 │ │ └── node2 │ └── minions_rejected └── minion ├── minion.pem └── minion.pub
[root@node2 salt]# tree pki pki ├── master └── minion ├── minion.pem └── minion.pub
經過MD5校驗對比,能夠發現master上收到的node2的密鑰和node2本地的密鑰相同:
# 完成分發後,路徑改變 [root@node1 ~]# md5sum /etc/salt/pki/master/minions/node2 d9a0453d7d539dbcc36e1daea259aa10 /etc/salt/pki/master/minions/node2 [root@node2 ~]# md5sum /etc/salt/pki/minion/minion.pub d9a0453d7d539dbcc36e1daea259aa10 /etc/salt/pki/minion/minion.pub
在master上使用salt-key命令來查看添加minion主機:
[root@node1 salt]# salt-key Accepted Keys: Denied Keys: Unaccepted Keys: node1 node2 Rejected Keys:
加入指定的minion主機:
# salt-key -a node1 #可使用通配符如 node*添加全部以node開頭爲開頭的主機 The following keys are going to be accepted: Unaccepted Keys: node1 Proceed? [n/Y] Y Key for minion node1 accepted.
贊成全部minion主機:
# salt-key -A
對全部的主機執行命令,測試主機是否在線:
[root@node1 ~]# salt '*' test.ping node2: True node1: True
對全部主機運行一個命令,出現下面結果說明能夠進行遠程管理了:
[root@node1 ~]# salt '*' cmd.run 'date' node1: Fri Nov 4 14:21:37 CST 2016 node2: Fri Nov 4 14:21:37 CST 2016
若是在使用過程當中修改了主機名(不推薦這樣作,會形成不少問題),能夠在minion的配置文件中指定主機名(id), 而後刪除修改主機的KEY,從新啓動minon:
[root@node-1 ~]# salt-key -d old-key-name #刪除指定的key [root@node-1 ~]# salt-key -D # 刪除全部key
SaltSack配置管理
當須要對海量的機器進行配置管理的時候常常會修改各類配置文件,SaltStack的配置管理可讓咱們更方便的部署服務,針對不一樣的服務器和不一樣的服務,能夠經過編輯.sls文件來管理。
SaltStack的配置分發管理是使用YAML狀態文件來編寫的。
YAML語法:
1.縮進: 兩個空格,不能使用tab鍵。
2.冒號:表明鍵值對 key: value (注意,鍵值對冒號後面有一個空格)
3.短橫線:表示列表(短橫線後面有一個空格)
基礎配置
編輯配置文件,定義YAML模塊:
# vim /etc/salt/master #打開基礎配置 file_roots: base: - /srv/salt #配置文件根路徑
在示例中又三個模塊,base,dev,prod.分別表明基礎環境、測試環境、生產環境的配置,能夠對每一個模塊能夠指定對應路徑:
# Example: # file_roots: # base: # - /srv/salt/ # dev: # - /srv/salt/dev/services # - /srv/salt/dev/states # prod: # - /srv/salt/prod/services # - /srv/salt/prod/states
修改salt配置文件後重啓:
systemctl restart salt-master
建立根路徑:
mkdir /srv/salt/ # salt的根路徑
批量執行相同命令
在須要對大量主機安裝配置相同的內容時能夠經過編輯簡單的sls文件來執行。
建立base環境文件分類目錄,編輯須要安裝的配置:
mkdir /srv/salt/web vim /srv/salt/web/apache.sls #編寫內容: apache-install: #命名ID,可隨意命名 pkg.installed: #pkg模塊,調用installed方法 - names: #installed方法中的參數 - httpd #須要安裝的包名 - httpd-devel apache-service: #狀態命名ID service.running: #調用service.running方法 - name: httpd #服務的命名爲httpd - enable: True #設置開機自啓動
執行.sls文件:
salt '*' state.sls web.apache #state.sls執行模塊,執行根目錄中apache.sls文件
此時會在兩臺在線的主機上安裝Apache,並啓動。
查看node2上的文件,一樣生成了一個apache.sls的文件:
[root@node2 ~]# cat /var/cache/salt/minion/files/base/web/apache.sls apache-install: pkg.installed: - names: - httpd - httpd-devel apache-service: service.running: - name: httpd - enable: True
minion經過複製master的.sls文件到本地執行。
對不一樣主機指定不一樣的動做
在master配置文件中,指定top配置文件,top文件必須在base環境中。
#state_top: top.sls #默認不須要配置
在指定的base環境路徑上編寫top.sls文件,爲不一樣的minion主機指定不一樣的動做:
[root@node1 salt]# cat /srv/salt/top.sls base: 'node1': - web.apache 'node2': - web.apache
執行高級狀態命令,使top.sls文件生效:
salt '*' state.highstate test=True #測試top文件,對minion不作修改 salt '*' state.highstate # * 表明全部minion,執行top文件內容
SaltStack數據系統
SaltStack是經過兩種數據系統來發布的,Grains和Pillar。經過數據系統來統計主機的相關信息,進而幫助用戶使用多樣化的方式來篩選定位咱們要執行salt命令的主機。
Grans介紹
Grains: 獲取靜態數據 ,當minion啓動的時候收集Minion本地的相關信息,如操做系統版本,內核信息,硬件信息等,也能夠自定義。當minion啓動後,獲取的數據就不會再改變,只有重啓或同步時才能獲取新的變化信息。
Grains的特性能夠有幾種應用場景:
資產管理,信息查詢。
用於目標選擇。(salt -G 'key:value' cmd.run 'cmd')
配置管理中使用。
查看Grains信息:
salt 'node1' grains.ls #顯示全部模塊
salt 'node1' grains.items #顯示全部模塊的信息
salt '*' grains.item fqdn #返回全部minion端的fqdn信息
使用Grains指定信息對應的主機,執行salt命令:
[root@node1 salt]# salt '*' grains.item os node2: ---------- os: CentOS node1: ---------- os: CentOS [root@node1 salt]# salt -G 'os:CentOS' cmd.run 'date' # -G 參數指定Grains信息 node1: Sun Nov 6 17:28:36 CST 2016 node2: Sun Nov 6 17:28:36 CST 2016
自定義Grains
自定義Grains有兩種方式:
在/etc/salt/minion添加配置
在/etc/salt/目錄編寫新的配置文件grains
在node2上的/etc/salt/minion添加配置,在grains部分取消註釋,添加一個roles角色:
grains: roles: apache
重啓salt-minion,並在master上獲取roles的值:
[root@node2 ~]# systemctl restart salt-minion [root@node1 ~]# salt '*' grains.item roles node1: ---------- roles: node2: ---------- roles: apache
這樣就能夠根據Grains的匹配結果來對符合匹配結果的主機執行命令:
[root@node1 ~]# salt -G 'roles:apache' cmd.run 'date' node2: Sun Nov 6 17:51:07 CST 2016
在/etc/salt/目錄編寫新的配置文件grains:
[root@node2 ~]# cat /etc/salt/grains saltname: trying [root@node2 ~]# systemctl restart salt-minion #也能夠在master上使用刷新命令,和重啓salt-minion效果同樣 [root@node1 ~]# salt '*' saltutil.sync_grains node1: node2:
master上查看:
[root@node1 ~]# salt '*' grains.item saltname node1: ---------- saltname: node2: ---------- saltname: trying
在top file中使用Grains
在top.sls中使用grains進行匹配
vim /srv/salt/top.sls base: 'node1': - web.apache 'saltname:trying': #此處grains匹配上node2 - match: grain #匹配grains,不加s. - web.apache
使用python腳本編寫一個Grains
使用python腳本編寫一個grains,須要存放在base環境中的_grains目錄中。
[root@node1 _grains]# cat /srv/salt/_grains/my_grains.py #!/usr/bin/env python #-*- coding: utf-8 -*- def my_grains(): #init a grains grains = {} #set key-value grains['iaas'] = 'openstack' grains['blog'] = 'trying' # return value return grains
同步腳本到minion端:
[root@node1 _grains]# salt '*' saltutil.sync_grains #這裏能夠指定主機同步 node1: - grains.my_grains node2: - grains.my_grains
在minion端能夠看到同步過來的腳本和目錄:
[root@node2 ~]# tree /var/cache/salt/minion/ /var/cache/salt/minion/ ├── accumulator ├── extmods │ └── grains │ ├── my_grains.py #真正執行的腳本 │ └── my_grains.pyc ├── files │ └── base │ ├── _grains │ │ └── my_grains.py #同步的腳本文件 │ ├── top.sls │ └── web │ └── apache.sls ├── highstate.cache.p ├── module_refresh ├── pkg_refresh ├── proc └── sls.p
在master上查看執行結果,已經同步到minion上:
[root@node1 _grains]# salt '*' grains.item blog node1: ---------- blog: trying node2: ---------- blog: trying
Grains的優先級
上面給出了四種方式可使用Grains的值,在這四種方式中,若是出現了同名的狀況,會
按照如下的優先級來獲取對應的值:
系統自帶的值
/etc/salt/grains文件中編寫的值
minion配置文件中定義的值
/srv/salt/_grains/my_grains.py 腳本中自定義的值
================
Pillar介紹
與Grains不一樣的是,Pillar是動態的,能給特定的minion指定特定的數據。只有指定的minion能看到本身的數據,這樣經常使用與一些敏感的特殊數據。
默認狀況下pillar的系統模塊是關閉的:
[root@node1 salt]# salt '*' pillar.items node1: ---------- node2: ----------
能夠在/etc/salt/master中打開註釋,修改成True,系統的這些變量不多會用到:
pillar_opts: True
自定義pillar
自定義pillar須要編寫一個sls文件,在文件中定義pillar. 使用YAML定義多級。
修改master配置文件,打開註釋:
vim /etc/salt/master pillar_roots: base: - /srv/pillar
重啓salt-master:
systemctl restart salt-master
建立pillar的目錄:
mkdir /srv/pillar
和grains同樣,建立分類目錄和.sls的文件
vim /srv/pillar/web/apache.sls {% if grains['os'] == 'CentOS' %} apache: httpd {% elif grains['os'] == 'Debian' %} apache: apache2 {% endif %}
在pillar目錄中編寫top file指定主機,和grains中的同樣:
# cat /srv/pillar/top.sls base: 'node2': #只指定了node2 - web.apache
刷新,使配置生效:
# salt '*' saltutil.refresh_pillar node2: True node1: True
執行查看pillar items 生效:
# salt '*' pillar.items apache node2: ---------- apache: httpd node1: ---------- apache:
使用pillar匹配上主機node2,執行命令:
# salt -I 'apache:httpd' cmd.run 'hostname' node2: node2
Grains和Pillar的對比
分類 | 類型 | 數據採集方式 | 應用場景 | 定義位置 |
Grains | 靜態 | minion啓動時收集 | 數據查詢,目標選擇,配置管理 | minion |
Pillar | 動態 | master自定義 | 目標選擇,配置管理,敏感數據 | master |
SaltStack遠程執行
saltstack命令語法, salt '*' cmd.run 'w'
命令:salt
目標:‘*’
模塊: cmd.run 自帶150+模塊,也能夠自定義編寫模塊
返回:執行後結果返回。
目標選擇方式
全部匹配目標的方式均可以用top file來指定。
使用通配符:
# salt 'node*' test.ping # salt 'node[1|2]' test.ping # salt 'node[1-2]' test.ping # salt 'node[!2]' test.ping
使用列表,-L:
# salt -L 'node1,node2' test.ping
使用正則,-E:
# salt -E 'node(1|2)*' test.ping
使用IP/子網方式:
# salt -S '172.16.10.61' test.ping
# salt -S '172.16.10.0/24' test.ping
使用node_group匹配:-N
修改配置文件/etc/salt/master,在node group模塊中添加匹配的組:
nodegroups: web: 'L@node1,node2'
重啓salt-master:
systemctl restart salt-master
匹配node-group:
[root@node1 ~]# salt -N web test.ping node2: True node1: True
多種匹配方式命令示例:
https://www.unixhot.com/docs/saltstack/topics/targeting/index.html
https://www.unixhot.com/docs/saltstack/topics/targeting/compound.html
SaltStack自帶模塊
https://docs.saltstack.com/en/latest/ref/modules/all/index.html#all-salt-modules
Saltstack有不少集成的模塊,大部分模塊都是由python編寫,使用這些模塊能夠很方便的返回一個信息列表或者執行某些任務。
經常使用的一些模塊舉例:
network模塊:網絡相關服務
salt.modules.network.active_tcp :
這裏表示了模塊函數的路徑和位置,salt.modules表示的就是slat模塊在本機的安裝位置,通常默認狀況下在 /usr/lib/python2.7/site-packages/salt/modules
在執行命令的時候能夠直接使用slat命令來調用
service 模塊:和主機當前服務相關的模塊
在一些經常使用的模塊中,有一些模塊方法已經有了單獨的命令如cp模塊:
cp是複製模塊,在系統中咱們能夠直接使用salt-cp 如:
salt-cp ‘*’ /etc/hosts /tmp/ #拷貝本地的hosts文件到全部minion的/tmp目錄下。
state:執行模塊
Saltstack返回程序
數據的返回是由minion端提供的,能夠將minion返回的數據直接寫入到mysql中而不通過master。
要實現minion直接返回數據到mysql,須要在全部的minion安裝MySQL-python
salt '*' state.single pkg.installed name=MySQL-python
使用返回數據存入mysql,須要在master上安裝數據庫,而且建立表結構,受權:
https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html
執行下面命令,建立數據庫並受權:
> CREATE DATABASE `salt` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; > USE `salt`; > DROP TABLE IF EXISTS `jids`; CREATE TABLE `jids` ( `jid` varchar(255) NOT NULL, `load` mediumtext NOT NULL, UNIQUE KEY `jid` (`jid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE INDEX jid ON jids(jid) USING BTREE; > DROP TABLE IF EXISTS `salt_returns`; > CREATE TABLE `salt_returns` ( `fun` varchar(50) NOT NULL, `jid` varchar(255) NOT NULL, `return` mediumtext NOT NULL, `id` varchar(255) NOT NULL, `success` varchar(10) NOT NULL, `full_ret` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id` (`id`), KEY `jid` (`jid`), KEY `fun` (`fun`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > DROP TABLE IF EXISTS `salt_events`; > CREATE TABLE `salt_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `tag` varchar(255) NOT NULL, `data` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `master_id` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `tag` (`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > grant all on salt.* to salt@'%' identified by 'salt'; > show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | salt | +--------------------+ 4 rows in set (0.00 sec) > use salt Database changed > show tables; +----------------+ | Tables_in_salt | +----------------+ | jids | | salt_events | | salt_returns | +----------------+ 3 rows in set (0.00 sec) MariaDB [salt]> select * from salt_returns; Empty set (0.00 sec)
修改全部minion端salt的配置文件,加入下面配置後重啓salt服務:
在配置最後添加以下信息:
mysql.host: '172.16.10.60' # mysql所在的主機地址 mysql.user: 'salt' mysql.pass: 'salt' mysql.db: 'salt' mysql.port: 3306
重啓minion服務:
systemctl restart salt-minion
執行數據庫測試命令:
salt '*' test.ping --return mysql
再次查看數據庫,發現已經寫入數據:
[root@node1 ~]# mysql -h 172.16.10.60 -usalt -p -e "use salt; select * from salt_returns\G" Enter password: *************************** 1. row *************************** fun: test.ping jid: 20161108135248194687 return: true id: node2 success: 1 full_ret: {"fun_args": [], "jid": "20161108135248194687", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "node2"} alter_time: 2016-11-08 13:52:48 *************************** 2. row *************************** fun: test.ping jid: 20161108135248194687 return: true id: node1 success: 1 full_ret: {"fun_args": [], "jid": "20161108135248194687", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "node1"} alter_time: 2016-11-08 13:52:48
執行一條命令,寫入數據庫:
salt '*' cmd.run 'df -h' --return mysql
再次查看數據庫,會發現數據庫中已經記錄了操做的命令和返回值記錄,以及操做的時間。
編寫狀態模塊
咱們能夠根據本身的須要,自定義一些狀態模塊。好比,能夠編寫一個模塊腳本,來執行復雜的操做,直接使用salt來調用這些模塊就能夠實現咱們須要的功能。
模塊存放的路徑:/srv/salt/_modules
mkdir /srv/salt/_modules
編寫一個顯示磁盤信息的模塊腳本:
[root@node1 /srv/salt/_modules]# vim /srv/salt/_modules/my_disk.py
def list(): cmd = 'df -h' ret = __salt__['cmd.run'](cmd) return ret
salt同步文件到全部minion端:
# salt '*' saltutil.sync_modules node1: - modules.my_disk node2: - modules.my_disk
運行my_disk.py模塊:
# salt '*' my_disk.list node2: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 8.5G 1.4G 7.1G 17% / devtmpfs 483M 0 483M 0% /dev tmpfs 493M 12K 493M 1% /dev/shm tmpfs 493M 20M 474M 4% /run tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/sda1 497M 165M 332M 34% /boot tmpfs 99M 0 99M 0% /run/user/0 node1: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 8.5G 1.6G 7.0G 18% / devtmpfs 483M 0 483M 0% /dev tmpfs 493M 28K 493M 1% /dev/shm tmpfs 493M 20M 474M 4% /run tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/sda1 497M 165M 332M 34% /boot tmpfs 99M 0 99M 0% /run/user/0
能夠看到salt將每一臺minion運行的結果返回到咱們的master端,和執行df -h 的效果同樣。