SaltStack安装
各Linux版本安装详见官方安装文档。
以下都是在CentOS 6.4 64bit
系统上进行。
1 | $> rpm --import https://repo.saltstack.com/yum/redhat/6/x86_64/latest/SALTSTACK-GPG-KEY.pub |
安装问题集
缺少psutil模块
AttributeError: ‘module’ object has no attribute ‘get_sysinfo’1
2
3$> pip install psutil
#若提示python版本过低则
$> pip install psutil --upgradeIPV6地址不可达导致无法安装
关闭IPv6永久关闭
修改/etc/sysctl.conf
配置文件,加入如下内容1
2
3
4
5
6#shutdown IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
#生效配置
$> sysctl -p临时关闭
1
2echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
SaltStack配置
salt-master 配置
salt-master监听端口:
4505
(publish_port)
salt的消息发布系统4506
(ret_port)
salt客户端与服务端通信的端口
默认配置文件:/etc/salt/master
nodegroups定义规则:
- G – Grains glob匹配,例如:G@os:Ubuntu
- E – minion 正则表达式匹配,例如:E@web\d+.(dev|qa|prod).loc
- P – Grains PCRE 正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)
- L – minion 列表匹配,例如:L@minion1.example.com,minion3.domain.com or bl*.domain.com
- I – Pillar glob单个匹配,例如:I@pdata:foobar
- S – 子网/IP 匹配,例如:S@192.168.1.0/24 or S@192.168.1.100
- R – Range cluster客户端范围匹配,例如: R@%foo.bar
- D – minion data匹配,例如:D@key:value
1 | interface: 0.0.0.0 |
按照nodegroups分组批量管理(新增nodegroups定义后不需要重启salt-master)1
2
3
4
5
6$> salt –N tool test.ping
tclient.10.0.6.6:
True
tserver.10.0.6.5:
True
salt-minion 配置
默认配置文件:/etc/salt/minion
salt-minion的id
比较重要,可用于salt-master指定nodegroups分组等用途。1
2
3
4
5
6master: 10.0.2.233
id: tserver.10.0.6.5
log_file: /var/wwwlog/saltstack/minion.log
key_logfile: /etc/salt/key
$> /etc/init.d/salt-minion start
SaltStack 认证
皆在salt-master端
查看
1
salt-key –L
接受
1
salt-key –a minion_id
接受所有
1
salt-key –A
master设置自动接受所有:/etc/salt/master——
auto_accept: True
测试连通
1
2salt '*' test.ping
salt '*' test.ping –t 15 (-t 设置超时时间)Debug
1
salt -N tool test.ping -v -l all
删除minion
1
salt-key -d minion_id
认证过程
- minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(privatekey)和minion.pub(publickey),然后将minion.pub发送给master。
- master在接收到minion的publickey后,通过salt-key命令acceptminionpublickey,这样在master的/etc/salt/pki/master/minions下的将会存放以minionid命名的publickey,然后master就能对minion发送指令了。
SaltStack 批量管理
远程执行命令
1
salt '*' cmd.run 'bash --version'
远程执行指定语言的命令
1
2
3
4
5
6#salt ‘目标’ 执行语言 对应语言的代码
salt 'centos7.10.0.2.222' cmd.exec_code python 'print "test"'
salt 'centos7.10.0.2.222' cmd.exec_code bash 'echo "test"'
centos7.10.0.2.222:
test从master批量复制文件到minion
源文件目录可在master配置文件中指定,默认路径为/srv/salt/
:1
2
3file_roots:
base:
- /srv/salt/1
2#必须指定到文件
salt '*' cp.get_file salt://vimrc /etc/vimrc或者直接用
salt-cp
命令1
salt-cp -N tool sh/*.sh /tmp/
minion远程下载master脚本并执行
master端脚本存放路径:/srv/salt/scripts(/srv/salt
同上的file_roots
设置)
minion默认脚本存放路径:/var/cache/salt/minion/files/base/scripts/1
salt \* cmd.script salt://scripts/test.sh
SaltStack 配置管理
top.sls
top.sls
是配置管理的入口文件,若使用state.highstate
则会根据top.sls
的内容将statefile
推送到salt-minion并执行;若是直接指定statefile
则可不根据top.sls
。在salt-master主机上,默认存放在/srv/salt/top.sls
。 (/etc/salt/master——file_roots)
top.sls
文件结构:
base
:top.sls
默认从base
标签开始解析执行。操作目标
:需要执行操作的salt-minion目标。可以通过正则、grain模块、分组名来进行匹配。statefile
:需要执行的state文件。指定statefile不需要包含扩展名(.sls
),详见下节内容。
top.sls文件样例1
2
3
4
5
6
7
8
9
10
11
12
13
14base:
tool: #nodegroup分组名指定目标
- match: nodegroup #指定匹配类型为nodegroup
- statefile.apache #state文件:/srv/salt/statefile/apache.sls
'centos7.10.0.2.222': #直接指定minion_id目标
- statefile.nginx
'os:CentOS': #通过grain指定目标
- match: grain #指定匹配类型为grain
- statefile.git
'*': #目标为所有minion
- statefile.all
SLS文件——statefile
SLS文件规则
- SLS文件的扩展名
.sls
被省略。 (例如:nginx.sls 变成 nginx) - 若有子目录,子目录都由一个点来表示.(例如 statefile/nginx.sls写成 statefile.nginx)
- 若子目录下存在
init.sls
文件,引用的时候仅指定该目录即可. (例如 statefile/init.sls 可以简称为 statefile) - 若一个目录下同时存在
statefile.sls
和statefile/init.sls
,那么 statefile/init.sls 将被忽略,SLS文件引用的statefile将只引用statefile.sls - 缩进严格按照python标准,且不要用tab做缩进而应用空格!
实例分析
通过具体实例分析statefile(hexo会对markdown显示有些影响)
cmd.script
1
2
3
4
5cmdscript:
cmd.script:
- source: salt://scripts/test.sh
- user: root
- shell: /bin/bashcmdscript
:ID标签定义cmd.script
:使用saltstack的cmd.script
模块source
: 指定master端脚本存放路径,minion从master上下载并执行。master上物理存放路径:/srv/salt/scripts/test.sh
user
:指定执行脚本的用户shell
:指定执行脚本的shell
cmd.run
1
2
3
4
5
6
7
8
9
10
11cmdrun:
cmd.run:
- cwd: /tmp
- name: pwd;uptime
cmdrun2:
cmd.run:
- cwd: /tmp
- names:
- pwd
- uptimecmd.wait
1
2
3
4
5
6
7
8
9
10
11cmdwait:
cmd.wait:
- names:
- /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
- watch:
- file: /usr/local/nginx/conf/vhosts/cmdwait.conf
/usr/local/nginx/conf/vhosts/cmdwait.conf:
file.managed:
- source: salt://configfile/cmdwait.conf
- backup: minioncmd.wait
:条件执行命令,满足条件后才执行names
中的命令。watch
:文件监控(监控文件是否存在或变化),此处监控salt-minion上file
指定的文件且作为cmd.wait
的条件。file.managed
:文件管理/usr/local/nginx/conf/vhosts/cmdwait.conf
:salt-minion上文件路径,同步来自salt-master上指定的文件。source
:salt-master上的文件,如果此文件有变化推送SLS配置管理时会立即同步到salt-minion上。backup
:指定salt-minion在同步文件前先备份原有文件,默认备份路径/var/cache/salt/minion/file_backup
Apache配置管理实例
若要使用service
则需要有/etc/init.d/httpd
脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19apache:
pkg:
- name: httpd
- installed
service:
- name: httpd
- running
- enable: True
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf
- require:
- pkg: httpd
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://configfile/httpd.conf
- backup: minionunless & onlyif
unless——当命令执行返回’False’时,执行name里的命令;onlyif相反1
2
3
4apacheStart:
cmd.run:
- name: service httpd start
- unless: ps aux|grep httpd|grep -v grep|grep -v 'bash -c'使用saltstack批量配置vim
statefile:/srv/salt/statefile/vimConfig.sls
推送执行vimConfig.sls
:salt -G os:CentOS state.sls statefile.vimConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29vimInstall:
pkg.installed:
- names:
- vim-enhanced
- unzip
vimDownload:
file.managed:
- name: /home/work/software/AutoConfigVim.zip
- source: salt://software/AutoConfigVim.zip
- unless: test -e /home/work/software/AutoConfigVim.zip
- require:
- pkg: vimInstall
vimUnzip:
cmd.run:
- cwd: /home/work/software
- name: unzip -q AutoConfigVim.zip
- unless: test -e /home/work/software/AutoConfigVim
- require:
- file: vimDownload
vimScript:
cmd.run:
- cwd: /home/work/software/AutoConfigVim
- name: bash AutoConfigVim.sh
- onlyif: test -e /home/work/software/AutoConfigVim/AutoConfigVim.sh
- require:
- cmd: vimUnzip
推送执行SLS配置管理
根据top.sls的内容,将全部statefile文件推送到指定minion并执行
1
salt –N tool state.highstate
不根据top.sls,只将特定的statefile(
statefile/cmdscript.sls
)推送到指定minion并执行(-v
查看执行反馈)1
salt -N tool state.sls statefile.cmdscript –v
获取minion信息——grains & pillar
grains 和 pillar都可用于获取minion的信息,但两者有很多不同的地方需要注意。
grains
- minion每次启动时采集minion信息并向master汇报
- grains用于存储静态、不常变化的信息数据
- grains存储在minion本地
- minion可对grains进行操作(新增、删除等)
pillar
- pillar用于存储敏感或常变化的信息数据
- pillar存储在master本地
- minion只能对自己的pillar进行查询的权限,无法修改。
grains
查看minion所有信息
1
salt -N tool grains.items
列出所有查看项目
1
salt -N tool grains.ls
查看特定项目
1
salt -N tool grains.item ipv4
自定义信息项
mkdir -p /srv/salt/_grains
目录下编写脚本,返回时必须为字典。
salt-master端:/srv/salt/_grains/getNginxVer.py
1
2
3
4
5
6
7
8import commands
def getNginxVer():
"""get minion nginx version"""
ngxver = {}
ngxV = commands.getoutput('/usr/local/nginx/sbin/nginx -V')
ngxver['nginxversion'] = ngxV.split('\n')[0].split('/')[-1]
return ngxver自定义grains脚本同步到minion:会将_grains目录下的文件全部同步到minion
1
salt ‘*’ saltutil.sync_grains
获取自定义grains信息项:
1
salt ‘*’ grains.item nginxversion
pillar
查看默认pillar
1
salt -N tool pillar.data
默认pillar路径(pillar_roots):
/srv/pillar
组织pillar文件、pillar入口文件:/srv/pillar/top.sls
pillar和SLS一样拥有自己的top.sls
文件,通过top.sls文件作为入口,组织其它的pillar文件。
自定义pillar待了解。
SaltStack 模块
系统模块
最新在线系统模块查询:saltstack系统模块
命令查询在线doc:1
salt \* sys.doc disk
系统模块如:1
2salt ‘*’ test.ping
salt ‘*’ disk.usage
自定义模块
默认模块存放路径
/srv/salt/_modules
自定义模块样例——
/srv/salt/_modules/custom.py
1
2def test():
return 'This is saltstack custom module test.'同步自定义模块到minion
此操作会将master上/srv/salt/_modules
目录下的所有目录及文件同步到minion上的/var/cache/salt/minion/files/base/_modules
目录下。(包括隐藏文件)1
salt \* saltutil.sync_modules
执行自定义模块
1
salt \* custom.test
自定义returners
默认模块存放路径
/srv/salt/_returners
自定义returner样例——
/srv/salt/_returners/writefile.py
1
2
3
4
5
6
7
8
9
10
11
12
13#!/usr/bin/python2.7
#coding: utf-8
def __virtual__():
"""调用时用的名字"""
return "writefile"
def returner(result):
"""将minion的return写入到文件"""
fd = open('/tmp/saltReturn.txt', 'a+')
fd.write(str(result))
fd.close()同步自定义returner
1
salt \* saltutil.sync_returners
调用自定义returner:
1
salt -N centos7 cmd.run 'uptime' --return writefile
计划任务
默认情况下,时间参数都是*
,执行用户是”root”,当修改一个当前存在的cron job,这个名字的声明必须是全局唯一的,否则会自动新增crontab job!
如果cron的命令(name)被修改,只会新增cron job不会更新!!
定时任务样例——crontab.sls1
2
3
4
5
6
7
8
9
10
11
12
13cronScriptFile:
file.managed:
- name: /home/work/script/cron.sh
- source: salt://scripts/cron.sh
crontab20141020:
cron.present:
- name: bash /home/work/script/cron.sh >> /dev/null 2>&1
- user: root
- minute: random
- hour: '*/2'
- require:
- file: cronScriptFile
关于saltstack无返回信息的问题
saltstack用一段时间后发现一个非常严重的问题。当salt-master执行命令时,部分salt-minion并没有返回任何信息,无论是成功还是失败信息都没有。这导致无法确定salt-minion是否执行了命令还是返回信息丢失,这样的不可控性对Ops来说是个非常严重的问题。
为解决此问题根据jid查看salt-minion的执行情况。当salt-master执行命令时加上-v
参数,让其返回任务的jid
。若有salt-minion没有返回信息则根据此jid
查询任务结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17$> salt -v \* cmd.run 'echo "jid test"'
Executing job with jid 20160225103117255324
-------------------------------------------
centos7.10.0.2.222:
jid test
tserver.10.0.6.5:
jid test
tclient.10.0.6.6:
jid test
$> salt-run jobs.lookup_jid 20160225103117255324
centos7.10.0.2.222:
jid test
tclient.10.0.6.6:
jid test
tserver.10.0.6.5:
jid test
假若管理的salt-minion达到一定数量,可使用--async
参数异步执行命令,然后根据jid
查询执行结果。1
2
3
4
5
6
7
8
9
10
11
$> salt --async \* cmd.run 'echo "jid test"'
Executed command with job ID: 20160225104129665398
$> salt-run jobs.lookup_jid 20160225104129665398
centos7.10.0.2.222:
jid test
tclient.10.0.6.6:
jid test
tserver.10.0.6.5:
jid test
关于jid
salt-master每执行一次salt命令就会产生一个Job,每个Job会有一个唯一的jid
。
jid
: job id, 格式为%Y%m%d%H%M%S%f
salt-master在下发指令消息时, 会附带上产⽣的jid. salt-minion接收到指令开始执⾏时, 会在本地cachedir(默认是/var/cache/salt/minion/proc
)下以该jid命名产生⽂件,⽤于在执⾏过程中master查看当前任务的执⾏情况. 指令执⾏完毕将结果传送给master后并删除该临时⽂件⽂件。
salt-master将salt-minion的执⾏结果存放在本地/var/cache/salt/master/jobs
目录下, 默认缓存24⼩时(可通过修改master配置⽂件keep_jobs
选项调整)