常见自动化运维工具

传统运维效率低,工作繁琐且容易出错
重复性事情反复在做,没有标准化的流程
传统运维的脚本繁多,不方便管理
自动化运维要解决的就是这些问题
常见的自动化运维工具
puppet (www.puppetlabs.com)
基于rubby开发,c/s架构,支持多平台。可管理配置文件、用户、cron任务、软件包管理、系统服务等。分为社区版(免费)和企业版(收费),企业版支持图形化配置
Saltstack(官网:https://saltstack.com,文档:docs.saltstack.com)
基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常便捷,配置和使用都比puppet容易,且能实现puppet几乎所有的功能
Ansible (www.ansible.com)
更加简洁的自动化运维工具,不需要在客户端上安装agent用户端,基于python开发。可以实现批量操作系统配置、批量程序部署、批量运行命令
自动化运维工具和脚本自动批量执行命令有些区别,脚本若使用for、while循环一个操作指令时,实际上这个指令只会在一台服务器上操作完成后才继续传递到下一台服务器继续循环执行,这种方式像串行执行,所有任务只能在前一条完成后才能够继续执行下一条
自动化运维工具则属于并行执行,则一些操作命令同时发布到所有机器上同时进行处理,这样的处理方式要比脚本for循环的方式要快的多

saltstack安装

saltstack可以使用salt-ssh远程执行,类似于ansible,也支持c/s模式,下面介绍该模式的使用方式
准备两台测试主机
192.168.1.115位服务端
192.168.1.223为客户端两台服务器均设置hostname和hosts,hosts是用于把主机名解析到ip的,如果服务器很多,可以考虑在内部网络环境中配置一台DNS解析服务器,1.115主机名为nfs3,·1.223主机名为nfs2
两台机器需要全部安装saltstack yum源,如果这里列出的yum源失效,则需要自行在其官网上寻找yum源下载地址

http://repo.saltstack.com/#rhel
sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 

安装服务端和客户端

在服务端安装salt-master 和salt-minion,在安装时会自动解决软件包的依赖关系,在安装结果中也可以看到saltstack的安装的版本
yum安装中的zeromq包是saltstack中的消息队列服务插件

[root@nfs3 ~]# yum install salt-master salt-minion -y

Loaded plugins: fastestmirror

base | 3.6 kB 00:00:00     

epel/x86_64/metalink | 8.4 kB 00:00:00     

epel | 3.2 kB 00:00:00     

extras | 3.4 kB 00:00:00     

mongodb-org-4.0   

--------------------省略

Dependency Installed:

  PyYAML.x86_64 0:3.11-1.el7                        libsodium.x86_64 0:1.0.16-1.el7                    libtomcrypt.x86_64 0:1.17-26.el7                                      
  libtommath.x86_64 0:0.42.0-6.el7                  libyaml.x86_64 0:0.1.4-11.el7_0                    openpgm.x86_64 0:5.2.122-2.el7                                        
  python-babel.noarch 0:0.9.6-8.el7                 python-backports.x86_64 0:1.0-8.el7                python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7            
  python-chardet.noarch 0:2.2.1-1.el7_1             python-ipaddress.noarch 0:1.0.16-2.el7             python-jinja2.noarch 0:2.7.2-2.el7                                    
  python-kitchen.noarch 0:1.1.1-5.el7               python-markupsafe.x86_64 0:0.11-10.el7             python-requests.noarch 0:2.6.0-1.el7_1                                
  python-tornado.x86_64 0:4.2.1-3.el7               python-urllib3.noarch 0:1.10.2-5.el7               python-zmq.x86_64 0:15.3.0-3.el7                                      
  python2-crypto.x86_64 0:2.6.1-15.el7              python2-futures.noarch 0:3.0.5-1.el7               python2-msgpack.x86_64 0:0.5.6-4.el7                                  
  python2-psutil.x86_64 0:2.2.1-4.el7               salt.noarch 0:2018.3.3-1.el7                       yum-utils.noarch 0:1.1.31-46.el7_5   

Complete!

在用户端安装salt-minion

[root@nfs2 ~]# yum install -y salt-minion
Loaded plugins: fastestmirror
base | 3.6 kB 00:00:00     
elrepo | 2.9 kB 00:00:00     
epel/x86_64/metalink | 8.4 kB 00:00:00     
epel | 3.2 kB 00:00:00     
extras | 3.4 kB 00:00:00     
mongodb-org-4.0 | 2.5 kB 00:00:00     
salt-latest | 2.9 kB 00:00:00     
updates | 3.4 kB 00:00:00     
(1/3): epel/x86_64/updateinfo | 934 kB 00:00:01     
(2/3): salt-latest/x86_64/primary_db | 42 kB 00:00:02     
(3/3): epel/x86_64/primary | 3.6 MB 00:00:05     
Determining fastest mirrors
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * epel: mirrors.ustc.edu.cn
----------------------------------按照结果省略,正确安装完成

saltstack相关服务配置

服务端salt服务配置文件
编辑配置文件/etc/salt/minion
找到master配置那行,将服务端(master)的解析名称(/etc/hosts中配置的)填写到这里

[root@nfs3 ~]# vim /etc/salt/minion
master: nfs3

服务端启动salt服务

[root@nfs3 ~]# systemctl start salt-minion
[root@nfs3 ~]# systemctl start salt-master

salt启动的是名为python进程,使用ps -aux查看启动的进程

[root@nfs3 ~]# ps -aux |grep salt
root       3218  0.0  1.1 307760 21500 ?        Ss   22:55   0:00 /usr/bin/python /usr/bin/salt-minion
root       3221  0.0  2.4 641596 45428 ?        Sl   22:55   0:02 /usr/bin/python /usr/bin/salt-minion
root       3229  0.0  1.0 397724 20304 ?        S    22:55   0:00 /usr/bin/python /usr/bin/salt-minion
root       3297  0.0  2.1 382876 40796 ?        Ss   22:55   0:01 /usr/bin/python /usr/bin/salt-master
root       3302  0.0  1.0 306172 20176 ?        S    22:55   0:00 /usr/bin/python /usr/bin/salt-master
root       3307  0.0  1.8 463596 34496 ?        Sl   22:55   0:00 /usr/bin/python /usr/bin/salt-master

服务端的master是需要监听端口的,salt-master进程监听4505和4506两个服务端口

[root@nfs3 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1615/redis-server 1 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1607/sshd           
tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      3307/python         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2751/master         
tcp        0      0 0.0.0.0:4506            0.0.0.0:*               LISTEN      3313/python

用户端启动服务
编辑配置文件/etc/salt/minion
找到master配置那行,将解析名称(/etc/hosts中配置的)填写到这里,指定master解析的名称

[root@nfs2 ~]# vim /etc/salt/minion
master: nfs3

用户端启动salt-minion服务只会启动python的进程,不会监听任何端口,主要功能是向服务端发送数据,因此salt-minion不会监听任何端口

[root@nfs2 ~]# systemctl start salt-minion
[root@nfs2 ~]# ps -axu |grep salt
root       2174  4.8  2.1 307808 21508 ?        Ss   23:45   0:00 /usr/bin/python /usr/bin/salt-minion
root       2184 14.6  4.0 459064 40184 ?        Sl   23:45   0:01 /usr/bin/python /usr/bin/salt-minion
root       2192  0.0  2.0 397752 20288 ?        S    23:45   0:00 /usr/bin/python /usr/bin/salt-minion
root       2251  0.0  0.0 112704   964 pts/0    R+   23:45   0:00 grep --color=auto salt

saltstack配置认证

minion与master建立通信
master服务端和minion端通信需要建立一个安全的通道,传输过程需要加密,所以需要配置认证。也就是通过密钥对来加密解密的
用户端保存公钥
minion在第一次启动是会在/etc/salt/pki/minion目录下生成minion.pen和minion.pub,其中pub为公钥,在传输时会发送给master服务端
服务端保存公钥
master第一次启动也会在/etc/salt/pki/master这个路径下生成密钥对,当master接收到minion发送过来的公钥后,需要通过salt-key工具来接受这个公钥,接受后会在/etc/salt/pki/master/minion这个目录下存储接受的公钥
同时客户端也会接受master服务端发送过来的公钥,将其存储在/etc/salt/pki/minion目录下,并命名为minion_master.pub的公钥文件

需要通过借助salt-key工具实现
在使用salt-key工具之前,需要如下配置正确
1.用户端和服务端都需要修改/etc/salt/minion 配置文件,将master配置的那行都改为服务端的解析名地址。
2.在测试环境中,修改自己的hosts解析,解析名对应服务端的ip地址
完成这些后在服务端可以使用salt-key查看所有的minion端信息

[root@nfs3 ~]# salt-key
Accepted Keys:
nfs3
Denied Keys:
Unaccepted Keys:
localzabbix.com
Rejected Keys:

将用户端密钥保存至服务端

[root@nfs3 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
localzabbix.com
Proceed? [n/Y] Y

Key for minion localzabbix.com accepted.
在服务端查看用户端发送过来的公钥是一致的
自动化运维工具saltstack_第1张图片
删除所有认证过的主机,然后使用salt-key查看发现所有认证都被删除,删除认证后同时保存的公钥也会被删除掉

[root@nfs3 minions]# salt-key -D
The following keys are going to be deleted:
Accepted Keys:
localzabbix.com
nfs3
Proceed? [N/y] Y
Key for minion localzabbix.com deleted.
Key for minion nfs3 deleted.
[root@nfs-03 minions]# salt-key 
Accepted Keys:
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@nfs3 minions]# pwd
/etc/salt/pki/master/minions
[root@nfs3 minions]# ls

如果需要重新加入这个主机,需要更新master端的信息(也就是每新加一台服务器,都必须重启master和minion服务,这样服务端才会重新去检测用户端的变化)
salt-key  语法用法
-a   后面跟主机名,认证指定主机
-A  认证所有主机
-r   指定主机名,拒绝指定主机
-R  拒绝所有主机
-d  指定主机名,删除指定主机
-D  删除全部认证过的主机
-y  语句过程中省略掉交互式,等同于避免按Y交互确认

saltstack执行远程命令

salt '*' test.ping 测试所有已经认证过的minion端是否通信正常,返回true则表示状态互通,命令也可以指定单独一台主机进行测试

[root@nfs3 minions]# salt '*' test.ping
localzabbix.com:
    True
nfs3:
    True
[root@nfs3 minions]# salt 'localzabbix.com' test.ping
localzabbix.com:
    True

执行远程命令
salt ‘*’ cmd.run "命令"   指定主机或多主机来执行远程命令。如下操作过程

[root@nfs3 minions]# salt '*' cmd.run "w"
localzabbix.com:
     02:19:34 up 1:09, 1 user, load average: 0.00, 0.01, 0.05
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root pts/0 192.168.1.112 01:11 37:34 0.14s 0.14s -bash
nfs3:
     02:19:35 up 5:03, 2 users, load average: 0.00, 0.05, 0.12
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root tty1 21:42 4:33m 0.06s 0.06s -bash
    root pts/0 192.168.1.112 01:43 7.00s 1.22s 1.11s /usr/bin/python /usr/bin/salt * cmd.run w

这里指定的*或主机名是已经被接受认证过的客户端。可以通过salt-key来查询认证过的,通常是已经设定的id值,关于这部分内容。它支持通配、列表和正则表达式,比如,如果需要指定两台客户端,我们可以写成 salt ‘nfs*’、salt 'nfs1[13]' 、salt -L ‘nfs1,nfs2’ salt -E ‘nfs(1|2)’  等形式,还支持列表,多个机器使用逗号进行分隔,需要加上-L选项。使用正则表达式则必须带上-E选项。还支持grains ,需要使用-G选项