批量管理自动化运维100台小规模服务器


目录

1.脚本背景介绍

2.脚本技术需求分析

2.1 SSH免登陆认证

2.2 Expect实现key分发

2.2 PSSH家族命令详解

3.脚本功能及实现过程

3.1 脚本运行环境介绍

3.2 脚本功能介绍

3.3 脚本编写思路

3.4 脚本编写案例


一、脚本背景介绍

在企业中经常会用遇到小规模的集群服务器,在日常的管理中经常会遇到重复性的动作,如更新备上百台服务器上的ssh公钥、备份上百台服务器上的/etc/passwd配置文件等等,通常情况下采用专用自动化运维工具assibe,若因资源或技术因素没有安装此类服务,此时可以通过脚本实现小规模服务器集群的自动化运维,记住只要是重复3次以上的动作,在自动化运维的时代里必须采用自动化手法进行运维管理。

二、脚本制作技术需求

2.1 SSH免密码登陆认证

服务器的远程管理认证通常有两种方式认证,

第一种采用对称加密算法的账号密码登录认证,对称加密即加密和解密使用同一个密钥,最常见的算法有DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard)等,优势为加密和解密使用同一个密码,效率高,缺点是密钥交换无安全保障,数据来源无法确认。

第二种采用非对称加密算法,利用密钥完成认证,非对称加密算法通常有RSA、DSA,其主要作用是生成公钥和私钥,公钥加密的数据只能私钥解密,私钥加密的数据只能是公钥解密(数字签名),通过私钥能算出公钥,但通过公钥无法推算出私钥,具体原理见如下:

ssh-keygen命令用来生成公钥和私钥密钥对的工具,通常用法如下

命令

选项

含义

ssh-keygen

-t

指定创建的密钥对的加密算法,默认为rsa

-p

输入旧的密码,在新建密钥对时不加此选项,但可更新现有私钥的密码

-q

静默输出此

-f

指定输出路径,ssh免密钥登录时,必须在/root/.ssh/目录下

ssh-copy-id

-i

指定公钥所在位置

[root@centos7 ~]#ssh-keygen -t rsa -f .ssh/id_rsa #生成秘钥对 Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): #如若选择给私钥加口令,则在每次使用时,提供口令Enter same passphrase again: 时,在使用时需输入口令,如不输入口令时,需保护好 Your identification has been saved in .ssh/id_rsa.口令,一旦丢失相当于万能钥匙。 Your public key has been saved in .ssh/id_rsa.pub. The key fingerprint is: 37:18:3a:18:f7:43:f1:b0:59:5a:75:88:29:bf:ac:5d root@centos7.location.com[root@centos7 ~]#ls .ssh/ #验证生成的密钥对 id_rsa id_rsa.pub known_hosts [root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.128 #将密钥上传到免登陆服务器, 自动加载到/root/.ssh目录####################################################################################################[root@centos6 ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:AD:7B:C1 inet addr:192.168.100.128 Bcast:192.168.100.255 Mask:255.255.255.0[root@centos6 ~]# ls .ssh/ #验证发现通过ssh-copy-id上传,自动将key定义为authorized.keys authorized_keys known_hosts #上传到服务器的公钥自动更名的依据可查看/etc/ssh/ssh_config################################此时完成免密码登录认证##############################################

2.2 Expect实现key分发

在上百台服务器中,对公钥分发不可能经过上百次的手工输入key,像前文所述在在自动化运维时代里超过3次的动作必须用自动化思想实现自动化运维。

Expect是交互式语言,具体学习可参考http://www.tcl.tk

2.3 pssh家族命令详解

pssh提供了子工具,可以实现多台服务器的批量管理,如同时在多台主机上批量执行某命令,管理同步进程,高效的复制文件,需要注意的是:使用pssh命令时,命令参数中不支持变量(如$HOSTNAME)和通配符(如*)等,如果命令参数中有变量和通配符时,pssh会人为是执行本地的命令,而非远程主机的命令。下面将常用命令及选项逐一介绍

pssh命令详解:

命令

选项

含义

Pssh

-h

指定文件中用户主机列表

-H

指定主机,-H “root@host1 root@host2 ”

-i

将每个主机标准输出输送到当前终端

-o

指定正确的标准输出目录,如果-i显示过多,可以选择指定输出某个目录,并自动创建以IP命名的文本用来保存输出。

-e

指定错误输出目录

-l

指定以某用户的方式登录等价于user@host1中的user

-A

Key的认证基于用户,如若没有对某些用户认证key,但是要批量操作加用此选项表示启用密码登录认证

[root@centos7 ~]#pssh -H root@192.168.100.128 -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config" #通过pssh批量关闭seLinux,在此仅举例一个[root@centos7 ~]#pssh -H root@192.168.100.128 -i setenforce 0 #批量发送指令[1] 01:33:24 [SUCCESS] 192.168.100.128[root@centos7 ~]#pssh -H xuewb@192.168.100.128 -i hostname[1] 01:41:00 [FAILURE] xuewb@192.168.100.128 Exited with error code 255Stderr: pssh error: SSH requested a password. Please create SSH keys or usethe -A option to provide a password.Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).[root@centos7 ~]#pssh -H xuewb@192.168.100.128 -A -i hostname #当不支持ssh的key认证时,通过Warning: do not enter your password if anyone else has superuser -A选项,使用密码认证批量执行指令privileges or access to your account.Password:[1] 01:41:12 [SUCCESS] xuewb@192.168.100.128centos6.localdomain[root@centos7 /app]#pssh -H 192.168.100.128 -o /app -e /app -i "hostname" #将标准错误和标准正确重定向都保存至/app目录下

PSCP.PSSH命令详解

pscp.pssh功能是将本地文件批量复制到远程主机,其语法结构为:

pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote

选项用法pssh的选项与pssh保持一致,scp选项如下,举例说明:

命令

选项

含义

Pscp-pssh

-v

显示复制过程

-a

复制过程中保留常规属性

-r

递归复制目录

[root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/test/curl.sh /app/ [1] 03:22:05 [SUCCESS] 192.168.100.128 #将本地curl.sh 复制到/app/目录[root@centos7 ~]#pscp.pssh -h host.txt /root/test/curl.sh /app/ [1] 03:22:05 [SUCCESS] 192.168.100.128 #将本地curl.sh 批量复制到/app/目录[root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/test/mcurl.sh /root/test/mysql.sh /app/[1] 03:39:17 [SUCCESS] 192.168.100.128 #将本地多个文件批量复制到/app/目录[root@centos7 ~]#pscp.pssh -H 192.168.100.128 -r /root/test/ /app/[1] 03:40:41 [SUCCESS] 192.168.100.128 #将本地目录批量复制到/app/目录

PSLURP.PSSH命令详解

pslurp.pssh功能是将远程主机的文件批量复制到本地,在复制过程中注意

pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir] remote local(本地名)

命令

选项

含义

Pslurp-pssh

-L

指定从远程主机下载文件存储的目录,local是下载到本地后的名称,语法结构中必须跟local

-a

指定主机,-H “root@host1 root@host2 ”

-r

将每个主机标准输出输送到当前终端

[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ -r /app/test test(存储到本地后的名称)[1] 04:14:13 [SUCCESS] 192.168.100.128 #批量下载服务器中的文档到本地,-L指定下 载目录,local存储到本地的名称[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /app/mcurl.sh mcurl.sh[1] 04:13:13 [SUCCESS] 192.168.100.128 #批量下载服务器中文档到本地[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /etc/passwd pawd[1] 04:23:39 [SUCCESS] 192.168.100.128 #批量下载目标服务器的passwd文件,下载到本地更名为pawd

三、脚本功能及实现过程

3.1 脚本运行环境

服务器集群环境或百台左右服务器的管理,如若太多服务器得借助专业运维工具assible。

3.2 脚本功能介绍

脚本在自动化运维通常实现如下功能:

(1)批量执行命令,并将结果返回终端或日志文件;

(2)文件批量复制,将本地的文件批量上传给远程主机;

(3)文件批量下载,将远程主机的文件批量下载至本地;

3.3 脚本编写思路

自动化运维脚本的编写思路:

第一步:生成key,利用Expect将公钥分发给服务器;

第二步:利用pscp.pssh向远程主机(主机列表文件)推送脚本

第三步:利用pssh远程主机发送执行脚本指令

第四步:利用pslurp.pssh回收脚本及日志文件,针对性进行处理

3.4 脚本编写案例

第一步:编写Expect脚本,实现key的上传

#!/bin/expect # if { $argc != 2 } { send_user "usage: send-rsa-id file host \n" exit } #define var set password wbxue.blog set file [lindex $argv 0 ] set ip [lindex $argv 1 ] #start exec command spawn ssh-copy-id -i $file root@$ip expect { "yes/on" {send "yes\r";exp_continue} "*password*" {send "$password\r"} } expect eof

第二步:利用bash脚本调用Expect脚本批量给服务器上传(此时已实现免密码登录)

#!/bin/bash file=/root/.ssh/id_rsa.pub net=192.168.100 ip=$net.$n for n in {1..255};do expect send-rsa-pub.exp $file $ip done

第三步:编写业务脚本(脚本脚本最好生产相关日志文件,有利用回收日志进行相关处理)检测磁盘的使用率

#!/bin/bash>/var/log/diskcheck.logdf |grep "/dev/sd" |while read disk ;do diskused=`echo $disk|sed -r 's/.* ([0-9]+)%.*/\1/'` devname=`echo $disk |cut -d " " -f1` [ $diskused -ge 1 ] && echo "$devname will be full:$diskused%" >> /var/log/diskcheck.logdone

第四步:推送脚本、发送执行脚本指令、定期回收脚本日志进行处理

[root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/diskcheck.sh /app/[root@centos7 ~]#pssh -H root@192.168.100.128 -i bash /app/diskcheck.sh[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /var/log/diskcheck.log diskcheck.log

当然也可以通过批量执行命令进程处理,但是通过批量执行命令处理相对效率较慢,因此推荐使用脚本处理业务,如上为举例说明的一个案例,其他业务具体情况可以通过替换此案例中的脚本来实现各位运维界兄弟们的需求。

作者:每天进步一点点 来源:http://wbxue.blog.51cto.com/11831715/1964165


原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2017-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

邮件实现详解(二)------手工体验smtp和pop3协议

  上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍。我们知道电子邮件需要在邮件客户端和邮件服...

35610
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装Mailpile

在本教程中,我们将在Ubuntu 14.04上安装Mailpile,一个快速,安全,漂亮的Webmail客户端。

1290
来自专栏北京马哥教育

SSH协议详解

一、 前言 使用SSH可以在本地主机和远程服务器之间进行加密地传输数据,实现数据的安全。而OpenSSH是SSH协议的免费开源实现,它采用安全、加密的网络连接...

5694
来自专栏技术专栏

Spring Security+Spring Social+SpringBoot集成Restful可配置安全模块及代码生成器

1.本项目主要分为core核心模块,browser浏览器模块,app模块,demo使用restful实例模块及spring-boot-api-project-s...

5212
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Stunnel加密流量到Redis

Redis是一个开源键值数据存储,使用内存存储模型和可选的磁盘写入来实现持久性。它具有事务,发布/订阅消息传递模式以及其他功能之间的自动故障转移功能。Redis...

2434
来自专栏Java后端技术栈

一步步带你了解前后端分离利器之JWT

HTTP 是无状态协议,它不对之前发送过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的 Web 页面本身无法进行...

942
来自专栏令仔很忙

新手学Linux(六)----安装Nginx

nginx是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境。

2022
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装和保护phpMyAdmin

虽然许多用户需要像MySQL这样的数据库管理系统的功能,但他们可能不会仅仅通过MySQL提示与系统进行交互。

1640
来自专栏小白安全

SQL注入 上传绕过安全狗

一,绕过安全狗上传可执行脚本 附上php上传脚本源码,此源码未对上传文件类型做校验 <?php         move...

5007
来自专栏云计算教程系列

如何在Ubuntu 18.04上为用户目录设置vsftpd

FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。许多普通网民希望通过htt...

1080

扫码关注云+社区