SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。



组成形式

配置文件从top.sls为入口,这里面定义所有文件信息。

基础环境搭建

服务端安装脚本

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P -M

客户端安装脚本

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P

 指定-P 代表着 master 安装

基础环境配置

服务端

vi /etc/salt/master
//配置主服务器地址
interface: 192.168.1.192
//以哪个用户运行
user: root
//指定salt配置路径
file_roots:
base:
- /root/saltstack/salt/base
prod:
- /root/saltstack/salt/prod
//环境配置文件
pillar_roots:
base:
- /root/saltstack/pillar/base

客户端配置

vi /etc/salt/minion
//指定主服务器ip
master: 192.168.1.192
//指定机器ID 不要重名!
id: salt_slave_01

此刻就配置完毕,进入调试连接部分

//打开客户端的debug模式(注意,必须关闭salt-minion服务,否则会提示端口占用,debug模式单独跑的!调试完毕以后在启动salt-minion服务)
root@salt_slave_01:~# salt-minion -l debug
//进入master,查看授权列表
[root@localhost ~]# salt-key -L
Accepted Keys: //同意的key
Denied Keys: //拒绝的key
Unaccepted Keys: //未接受的key
salt_slave_01
salt_slave_02
Rejected Keys: //被拒绝的key
//可以看到已经有两个minion请求授权了
//授权主机
[root@localhost ~]# salt-key -a salt_slave1
//全部授权
[root@localhost ~]# salt-key -A
//授权结束以后就完成了master和minion的连接动作
//测试和子节点的连通性
[root@localhost ~]# salt '*' test.ping
salt_slave_01:
True
salt_slave_02:
True
//安装配置文件中的服务,并同步所有配置文件数据
salt '*' sate.highstate
``
至此完成全部salt软件安装服务
# 命令附录
```shell
***********模块***********
查看模块列表module
salt 'minion' sys.list_modules
查看指定module的function用法
salt 'minion' sys.list_functions file
查看指定模块的详细用法
salt 'minion' sys.doc cmd
***********模块使用说明***********
查看配置管理state模块列表
salt 'minion' sys.list_state_modules
查看配置管理sate列表指定模块所有方法列表
salt 'minion' sys.list_state_functions svn
查看配置管理state列表指定模块详细用法
salt 'minion' sys.state_doc file
查看配置管理state列表指定模块的方法分支
salt 'minion' sys.state_doc file.managed
***********pillar变量***********
查看主机对应的所有pillar变量值
salt '*' pillar.data
salt '*' pillar.items
查看主机对应的多个pillar变量值
salt '*' pillar.item roles appname
修改pillar值后需要刷新pillar数据
salt '*' saltutil.refresh_pillar
查看pillar模块详细用法,其他类似
salt 'minion' sys.doc pillar
查看pillar的相关方法
salt 'minion' sys.list_functions pillar
"""
shuke:
- pillar.data
- pillar.ext
- pillar.get
- pillar.item
- pillar.items
- pillar.raw
"""
***********grains变量***********
查看模块用法
salt 'minion' sys.list_functions grains
查看item项
salt 'minion' grains.ls
查看所有iteams
salt 'minion' grains.items
获得某个item值
salt 'minion' grains.get os
同步_grains目录下的py脚本至minion
salt 'minion' saltutil.sync_all
如果py模块有修改,修改后进行重载
salt 'minion' sys.reload_modules
***********minions在线状态***********
查看所有minion状态
salt-run manage.status
查看所有minion在线状态
salt-run manage.up
查看所有minion不在线状态
salt-run manage.down
***********key管理***********
salt-key 密钥管理,通常在master端执行
salt-key [options]
salt-key -L ##查看所有minion-key
salt-key -a <key-name> ##接受某个minion-key
salt-key -d <key-name> ##删除某个minion-key
salt-key -A ##接受所有的minion-key
salt-key -D ##删除所有的minion-key
***********salt-call相关***********
salt-call 该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] <function> [arguments]
salt-call test.ping ##自己执行test.ping命令
salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数
***********文件分发***********
salt-cp 分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html
salt 'S1_0_001_Room' cp.get_dir salt://package /tmp -v 同步目录
salt 'S1_0_001_Room' cp.get_file salt://package/minions.tar.gz /tmp/minions.tar.gz gzip=5 同步文件
**********其他***********
salt-run jobs.active #查看所有minion当前正在运行的jobs
salt '*' saltutil.running # 查看正在运行的任务,找到jid
salt '*' saltutil.kill_job jid # 根据jid杀掉任务
salt '*' saltutil.clear_cache # 清除minion缓存
执行单个命令
salt 'minion' cmd.run 'ps -ef | grep mongod'
测试单个sls模块
salt 'minion' state.sls nginx test=True
执行前进行测试
salt 'minion' state.highstate test=True
在所有minion上执行状态:
salt 'minion' sate.highstate
获取执行jib任务的md5值
salt 'minion' hashutil.md5_digest 20170202150211366486
low数据可以使用state.show_lowstate方法查看
salt 'minion' state.show_lowstate --out yaml
High State数据可以使用state.show_hoghstate方法查看
salt 'minion' state.show_highstate --out yaml
#查看highstate
salt 'minion' state.show_highstate
#查看lowdata
salt 'minion' state.show_lowstate
#执行所有top.sls
salt '*' state.apply
#执行指定环境下top.sls
salt '*' state.apply saltenv=dev
注:
name:要执行的命令,记住该命令将会在salt-minion的路径和权限下执行
onlyif:用于检查的命令,仅当``onlyif``选项指向的命令返回true时才执行name定义的命令
unless:用于检查的命令,仅当``unless``选项指向的命令返回false时才执行name指向的命令
查看wyd用户下进程
salt -N 'Z1_S2' cmd.run 'su -c "ps -u wyd | grep -v top | grep -v bash | grep -v sshd | grep -v grep | grep -v ps | grep -v CMD " wyd'
state中(钩子函数)
requisiterequisite:require/watch/onchanges/onfail/use/prereq/require_in(反转)
========Targeting Minion=======
#Glob(默认)
salt '*' test.ping
salt \* test.ping
#PCRE 正则表达式
salt -E '^[m|M]in.[e|o|u]n$' test.ping = salt -E '^[mM]in.[eou]n$' test.ping
#list
salt -L web1,web2,db1 test.ping
#Subnet
salt -S 192.168.1.100 test.ping
salt -S 192.168.0.0/16 test.ping
#Grain
salt -G 'os:ubuntu' test.ping
salt -G 'os_family:Debian' test.ping
salt -G 'ip_interfaces:eth0:192.168.1.100' test.ping
salt -G 'ipv6:::1' test.ping
salt --grain-pcre 'os:red(hat|flag)' test.ping
#Pillar
salt -I 'my_var:my_val' test.ping
#混合(Compound)
salt -C 'G@os:Ubuntu,I@role:web,S@192.168.1.100/24' test.ping
salt -C 'min* or *ion' test.ping
salt -C 'web* or *qa,G@os:Arch' test.ping
#Nodegroup
salt -N webdev test.ping
添加计划任务
salt 'S1_*_Center' cron.set_job root '0' '5' '*' '*' '*' '/usr/sbin/logrotate -vf /etc/logrotate.d/acl >/tmp/cutacl_log 2>&1' identifier=cutacl
删除计划任务
salt -C 'E@S1_(10001|10002|10003)_*' cron.rm_job wyd 'cd /data/wyd/game_server_1.2.0/log;find . -type f -mtime +15 -name "*.log*" -exec rm -rf {} \; 2>&1' identifier='clear log'