saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是
1、系统配置管理,
2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。
不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt需要的依赖包:
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
服务器环境 | centos7(master) | centos7(slave) |
ip地址 |
192.168.226.128 | 192.168.226.128 |
身份 |
master | slave |
软件包 |
salt-master | salt-minion |
#在192.168.226.128中编辑host文件 ,把从机的进行解析
vim /etc/hosts
192.168.226.131 centos
#同样的在从机也是如配置
vim /etc/hosts
192.168.226.128 qishi
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
iptable -F
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all # 清空缓存 yum makecache # 生成yum缓存
查看salt包
yum list salt
在主机(192.168.226.128)上安装master
yum install salt-master -y
在主机(192.168.226.131)上安装monion
安装salt-minion
yum install salt-minion -y
准备master和minion的配置文件
salt-master的配置文件是/etc/salt/master salt-minion的配置文件是/etc/salt/minion 配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面
配置salt-master
# 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 常用配置解析
interface: 0.0.0.0 publish_port: 4505 user: root worker_threads: 5 ret_port: 4506 pidfile: /var/run/salt-master.pid log_file: /var/log/salt/master #自动接收minion的key #auto_accept: False
配置salt-monion
# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串 id: slave # salt运行的用户权限 user: root # master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串 master : master # 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 salt-minion常用配置
master: master master_port: 4506 user: root id: slave # id可以自定义,主机通过这个参数来操作指定的从机 acceptance_wait_time: 10 log_file: /var/log/salt/minion
systemctl start salt-minion systemctl start salt-master #检查salt状态 systemctl status salt-minion systemctl status salt-master
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
在salt-master执行
#salt-key命令用于管理mionion秘钥 [root@qishi ~]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: tom Rejected Keys:
此时tom已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。
在master上执行
[root@qishi ~]# salt-key -f tom Unaccepted Keys: tom: c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05
然后可以在minion上获取minion的秘钥
[root@centos2 ~]# salt-call --local key.finger local: c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05
因此可确认秘钥匹配,在master上接收秘钥
[root@qishi ~]# salt-key -a tom The following keys are going to be accepted: Unaccepted Keys: tom Proceed? [n/Y] y Key for minion tom accepted.
确认接收秘钥后,检验minion秘钥是否被接收
[root@qishi ~]# salt-key -L Accepted Keys: tom Denied Keys: Unaccepted Keys: Rejected Keys:
接收完成后就可以执行salt指令了
[root@linux-node1 ~]# salt-key -L Accepted Keys: #已经接受的key Denied Keys: #拒绝的key Unaccepted Keys:#未加入的key Rejected Keys:#吊销的key #常用参数 -L #查看KEY状态 -A #允许所有key -D #删除所有key -a #认证指定的key -d #删除指定的key -r #注销掉指定key(该状态为未被认证) #在master端/etc/salt/master配置 auto_accept: True #如果对Minion信任,可以配置master自动接受请求
#列出当前所有的key [root@salt0-master ~]# salt-key Accepted Keys: salt1-minion.example.com salt2-minion.example.com salt3-minion.example.com salt4-minion.example.com Denied Keys: Unaccepted Keys: Rejected Keys: #添加指定minion的key [root@salt0-master ~]# salt-key -a salt1-minion.example.com -y #添加所有minion的key [root@salt0-master ~]# salt-key -A -y #删除指定的key [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y #删除所有的key [root@salt0-master ~]# salt-key -D -y
首先知道master和minion都安装了什么文件,然后才知道怎么操作
master端
rpm -ql salt-master
/etc/salt/master # salt master主配置文件 /usr/bin/salt #salt master 核心操作命令 /usr/bin/salt-cp #salt 文件传输命令 /usr/bin/salt-key #salt证书管理 /usr/bin/salt-master #salt master 服务命令 /usr/bin/salt-run #salt master runner命令
slave端
rpm -ql salt-minion
/etc/salt/minion #minion配置文件 /usr/bin/salt-call #拉取命令 /usr/bin/salt-minion #minion服务命令 /usr/lib/systemd/system/salt-minion.service #minion启动脚本
[root@master ~]#salt ‘*‘ test.ping slave: True # salt 是一个命令 # * 表示目标主机, 在这里代表所有目标主机 # test.ping是salt远程执行的一个模块下面的方法。
这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活
test模块实际上还有许多其他的函数
[root@master 192.168.199.155 ~]$salt ‘*‘ sys.list_functions test slave: - test.arg - test.arg_repr - test.arg_type - test.assertion - test.attr_call - test.collatz - test.conf_test - test.cross_test - test.echo - test.exception - test.fib - test.get_opts - test.kwarg - test.module_report - test.not_loaded - test.opts_pkg - test.outputter - test.ping - test.provider - test.providers - test.rand_sleep - test.rand_str - test.retcode - test.sleep - test.stack - test.try_ - test.tty - test.version - test.versions_information - test.versions_report test其他函数
测试下test.echo
[root@master 192.168.226.128~]$salt ‘*‘ test.echo ‘你好~‘ slave: 你好~
此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第一条test.ping命令
在命令行输入的命令都是 执行模块
等到命令写入到文件中, 就叫做状态模块
salt --help #即可查看salt帮助 [root@master 192.168.226.128~]$salt --help Usage: salt [options] ‘<target>‘ <function> [arguments] salt命令 参数 目标 salt模块的函数 远程执行的参数
列出所有salt的sys模块
#与系统交互的sys模块 [root@master 10.0.0.5 ~]$salt ‘slave‘ sys.list_modules
远程执行命令模块
cmd是超级模块,所有shell命令都能执行
[root@master 10.0.0.5 ~]$salt ‘slave‘ cmd.run ‘ps -ef|grep python‘ slave: root 905 1 0 07:31 ? 00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P root 3843 1 0 11:05 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 3846 3843 0 11:05 ? 00:00:01 /usr/bin/python /usr/bin/salt-minion root 4031 1 0 11:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 4032 4031 0 11:31 ? 00:00:00 /bin/sh -c ps -ef|grep python root 4034 4032 0 11:31 ? 00:00:00 grep python
远程安装nginx
#在minion上安装nginx [root@master 10.0.0.5 ~]$salt ‘slave‘ pkg.install "nginx" #卸载minion上的nginx [root@master 10.0.0.5 ~]$salt ‘slave‘ pkg.remove "nginx" #检查pkg包的版本 [root@master 10.0.0.5 ~]$salt ‘slave‘ pkg.version "nginx"
远程拷贝文件
远程发送文件 salt-cp "slave" /etc/yum.repos.d/* /etc/yum.repos.d/
远程管理服务模块
管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
[root@master 10.0.0.5 ~]$salt ‘slave‘ service.start "nginx" slave: True [root@master 10.0.0.5 ~]$salt ‘slave‘ service.status "nginx" slave: True [root@master 10.0.0.5 ~]$salt ‘slave‘ service.stop "nginx" slave: True
原文:https://www.cnblogs.com/tjp40922/p/10764382.html