在日常的运维工作中,常常是一个人需要管理维护数个数十个数据库实例,如果是开源类集群如mysql,PG等可能更多;在没有商业的集中管理平台的情况下,如何快速的部署监控或者运维脚本,是一个值得探讨的问题,这里博主以一个简单的示例来演示如何快速一次性给20个实例部署运维脚本。
前面我发布了一个自动检查tablespace空间使用率,并再超过阈值时自动添加数据文件的脚本,具体参考链接如下:
更多的监控脚本可以参考如下:
oracle常用监控脚本(纯干货,没有EMCC,ZABBIX也不怕)_oracle 监控及日常处理脚本-CSDN博客
我这里就来演示如何一次性将这个脚本部署到全部20个数据库实例中
1. 选择一台集中部署服务器
这台部署服务器要和所有数据库实例网络通,ssh端口通,我这里选择了EMCC服务器,为了管理实例EMCC服务器已经和所有数据库实例打通了网络。如何部署EMCC可以参考如下文档
EMCC13.5安装配置手册(详细版)-CSDN博客
2. 配置互联互通
配置互联互通一般有两种方式,一种是类似Oracle11g RAC配置节点间免密登陆;我个人认为比较麻烦一下,但是配置好之后 后期会比较方便;我这里选择使用sshpass,
sshpass
是一个用于在命令行中非交互式提供 SSH 密码的工具,特别适合自动化脚本。它允许用户在 SSH、SCP 等命令中通过参数提供密码,从而省去手动输入的过程。
安装
# Ubuntu/Debian
sudo apt-get install sshpass
# CentOS/RHEL
sudo yum install sshpass
#ssh登陆格式
sshpass -p "your_password" ssh user@hostname
#ssh传输文件格式
sshpass -p "your_password" scp localfile.txt user@hostname:/remote/path
3.配置需要部署的IP列表
#设置需要部署的ip list
#格式为ip osuser password sshport
10.xxx.xx.xxx oracle xxxxx 22
4.初次部署需要手动scp一下
昨天实验时sshpass一直无法正常传输数据,但是sshpass没有报错,后来发现要先scp 接受一下
#首次部署需要scp接受RSA key,后面再次部署就可以使用sshpass了
[oracle@orcoem01 jobs]$ scp "/home/oracle/jobs/auto_add_dbf.sh" "[email protected]:/home/oracle/jobs/"
The authenticity of host '10.219.40.231 (10.219.40.231)' can't be established.
RSA key fingerprint is SHA256:RTS5x8jB3sOKNeKwN4jOH+iISwAZfgWf4WmJTT4rXc0.
RSA key fingerprint is MD5:c0:06:94:bd:35:1b:f9:4c:b7:d7:10:0a:e7:22:f5:56.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.xxx.xxx.xxx' (RSA) to the list of known hosts.
[email protected]'
auto_add_dbf.sh
5.自动化部署脚本
这里自动化部署自动加tablespace数据库文件脚本,
[oracle@szsplorcoem01 jobs]$ cat deploy_auto_add_dbf.sh
#!/bin/bash
# 配置文件路径
CONFIG_FILE="list.txt"
#需要部署的脚本,
SCRIPT_FILE="auto_add_dbf.sh"
#设置crontab 参数
CRON_SCHEDULE="0 8 * * *" # 每天早上8点00分执行一次
# 检查 list.txt 和 auto_add_dbf.sh 文件是否存在
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
if [[ ! -f "$SCRIPT_FILE" ]]; then
echo "脚本文件 $SCRIPT_FILE 不存在!"
exit 1
fi
# 将配置文件内容读入数组
mapfile -t servers < "$CONFIG_FILE"
# 遍历数组中的每一行 抓取ip和用户信息等
for server in "${servers[@]}"; do
# 解析 IP、用户名、密码和端口
IP=$(echo "$server" | awk '{print $1}')
USERNAME=$(echo "$server" | awk '{print $2}')
PASSWORD=$(echo "$server" | awk '{print $3}')
PORT=$(echo "$server" | awk '{print $4}')
PORT=${PORT:-22} # 如果没有指定端口,则默认为22
# 使用 sshpass 自动登录并执行命令
echo "连接到 $IP 并部署脚本..."
# 复制脚本到远程主机 目标路径根据个人需要设定
sshpass -p "$PASSWORD" scp -P "$PORT" "$SCRIPT_FILE" "$USERNAME@$IP:/home/oracle/jobs"
# 在远程主机上设置 cron 任务
sshpass -p "$PASSWORD" ssh -p "$PORT" "$USERNAME@$IP" "(crontab -l 2>/dev/null; echo \"$CRON_SCHEDULE /bin/bash /home/oracle/jobs/$SCRIPT_FILE\") | crontab -"
echo "在 $IP 上成功部署并配置了自动任务。"
done
6.脚本执行结果
有部分IP 或者端口不通或者用户名密码不对 导致失败
到目标主机检查部署情况
确认脚本文件被传输到目标主机
确认crontab 已经正常添加,并确认脚本可以正常执行
批量化执行的脚本需要有普适性,也就是不需要修改脚本,这里auto_add_dbf.sh 通过抓取/home/oracle/.bash_profile来获取sid和oracle home信息等
这里只是一个范例,如果脚本需要定制化修改,也可以通过抓取主机上的信息来自动修改脚本实现批量部署,希望能帮助到大家。