自动化运维与Saltstack
一、自动化运维介绍
1、自动化运维产生背景
传统的IT运维是将数据中心中的网络设备、服务器、数据库、中间件、存储、虚拟化、硬件等资源进行统一监控,当资源出现告警时,运维人员通过工具或者基于经验进行排查,找出问题并加以解决。但是,随着互联网+时代的到来,移动互联网、云计算和大数据技术得到了广泛应用,从而导致企业所管理的IT架构不断扩大,服务器、虚拟化、存储设备的数量越来越多,网络也变得更加复杂,业务流程越来越繁琐,传统的运维管理也越来越力不从心。
运维的四大苦恼:
2、运维自动化
自动化运维,可实现日常设备监控、主动发现问题、自动分析定位、基于标准化流程工具规范化处理、通过自动化运维操作工具处理修复等功能,最终实现监管的自动化运维。
总结来说就是把人的工作给机器去完成,通过标准化快速分析和定位问题,将问题自动修复。
- 实现哪些方面自动化
监控自动化、数据采集自动化、数据分析自动化、日常巡检自动化、设备配置比对自动化、故障定位自动化、故障处理自动化、流程处理自动化、日常备份自动化、系统优化自动化、大批量配置自动化。
3、自动化运维工具
- Saltstack:https://www.saltstack.com
基于 rubby 开发,c/s 架构,支持多平台,可管理配置文件、用户、cron 任务、软件包、系统服务等。分为社区版(免费)和企业版(收费),企业版支持图形化配置。 - pupppet:https://puppet.com
基于 python 开发,c/s 架构,支持多平台,比 puppet 轻量,在远程执行命令时非常快捷,配置和使用比 puppet 容易,能实现 puppet 几乎所有的功能。 - Ansible:https://www.ansible.com
更加简洁的自动化运维工具,不需要在客户端上安装 agent,基于 python 开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令
三种运维工具技术特性比较:
名称 | Puppet | SaltStack | Ansible |
开发语言 | Ruby | python | python |
客户端 | 有 | 有 | 无 |
二次开发 | 不支持(自由度太低) | 支持 | 支持 |
通信验证 | 是 | 是 | 是 |
同学加密 | 标准SSL协议 | AES加密 | OpenSSH(点对点加密不推荐,机器压力大) |
平台支持 | AIX,BSD,HP-UX,Linux,Mac,Solaris,Windows | BSD,Linux,Mac,Solaris,Windows | AIX,BSD,HP-UX,Linux,Mac,Solaris |
配置文件格式 | Ruby语法格式 | YAML | YAML |
Web UI | 提供 | 提供 | 提供 |
命令执行 | 不支持(配置模块可实现) | 支持 | 支持 |
二、Saltstack介绍
- SaltStack管理工具允许管理员对多个操作系统创建一个一致的管理系统。
- Saltstack最主要的两个功能是:配置管理与远程执行
- Saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
- 采用订阅者模式的分布式管理工具,管理节点【发命令】——>被管理节点【去执行 返回结果】
- 采用自定义协议zeromq 比SSH(一对一)速度更快
1、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库中,这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执 salt '*' cmd.run 'uptime'的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回 结果。
2、关于zeroMQ
master监听4505和4506端 : 4505对应的是ZMQ的PUB system,用来发送消息; 4506对应的是REP system是来接受消息的。
三、Saltstack部署
准备两个节点,一个master节点(192.168.31.42),一个minion节点(192.168.31.43)。
1、安装Saltstack
(1)Salt-master安装
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install salt-master
# 扩展功能安装
yum install salt-syndic 分布式代理
yum install salt-cloud 基于openstack来做的,它可以支持多种云的使用。 如:Aliyun、Azure、DigitalOcean、EC2、Google Compute Engine、HP Cloud、OpenStack
(2)Salt-minion安装
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install salt-minion
2、配置文件
均是在配置文件中指定master和用户名。
(1) master节点配置
[root@master salt]# head -2 /etc/salt/master # 仅在文件前添加了两行
master: 192.168.31.42
user: root
(2)minion节点(192.168.31.43)配置
[root@minion01 salt]# head -3 /etc/salt/minion
master: 192.168.31.42
user: root
id: minion-01
(3)启动Salt
# 启动主节点salt
[root@master salt]# systemctl start salt-master
# 启动奴隶节点
[root@minion01 salt]# systemctl start salt-minion
3、minion管理
# 查看所有minion-key
[root@master selinux]# salt-key -L
Accepted Keys: # 同意加入的
Denied Keys: # 未被加入的
Unaccepted Keys: # 未知的
Rejected Keys: # 被拒绝的
[root@master selinux]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
minion-01 # 已经被监测到的
Rejected Keys:
# minion加入架构
[root@master selinux]# salt-key -a minion-01
The following keys are going to be accepted:
Unaccepted Keys:
minion-01
Proceed? [n/Y] y
Key for minion minion-01 accepted.
[root@master selinux]# salt-key -L
Accepted Keys:
minion-01 # 认领成功
Denied Keys:
Unaccepted Keys:
Rejected Keys:
四、minion管理
1、如何使用salt查看手册
(1)查看模块列表module
[root@master selinux]# salt 'minion-01' sys.list_modules
minion-01:
- acl
- aliases
- alternatives
...
- xfs
- zenoss
(2)查看指定module的function用法
[root@master selinux]# salt 'minion-01' sys.list_functions cmd
minion-01:
- cmd.exec_code
- cmd.exec_code_all
- cmd.has_exec
- cmd.powershell
- cmd.powershell_all
- cmd.retcode
- cmd.run
- cmd.run_all
- cmd.run_bg
- cmd.run_chroot
- cmd.run_stderr
- cmd.run_stdout
- cmd.script
- cmd.script_retcode
- cmd.shell
- cmd.shell_info
- cmd.shells
- cmd.tty
- cmd.which
- cmd.which_bin
[root@master ~]# salt 'minion-01' sys.list_functions user
minion-01:
- user.add
- user.chfullname
- user.chgid
- user.chgroups
- user.chhome
- user.chhomephone
- user.chloginclass
- user.chother
- user.chroomnumber
- user.chshell
- user.chuid
- user.chworkphone
- user.delete
- user.get_loginclass
- user.getent
- user.info
- user.list_groups
- user.list_users
- user.primary_group
- user.rename
(3)查看指定模块的详细用法
[root@master selinux]# salt 'minion-01' sys.doc cmd
[root@master ~]# salt 'minion-01' sys.doc user
# 查看模块下的具体某个方法
[root@MiWiFi-R4C-srv ~]# salt 'minion-01' sys.doc user.add
user.add:
Add a user to the minion
CLI Example:
salt '*' user.add name <uid> <gid> <groups> <home> <shell>
(4)添加用户示例
# vipw命令编辑用户密码文件
[root@minoin01 ~]# vipw # 查看确认没有xxx用户
vipw: /etc/passwd is unchanged
# 用salt的user模块创建用户
[root@master ~]# salt "minion-01" user.add xxx
minion-01:
True
# 查看minion上用户是否创建
[root@minion01 ~]# cat /etc/passwd | tail -n 1
xxx:x:1000:1000::/home/xxx:/bin/bash
2、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
3、查看minion状态
#查看minion的状态
[root@master selinux]# salt-run manage.status
down:
up:
- minion-01
#查看minion在线状态
[root@master selinux]# salt-run manage.up
- minion-01
#查看minion离线状态
[root@master selinux]# salt-run manage.down
4、文件分发 salt-cp
salt-cp 分发文件到minion上,不支持目录分发,通常在master运行。
# 拷贝单个件
[root@master salt]# salt-cp minion-01 /root/salt-repo-latest-2.el7.noarch.rpm /tmp
minion-01:
----------
/tmp/salt-repo-latest-2.el7.noarch.rpm:
True
# 拷贝单个文件到minion的目标目录下并改名
[root@master salt]# salt-cp minion-01 /root/anaconda-ks.cfg /tmp/abc
minion-01:
----------
/tmp/abc:
True
5、minion本地执行命令:salt-call
salt-call minion本地执行命令,自己执行可执行模块,不是通过master下发job。
[root@minion01 tmp]# salt-call test.ping
local:
True
6、salt命令分类和总结
批量操作(*)
# 模块命令
salt "minion_name" 模块.函数 参数
salt "*" test.ping # *代表所有主机 test.ping 命令
# linux系统命令(cmd.run)
salt "*" cmd.run "hostname" # cmd.run 告诉客户端执行什么命令
# 执行脚本(cmd.script)
salt "*" cmd.script “salt://脚本名” # /srv/salt 脚本路径 默认
脚本执行示例:
[root@master salt]# pwd
/srv/salt
[root@master salt]# vim test.sh
[root@master salt]# chmod 755 test.sh
[root@master salt]# vim test.sh
[root@master salt]# ./test.sh
master
2018-12-28
this is a test for salt
[root@master salt]# salt "*" cmd.script 'salt://test.sh'
minion-01:
----------
pid:
12322
retcode:
0
stderr:
stdout:
master
2018-12-28
this is a test for salt
7、查看salt minion的执行状态
(1)查看minion正在执行的操作
# 第一个master终端,执行系统命令
[root@master salt]# salt '*' cmd.run 'yum -y update'
# 第二个master终端,查看salt minion执行情况
[root@master ~]# salt-run jobs.active
20181228112409202939:
----------
Arguments:
- yum -y update
Function:
cmd.run
Returned:
Running:
|_
----------
minion-01:
12329
StartTime:
2018, Dec 28 11:24:09.202939
Target:
*
Target-type:
glob
User:
root
(2)执行、查看、杀死进程和清空缓存
# 第一个master终端执行
[root@master salt]# salt '*' cmd.run 'pip install scrapy'
# 第二个master终端
# 查看正在运行的任务,找到jid
[root@master ~]# salt 'minion-01' saltutil.running
minion-01:
|_
----------
arg:
- pip install scrapy
fun:
cmd.run
jid:
20181228113349565844
pid:
44973
ret:
tgt:
*
tgt_type:
glob
user:
root
# 根据jid杀掉任务
[root@master ~]# salt 'minion-01' saltutil.kill_job 20181228113349565844
minion-01:
Signal 9 sent to job 20181228113349565844 at pid 44973
# 清除minion缓存
[root@master ~]# salt '*' saltutil.clear_cache
minion-01:
True