SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
salt基本原理
SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信
master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,
locate salt | grep /usr/
可以看到salt自带的所有东西。这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行
salt '*' cmd.run 'uptime'
的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。
具体步骤如下
cmd.run ls
命令从salt.client.LocalClient.cmd_cli
发布到master,获取一个Jodid,根据jobid获取命令执行结果。minion._handle_aes
处理minion._handle_aes
发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub
方法,将执行结果通过消息总线返回给mastermaster._handle_aes
方法,将结果写的文件中salt.client.LocalClient.cmd_cli
通过轮询获取Job执行结果,将结果输出到终端。
安装salt
7版本
rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
6版本
rpm --import https://repo.saltstack.com/yum/redhat/6/x86_64/latest/SALTSTACK-GPG-KEY.pub
#新增文件 /etc/yum.repos.d/saltstack.repo
7 & 6版本
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS $releasever
baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub
安装 salt-minion, salt-master,或Salt components:
yum install salt-master
yum install salt-minion
yum install salt-ssh
yum install salt-syndic
yum install salt-cloud
master
一般使用默认就好 (/etc/salt/master)
#指定master,冒号后有一个空格
master: 192.168.2.22
user: root
#-------以下为可选--------------
# salt运行的用户,影响到salt的执行权限
user: root
#s alt的运行线程,开的线程越多一般处理的速度越快,但一般不要超过CPU的个数
worker_threads: 10
# master的管理端口
publish_port : 4505
# master跟minion的通讯端口,用于文件服务,认证,接受返回结果等
ret_port : 4506
# 如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级master的监听端口
syndic_master_port : 4506
# 指定pid文件位置
pidfile: /var/run/salt-master.pid
# saltstack 可以控制的文件系统的开始位置
root_dir: /
# 日志文件地址
log_file: /var/log/salt_master.log
# 分组设置
nodegroups:
group_all: '*'
# salt state执行时候的根目录
file_roots:
base:
- /srv/salt/
# 设置pillar 的根目录
pillar_roots:
base:
- /srv/pillar
启动master
systemctl start salt-master
systemctl enable salt-master
minion
(/etc/salt/minion)
#指定master,冒号后有一个空格
master: 192.168.2.22
id: minion-01
user: root
#-------以下为可选--------------
# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
id: 192.168.0.100
# salt运行的用户权限
user: root
# master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
master : 192.168.0.100
# master通讯端口
master_port: 4506
# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
backup_mode: minion
# 执行salt-call时候的输出方式
output: nested
# minion等待master接受认证的时间
acceptance_wait_time: 10
# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
acceptance_wait_time_max: 0
# 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
random_reauth_delay: 60
# 日志文件位置
log_file: /var/logs/salt_minion.log
# 文件路径基本位置
file_roots:
base:
- /etc/salt/minion/file
# pillar基本位置
pillar_roots:
base:
- /data/salt/minion/pillar
启动minion
systemctl start salt-master
systemctl enable salt-master
添加key
master 端查看key
[root@master salt]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys: #可看到 minion已经检测到,没有认证key
minion-01
Rejected Keys:
[root@master salt]# salt-key -a minion-01
The following keys are going to be accepted:
Unaccepted Keys:
minion-01
Proceed? [n/Y] y #Y确认添加
Key for minion minion-01 accepted. #添加成功
[root@master salt]# salt-key
Accepted Keys:
minion-01
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@master salt]#
salt-key常用参数
-a | 添加指定ID 的key |
---|---|
-A | 添加全部 |
-R | 拒绝全部 |
-d | 删除指定ID的 |
-D | 删除全部 |
测试连通性
[root@master salt]# salt 'minion-01' test.ping
minion-01:
True #返回结果表示成功
[root@master salt]#
简单服务的安装
[root/] ]$salt 'minion-01' pkg.install ftp #解释
minion-01:
----------
ftp:
----------
new:
0.17-67.el7
old:
[root/] ]$
#去minion查看
[root@minion-01 tmp]# rpm -qa ftp
ftp-0.17-67.el7.x86_64
#salt 'minion-01' pkg.install ftp
#1.'*' 代表的是target是指在那些minion上操作
#2. 'pkg' 是一个执行模块,就像'test'
#3.'install' 是执行模块下面的函数,像test下的ping
#4.'ftp' 是函数的参数(arg),有的函数需要参数,有的不需要比如test.ping就不需要参数
##查看所有执行模块的doc
salt 'minion' sys.doc
##查看test模块的帮助
salt 'minion' sys.doc test
##查看test.ping函数的帮助
salt 'minion' sys.doc test.ping
salt
该命令执行salt的执行模块,通常在master端运行.常用命令
salt [option] '' [arguments]
#例如
salt 'minion-01' cmd.run 'ip addr'
salt-run
该命令执行runner(salt自带或者自定义的,),通常在master端执行,比如经常用到的manage
salt-run [options] [runner.func]
#例如
salt-run manage.status ##查看所有minion状态
salt-run manage.down ##查看所有没在线minion
salt-run manage.up ##查看所有在线minion
转载自:https://www.jianshu.com/p/624b9cf51c64