slatstack高效运维
一.简介
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
二.诞生的背景
系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是
1、系统配置管理,
2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。
不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
三.运行方式
- Local 本地运行,交付管理
- Master/Minion <<< 常用方式
- Salt SSH 不需要客户端
四.架构
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt需要的依赖包:
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
五.salary的实现流程
1.准备两台虚拟机
服务器环境 | centos7(master) | centos7(slave) |
ip地址 |
192.168.226.128 | 192.168.226.128 |
身份 |
master | slave |
软件包 |
salt-master | salt-minion |
2.确保虚拟机之间可通讯
#在192.168.226.128中编辑host文件 ,把从机的进行解析
vim /etc/hosts
192.168.226.131 centos
#同样的在从机也是如配置
vim /etc/hosts
192.168.226.128 qishi
3.关闭两台机器的防火墙
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
iptable -F
4. 配置yum的源为阿里(先备份原来有的再操作)
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
5.安装
在主机(192.168.226.128)上安装master
yum install salt-master -y
在主机(192.168.226.131)上安装monion
安装salt-minion
yum install salt-minion -y
6.编辑salt服务端的配置软件
准备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
7.分别启动主机和从机(在不用机器上操作)
systemctl start salt-minion systemctl start salt-master #检查salt状态 systemctl status salt-minion systemctl status salt-master
8.主机接收从机的的秘钥(因为在主机上的自动接收参数设置为false)
在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的公钥,等待下一步指令。
9.主从及秘钥配对
在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指令了
六.salt-key
1.相关参数
[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自动接受请求
2.增删查
#列出当前所有的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
七.salt的操作
首先知道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启动脚本
1.第一条命令
[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命令的组成
在命令行输入的命令都是 执行模块
等到命令写入到文件中, 就叫做状态模块
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
[root@qishi ~]# salt "*" cmd.run "ifconfig"
tom:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.226.131 netmask 255.255.255.0 broadcast 192.168.226.255
inet6 fe80::57ba:f632:6ad1:56cb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:da:75:09 txqueuelen 1000 (Ethernet)
RX packets 48304 bytes 59689324 (56.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17382 bytes 1376012 (1.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 192 bytes 21456 (20.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 192 bytes 21456 (20.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#远程成创建文件夹
salt "*" cmd.run "mkdir -p /tmp/qishi2/qiange/qianshao/qiandi"
远程安装nginx
#在minion上安装nginx [root@master 10.0.0.5 ~]$salt "*" cmd.run "yum install -y 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 "tom" /etc/yum.repos.d/* /etc/yum.repos.d/
远程管理服务模块
管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
salt "*" service.stop "nginx"
salt "*" service.status "nginx"
salt "*" service.start "nginx"
salt "*" service.status "nginx"
远程执行命令之pkg包管理
salt "*" pkg.install "redis" salt "*" pkg.version "redis" salt "*" pkg.remove "redis"
九.Salt采集静态信息之Grains
如果你入职了,你的老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢
Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。 Minions的Grains信息是Minion启动时采集汇报给Master的 Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata) Grains保存着收集到的客户端的详细信息 如果slave机器数据变化,grains就过期了 在生产环境中需要自定义Grains,可以通过 Minion配置文件 Grains相关模块定义 Python脚本定义 salt 'slave' sys.doc grains#查看grains的命令用法
Grains
Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据 [root@master 10.0.0.5 ~]$salt 'tom' grains.items slave: ---------- SSDs: biosreleasedate: 05/19/2017 biosversion: 6.00 信息过长,已经省略 salt 'slave' grains.ls #列出所有grains方法
检索某些数据
[root@master 10.0.0.5 ~]$salt 'slave' grains.item os id host slave: ---------- host: slave id: slave os: CentOS
利用Grains静态信息定位主机
公司有100+的redhat操作系统,80+的centos,在不知道salt之前很是懵逼。。
除了系统的不同,还有不同的系统版本,redhat6.x centos6.x..
两种写法: salt '*' grains.item key1 key2 key3 salt '*' -G #定位Cenots的机器 [root@master 10.0.0.5 ~]$salt -G 'os:CentOS' test.ping slave: True #定位操作系统系统是7系列的机器 [root@master 10.0.0.5 ~]$salt -G 'osrelease:7*' test.ping slave: True #找出ip地址 salt '*' grains.item fqdn_ip4
因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。
1.自定义设置Grains数据
#设置数据 [root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_num 8 slave: ---------- cpu_num: 8 #查询数据 [root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_num slave: ---------- cpu_num: 8
在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains
[root@slave 10.0.0.6 ~]$cat /etc/salt/grains
cpu_num: 8
对于复杂的数据结构,可以添加灵活的JSON
[root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]' slave: ---------- cpu_info: - Intel - Xeon - 10 [root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_info slave: ---------- cpu_info: - Intel - Xeon - 10
此时可以检查minion服务器上的grains文件
[root@slave 10.0.0.6 ~]$cat /etc/salt/grains cpu_info: - Intel - Xeon - '10' cpu_num: 8
因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失
想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)
1.方法一,清空值 [root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_info slave: None [root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_num slave: None 2.方法二 删除minion的grains配置文件,重启服务 [root@slave 10.0.0.6 ~]$rm -rf /etc/salt/grains [root@slave 10.0.0.6 ~]$!sys systemctl restart salt-minion 检查结果删除成功