您好,登錄后才能下訂單哦!
SaltStack介紹
saltstack是一個開源的批量分發(fā)管理工具,具有非常強(qiáng)大的管理功能,能同時管理上萬臺服務(wù)器。由python語言編寫,并提供API.
saltstack有四種運(yùn)行方式:Local, Master/Minion, Salt SSH,Syndic
saltstack有三大功能:遠(yuǎn)程執(zhí)行,配置管理(狀態(tài)),云管理。
saltstack支持多種常見的操作系統(tǒng),包括Windows(只能做為minion)。
saltstack是依賴于ZeroMQ來實(shí)現(xiàn)的(訂閱發(fā)布模式),監(jiān)聽4505端口(發(fā)布系統(tǒng)端口)。所有的minion都會連接到master上的4505端口,而master上的4506端口用于接受minion返回的數(shù)據(jù)。由于使用的是TCP長連接,所以在master上對海量的服務(wù)器執(zhí)行命令時,會得到非常迅速的響應(yīng)。
SaltStack的安裝配置
http://repo.saltstack.com/#rhel
SaltStack提供了非常豐富的安裝方式,可以在官方網(wǎng)站找到對應(yīng)的說明。
這里使用兩臺CS7的系統(tǒng),一臺作為master(node1),另一臺作為Minion(node2)。
安裝SaltStack倉庫:
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
在master端安裝服務(wù)端和客戶端:
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 #可以是主機(jī)名或IP #id: #id默認(rèn)可以不改,為主機(jī)名 # systemctl start salt-minion #啟動minion服務(wù)
啟動成功后,會生成一個/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校驗(yàn)對比,可以發(fā)現(xiàn)master上收到的node2的密鑰和node2本地的密鑰相同:
# 完成分發(fā)后,路徑改變 [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主機(jī):
[root@node1 salt]# salt-key Accepted Keys: Denied Keys: Unaccepted Keys: node1 node2 Rejected Keys:
加入指定的minion主機(jī):
# salt-key -a node1 #可以使用通配符如 node*添加所有以node開頭為開頭的主機(jī) The following keys are going to be accepted: Unaccepted Keys: node1 Proceed? [n/Y] Y Key for minion node1 accepted.
同意所有minion主機(jī):
# salt-key -A
對所有的主機(jī)執(zhí)行命令,測試主機(jī)是否在線:
[root@node1 ~]# salt '*' test.ping node2: True node1: True
對所有主機(jī)運(yùn)行一個命令,出現(xiàn)下面結(jié)果說明可以進(jìn)行遠(yuǎn)程管理了:
[root@node1 ~]# salt '*' cmd.run 'date' node1: Fri Nov 4 14:21:37 CST 2016 node2: Fri Nov 4 14:21:37 CST 2016
如果在使用過程中修改了主機(jī)名(不推薦這樣做,會造成很多問題),可以在minion的配置文件中指定主機(jī)名(id), 然后刪除修改主機(jī)的KEY,重新啟動minon:
[root@node-1 ~]# salt-key -d old-key-name #刪除指定的key [root@node-1 ~]# salt-key -D # 刪除所有key
SaltSack配置管理
當(dāng)需要對海量的機(jī)器進(jìn)行配置管理的時候經(jīng)常會修改各種配置文件,SaltStack的配置管理可以讓我們更方便的部署服務(wù),針對不同的服務(wù)器和不同的服務(wù),可以通過編輯.sls文件來管理。
SaltStack的配置分發(fā)管理是使用YAML狀態(tài)文件來編寫的。
YAML語法:
1.縮進(jìn): 兩個空格,不能使用tab鍵。
2.冒號:代表鍵值對 key: value (注意,鍵值對冒號后面有一個空格)
3.短橫線:表示列表(短橫線后面有一個空格)
基礎(chǔ)配置
編輯配置文件,定義YAML模塊:
# vim /etc/salt/master #打開基礎(chǔ)配置 file_roots: base: - /srv/salt #配置文件根路徑
在示例中又三個模塊,base,dev,prod.分別代表基礎(chǔ)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的配置,可以對每個模塊可以指定對應(yīng)路徑:
# 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
創(chuàng)建根路徑:
mkdir /srv/salt/ # salt的根路徑
批量執(zhí)行相同命令
在需要對大量主機(jī)安裝配置相同的內(nèi)容時可以通過編輯簡單的sls文件來執(zhí)行。
創(chuàng)建base環(huán)境文件分類目錄,編輯需要安裝的配置:
mkdir /srv/salt/web vim /srv/salt/web/apache.sls #編寫內(nèi)容: apache-install: #命名ID,可隨意命名 pkg.installed: #pkg模塊,調(diào)用installed方法 - names: #installed方法中的參數(shù) - httpd #需要安裝的包名 - httpd-devel apache-service: #狀態(tài)命名ID service.running: #調(diào)用service.running方法 - name: httpd #服務(wù)的命名為httpd - enable: True #設(shè)置開機(jī)自啟動
執(zhí)行.sls文件:
salt '*' state.sls web.apache #state.sls執(zhí)行模塊,執(zhí)行根目錄中apache.sls文件
此時會在兩臺在線的主機(jī)上安裝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通過復(fù)制master的.sls文件到本地執(zhí)行。
對不同主機(jī)指定不同的動作
在master配置文件中,指定top配置文件,top文件必須在base環(huán)境中。
#state_top: top.sls #默認(rèn)不需要配置
在指定的base環(huán)境路徑上編寫top.sls文件,為不同的minion主機(jī)指定不同的動作:
[root@node1 salt]# cat /srv/salt/top.sls base: 'node1': - web.apache 'node2': - web.apache
執(zhí)行高級狀態(tài)命令,使top.sls文件生效:
salt '*' state.highstate test=True #測試top文件,對minion不做修改 salt '*' state.highstate # * 代表所有minion,執(zhí)行top文件內(nèi)容
SaltStack數(shù)據(jù)系統(tǒng)
SaltStack是通過兩種數(shù)據(jù)系統(tǒng)來發(fā)布的,Grains和Pillar。通過數(shù)據(jù)系統(tǒng)來統(tǒng)計主機(jī)的相關(guān)信息,進(jìn)而幫助用戶使用多樣化的方式來篩選定位我們要執(zhí)行salt命令的主機(jī)。
Grans介紹
Grains: 獲取靜態(tài)數(shù)據(jù) ,當(dāng)minion啟動的時候收集Minion本地的相關(guān)信息,如操作系統(tǒng)版本,內(nèi)核信息,硬件信息等,也可以自定義。當(dāng)minion啟動后,獲取的數(shù)據(jù)就不會再改變,只有重啟或同步時才能獲取新的變化信息。
Grains的特性可以有幾種應(yīng)用場景:
資產(chǎn)管理,信息查詢。
用于目標(biāo)選擇。(salt -G 'key:value' cmd.run 'cmd')
配置管理中使用。
查看Grains信息:
salt 'node1' grains.ls #顯示所有模塊
salt 'node1' grains.items #顯示所有模塊的信息
salt '*' grains.item fqdn #返回所有minion端的fqdn信息
使用Grains指定信息對應(yīng)的主機(jī),執(zhí)行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 參數(shù)指定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
這樣就可以根據(jù)Grains的匹配結(jié)果來對符合匹配結(jié)果的主機(jī)執(zhí)行命令:
[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進(jìn)行匹配
vim /srv/salt/top.sls base: 'node1': - web.apache 'saltname:trying': #此處grains匹配上node2 - match: grain #匹配grains,不加s. - web.apache
使用python腳本編寫一個Grains
使用python腳本編寫一個grains,需要存放在base環(huán)境中的_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 #這里可以指定主機(jī)同步 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 #真正執(zhí)行的腳本 │ └── 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上查看執(zhí)行結(jié)果,已經(jīng)同步到minion上:
[root@node1 _grains]# salt '*' grains.item blog node1: ---------- blog: trying node2: ---------- blog: trying
Grains的優(yōu)先級
上面給出了四種方式可以使用Grains的值,在這四種方式中,如果出現(xiàn)了同名的情況,會
按照以下的優(yōu)先級來獲取對應(yīng)的值:
系統(tǒng)自帶的值
/etc/salt/grains文件中編寫的值
minion配置文件中定義的值
/srv/salt/_grains/my_grains.py 腳本中自定義的值
================
Pillar介紹
與Grains不同的是,Pillar是動態(tài)的,能給特定的minion指定特定的數(shù)據(jù)。只有指定的minion能看到自己的數(shù)據(jù),這樣常用與一些敏感的特殊數(shù)據(jù)。
默認(rèn)情況下pillar的系統(tǒng)模塊是關(guān)閉的:
[root@node1 salt]# salt '*' pillar.items node1: ---------- node2: ----------
可以在/etc/salt/master中打開注釋,修改為True,系統(tǒng)的這些變量很少會用到:
pillar_opts: True
自定義pillar
自定義pillar需要編寫一個sls文件,在文件中定義pillar. 使用YAML定義多級。
修改master配置文件,打開注釋:
vim /etc/salt/master pillar_roots: base: - /srv/pillar
重啟salt-master:
systemctl restart salt-master
創(chuàng)建pillar的目錄:
mkdir /srv/pillar
和grains一樣,創(chuàng)建分類目錄和.sls的文件
vim /srv/pillar/web/apache.sls {% if grains['os'] == 'CentOS' %} apache: httpd {% elif grains['os'] == 'Debian' %} apache: apache2 {% endif %}
在pillar目錄中編寫top file指定主機(jī),和grains中的一樣:
# cat /srv/pillar/top.sls base: 'node2': #只指定了node2 - web.apache
刷新,使配置生效:
# salt '*' saltutil.refresh_pillar node2: True node1: True
執(zhí)行查看pillar items 生效:
# salt '*' pillar.items apache node2: ---------- apache: httpd node1: ---------- apache:
使用pillar匹配上主機(jī)node2,執(zhí)行命令:
# salt -I 'apache:httpd' cmd.run 'hostname' node2: node2
Grains和Pillar的對比
分類 | 類型 | 數(shù)據(jù)采集方式 | 應(yīng)用場景 | 定義位置 |
Grains | 靜態(tài) | minion啟動時收集 | 數(shù)據(jù)查詢,目標(biāo)選擇,配置管理 | minion |
Pillar | 動態(tài) | master自定義 | 目標(biāo)選擇,配置管理,敏感數(shù)據(jù) | master |
SaltStack遠(yuǎn)程執(zhí)行
saltstack命令語法, salt '*' cmd.run 'w'
命令:salt
目標(biāo):‘*’
模塊: cmd.run 自帶150+模塊,也可以自定義編寫模塊
返回:執(zhí)行后結(jié)果返回。
目標(biāo)選擇方式
所有匹配目標(biāo)的方式都可以用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/子網(wǎng)方式:
# 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編寫,使用這些模塊可以很方便的返回一個信息列表或者執(zhí)行某些任務(wù)。
常用的一些模塊舉例:
network模塊:網(wǎng)絡(luò)相關(guān)服務(wù)
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.network.html#module-salt.modules.network
salt.modules.network.active_tcp :
這里表示了模塊函數(shù)的路徑和位置,salt.modules表示的就是slat模塊在本機(jī)的安裝位置,一般默認(rèn)情況下在 /usr/lib/python2.7/site-packages/salt/modules
在執(zhí)行命令的時候可以直接使用slat命令來調(diào)用
service 模塊:和主機(jī)當(dāng)前服務(wù)相關(guān)的模塊
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.service.html#module-salt.modules.service
在一些常用的模塊中,有一些模塊方法已經(jīng)有了單獨(dú)的命令如cp模塊:
cp是復(fù)制模塊,在系統(tǒng)中我們可以直接使用salt-cp 如:
salt-cp ‘*’ /etc/hosts /tmp/ #拷貝本地的hosts文件到所有minion的/tmp目錄下。
state:執(zhí)行模塊
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html#module-salt.modules.state
Saltstack返回程序
數(shù)據(jù)的返回是由minion端提供的,可以將minion返回的數(shù)據(jù)直接寫入到mysql中而不經(jīng)過master。
要實(shí)現(xiàn)minion直接返回數(shù)據(jù)到mysql,需要在所有的minion安裝MySQL-python
salt '*' state.single pkg.installed name=MySQL-python
使用返回數(shù)據(jù)存入mysql,需要在master上安裝數(shù)據(jù)庫,并且創(chuàng)建表結(jié)構(gòu),授權(quán):
https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html
執(zhí)行下面命令,創(chuàng)建數(shù)據(jù)庫并授權(quán):
> 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服務(wù):
在配置最后添加如下信息:
mysql.host: '172.16.10.60' # mysql所在的主機(jī)地址 mysql.user: 'salt' mysql.pass: 'salt' mysql.db: 'salt' mysql.port: 3306
重啟minion服務(wù):
systemctl restart salt-minion
執(zhí)行數(shù)據(jù)庫測試命令:
salt '*' test.ping --return mysql
再次查看數(shù)據(jù)庫,發(fā)現(xiàn)已經(jīng)寫入數(shù)據(jù):
[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
執(zhí)行一條命令,寫入數(shù)據(jù)庫:
salt '*' cmd.run 'df -h' --return mysql
再次查看數(shù)據(jù)庫,會發(fā)現(xiàn)數(shù)據(jù)庫中已經(jīng)記錄了操作的命令和返回值記錄,以及操作的時間。
編寫狀態(tài)模塊
我們可以根據(jù)自己的需要,自定義一些狀態(tài)模塊。比如,可以編寫一個模塊腳本,來執(zhí)行復(fù)雜的操作,直接使用salt來調(diào)用這些模塊就可以實(shí)現(xiàn)我們需要的功能。
模塊存放的路徑:/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
運(yùn)行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運(yùn)行的結(jié)果返回到我們的master端,和執(zhí)行df -h 的效果一樣。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。