一个简单的批量备份日志脚本

接上文。上文免密登录后,这篇文章简单做个日志定期备份,将其他机器上的日志整合到本地。逻辑较为简单,可以按需修改。最终效果是,每天将若干机器的文件整理成一个压缩包保存到本地,同时删除一年前的备份。这里就不过多赘述了。

#!/bin/bash

#应用名
APPNAME="KOMACHI"
#远程主机列表
TARGET_IPS="app1:auth|ticket,app2:auth|base,app3:ticket|manager,app4:manager|base"
#远程主机文件目录
TARGET_FOLDER="/var/local/logs"
#远程主机用户及密码
TARGET_USER_NAME="kelu"
#备份几天前的日志文件
DAYS_AGO=1
#本地备份目录
LOCAL_FOLDER="/backup/logs"
#循环备份文件
backupdate=`date -d "${DAYS_AGO} day ago" +%Y-%m-%d`
deletedate=`date -d "1 year ago" +%Y-%m-%d`

backup_file(){
	localFolder=$1
  remoteIp=$2
  remoteBackupFolder=$3
	errorIgnore=$4

	if [ ! -d ${localFolder} ] ; then
		mkdir -p ${localFolder}
	fi

  if [ $errorIgnore ]; then
		scp -r ${remoteIp}:${remoteBackupFolder} ${localFolder} > /dev/null 2>&1
    return 0
	else
		scp -r ${remoteIp}:${remoteBackupFolder} ${localFolder} 1>/dev/null
	fi
}

run_backup(){
	echo ">>>>>>>>>>>>>> $backupdate 开始备份..."
        errorFlag=0
	IFS=","
	arrayIP=($TARGET_IPS)
	for ipInfo in ${arrayIP[@]}
	do
		echo ">>>>>>>>>>>>>> ${ipInfo}"
		IFS=":"
		arrayIPInfo=($ipInfo)
		remoteIp=${arrayIPInfo[0]}
		subInfo=${arrayIPInfo[1]}
#		echo -e "主机IP:\t\t${remoteIp}"
#		echo -e "主机备份目录:\t${subInfo}"

		IFS="|"
		arrayProgram=($subInfo)
		for program in ${arrayProgram[@]}
		do
			localFolder=${LOCAL_FOLDER}/${APPNAME}-${backupdate}/${remoteIp}/${program}
      remoteFolder=$TARGET_FOLDER/${program}/${backupdate}/*
			localBatchFolder=${LOCAL_FOLDER}/${APPNAME}-${backupdate}/${remoteIp}/batch/${program}
			remoteBatchFolder=$TARGET_FOLDER/batch/${program}/${backupdate}/*
      backup_file $localFolder $remoteIp $remoteFolder
			if [ $? -ne 0 ]; then
				errorFlag=1
			fi

      backup_file $localBatchFolder $remoteIp $remoteBatchFolder "ignore"
			if [ $? -ne 0 ]; then
				errorFlag=1
			fi
		done

	done

  if [ $errorFlag -ne 0 ]; then
		echo ">>>>>>>>>>>>>> $backupdate 备份结束,部分异常,请确认!"
	else
		echo ">>>>>>>>>>>>>> $backupdate 备份完成。"
  fi

  cd ${LOCAL_FOLDER}
	tar czvf ${APPNAME}-${backupdate}.tgz ${APPNAME}-${backupdate} 1>/dev/null
  rm -r ${APPNAME}-${backupdate}
  rm -rf ${APPNAME}-${deletedate}.tgz
}

run_backup


一个 ssh 设置免密登陆脚本

近期应用运维的工作比较多,写了两个脚本。这一篇记录设置多台机器免密登录的。主要知识点如下:

  1. ssh-keygen 用于生成 rsa 公钥密钥。
  2. IFS 是字符串切割为数组的分隔符。
  3. 预先设置 /etc/ssh/sshd_config 里的免密登录。
  4. ssh-copy-id 用于拷贝公钥到目的服务器,授权免密登录。

脚本如下,修改前4个变量即可:

  • TARGET_IPS,填写IP和别称,可以 ssh 别称 免密登录到目的服务器。
  • IS_FULL_MESH,是否所有节点都能免密登录,还是只允许当前节点免密登录。
  • TARGET_USER_NAME,免密登录的用户名
  • RSA_NAME,密钥的名字
#!/bin/bash

#远程主机列表
TARGET_IPS="1.2.3.8:app1,1.2.3.9:app2,1.2.3.10:app3,1.2.3.11:app4,1.2.3.12:gateway1,1.2.3.13:gateway2,1.2.3.14:mmc,1.2.3.15:mid1,1.2.3.16:mid2,1.2.3.17:mid3,1.2.3.18:mid4"
#是否所有主机互通 0/1
IS_FULL_MESH=0
#远程主机用户
TARGET_USER_NAME="kelu"
#秘钥名
RSA_NAME="xxx@xxx.com"

mkdir -p $HOME/.ssh
touch $HOME/.ssh/config
ssh-keygen -t rsa -P '' -f "$HOME/.ssh/$RSA_NAME"

###### 创建config文件
IFS=","
arrayIP=($TARGET_IPS)
for ipInfo in ${arrayIP[@]}
do
	IFS=":"
	arrayIPInfo=($ipInfo)
	IP=${arrayIPInfo[0]}
	IPTAG=${arrayIPInfo[1]}
	echo -e "主机名:\t${IPTAG}"
cat >> $HOME/.ssh/config << EOF
Host   $IPTAG
  HostName   $IP
  Port       22
  User       $TARGET_USER_NAME
  IdentityFile    $HOME/.ssh/$RSA_NAME
EOF
done

chmod 644 $HOME/.ssh/config

####### 拷贝公钥
IFS=","
arrayIP=($TARGET_IPS)
for ipInfo in ${arrayIP[@]}
do
	IFS=":"
	arrayIPInfo=($ipInfo)
	IP=${arrayIPInfo[0]}
	IPTAG=${arrayIPInfo[1]}
	echo -e ">>>>>>>>>>>>>>>>>>主机IP:${IP}"
	ssh-copy-id -i "$HOME/.ssh/$RSA_NAME.pub" $TARGET_USER_NAME@$IP

        if [ "$IS_FULL_MESH" -eq 1 ];then
 	  scp $HOME/.ssh/config ${IPTAG}:/home/${TARGET_USER_NAME}/.ssh
 	  scp $HOME/.ssh/$RSA_NAME ${IPTAG}:/home/${TARGET_USER_NAME}/.ssh
	fi
done


批量检测端口连通性

最简单的办法当然还是使用ansible。

不过客户的一些生产环境没有使用ansible,就写了个简单的脚本测试了下。

关注点:

  1. 开头取了eth0这个网卡的IP地址。
  2. 在同一个目录下保存 ip_info这个文件,每行填写ip:port
#!/bin/bash

LOCALIP=`ifconfig -a | grep eth0 -A 2|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` 

check_telnet(){
for ip_port in $(cat ./ip_info|grep -v '^#')
do
    CHECK_PORT=$(echo $ip_port|awk -F: '{print $2}')
    CHECK_IP=$(echo $ip_port|awk -F: '{print $1}')
    echo -e "\n"| telnet $CHECK_IP $CHECK_PORT |grep "Connected to\|Escape character" > /dev/null
    if [ $? -eq 0 ];then
        echo -e "$CHECK_IP\t $CHECK_PORT\t ok"
    else
        echo -e "$CHECK_IP\t $CHECK_PORT\t error!!!"
    fi
done
}

check_telnet > result.log

echo "=========$LOCALIP============="
cat result.log