一、脚本背景介绍
在企业中经常会用遇到小规模的集群服务器,在日常的管理中经常会遇到重复性的动作,如更新备上百台服务器上的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-trsa-f.ssh/id_rsa#生成秘钥对 Generatingpublic/privatersakeypair. Enterpassphrase(emptyfornopassphrase):#如若选择给私钥加口令,则在每次使用时,提供口令 Entersamepassphraseagain:时,在使用时需输入口令,如不输入口令时,需保护好 Youridentificationhasbeensavedin.ssh/id_rsa.口令,一旦丢失相当于***钥匙。 Yourpublickeyhasbeensavedin.ssh/id_rsa.pub. Thekeyfingerprintis: 37:18:3a:18:f7:43:f1:b0:59:5a:75:88:29:bf:ac:5droot@centos7.location.com [root@centos7~]#ls.ssh/#验证生成的密钥对 id_rsaid_rsa.pubknown_hosts [root@centos7~]#ssh-copy-id-i.ssh/id_rsa.pubroot@192.168.100.128#将密钥上传到免登陆服务器, 自动加载到/root/.ssh目录 #################################################################################################### [root@centos6~]#ifconfigeth0 eth0Linkencap:EthernetHWaddr00:0C:29:AD:7B:C1 inetaddr:192.168.100.128Bcast:192.168.100.255Mask:255.255.255.0 [root@centos6~]#ls.ssh/#验证发现通过ssh-copy-id上传,自动将key定义为authorized.keys authorized_keysknown_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-Hroot@192.168.100.128-i"sed-i"s/SELINUX=enforcing/SELINUX=disabled/"/etc/selinux/config"#通过pssh批量关闭seLinux,在此仅举例一个 [root@centos7~]#pssh-Hroot@192.168.100.128-isetenforce0#批量发送指令 [1]01:33:24[SUCCESS]192.168.100.128 [root@centos7~]#pssh-Hxuewb@192.168.100.128-ihostname [1]01:41:00[FAILURE]xuewb@192.168.100.128Exitedwitherrorcode255 Stderr:pssherror:SSHrequestedapassword.PleasecreateSSHkeysoruse the-Aoptiontoprovideapassword. Permissiondenied(publickey,gssapi-keyex,gssapi-with-mic,password). [root@centos7~]#pssh-Hxuewb@192.168.100.128-A-ihostname#当不支持ssh的key认证时,通过 Warning:donotenteryourpasswordifanyoneelsehassuperuser-A选项,使用密码认证批量执行指令 privilegesoraccesstoyouraccount. Password: [1]01:41:12[SUCCESS]xuewb@192.168.100.128 centos6.localdomain [root@centos7/app]#pssh-H192.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-H192.168.100.128/root/test/curl.sh/app/ [1]03:22:05[SUCCESS]192.168.100.128#将本地curl.sh复制到/app/目录 [root@centos7~]#pscp.pssh-hhost.txt/root/test/curl.sh/app/ [1]03:22:05[SUCCESS]192.168.100.128#将本地curl.sh批量复制到/app/目录 [root@centos7~]#pscp.pssh-H192.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-H192.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-H192.168.100.128-L/app/-r/app/testtest(存储到本地后的名称) [1]04:14:13[SUCCESS]192.168.100.128#批量下载服务器中的文档到本地,-L指定下载目录,local存储到本地的名称 [root@centos7~]#pslurp-H192.168.100.128-L/app//app/mcurl.shmcurl.sh [1]04:13:13[SUCCESS]192.168.100.128#批量下载服务器中文档到本地 [root@centos7~]#pslurp-H192.168.100.128-L/app//etc/passwdpawd [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-idfilehost\n" exit } #definevar setpasswordwbxue.blog setfile[lindex$argv0] setip[lindex$argv1] #startexeccommand spawnssh-copy-id-i$fileroot@$ip expect{ "yes/on"{send"yes\r";exp_continue} "*password*"{send"$password\r"} } expecteof
第二步:利用bash脚本调用Expect脚本批量给服务器上传(此时已实现免密码登录)
#!/bin/bash file=/root/.ssh/id_rsa.pub net=192.168.100 ip=$net.$n fornin{1..255};do expectsend-rsa-pub.exp$file$ip done
第三步:编写业务脚本(脚本脚本***生产相关日志文件,有利用回收日志进行相关处理)检测磁盘的使用率
#!/bin/bash >/var/log/diskcheck.log df|grep"/dev/sd"|whilereaddisk;do diskused=`echo$disk|sed-r's/.*([0-9]+)%.*/\1/'` devname=`echo$disk|cut-d""-f1` [$diskused-ge1]&&echo"$devnamewillbefull:$diskused%">>/var/log/diskcheck.log done
第四步:推送脚本、发送执行脚本指令、定期回收脚本日志进行处理
[root@centos7~]#pscp.pssh-H192.168.100.128/root/diskcheck.sh/app/ [root@centos7~]#pssh-Hroot@192.168.100.128-ibash/app/diskcheck.sh [root@centos7~]#pslurp-H192.168.100.128-L/app//var/log/diskcheck.logdiskcheck.log
当然也可以通过批量执行命令进程处理,但是通过批量执行命令处理相对效率较慢,因此推荐使用脚本处理业务,如上为举例说明的一个案例,其他业务具体情况可以通过替换此案例中的脚本来实现各位运维界兄弟们的需求。