Loading...
墨滴

eZy

2021/10/19  阅读:30  主题:默认主题

Tips:使交互式 Client 端自动化

Tips:使交互式 Client 端自动化

目录


应用场景

安全及高效需求,一些公司不允许直连 MySQL 数据库,而是通过自研客户端强制运维人员通过统一入口连接。这些客户端大部分不允许非交互式运行,但有些场景需要执行一些自动化任务,此时有以下几种解决方案:

  • 一. 临时在目标实例创建特权账号,通过此账号直连数据库。
  • 二. 通过 expect 胶水语言实现客户端自动化操作(本文着重介绍此方式)。
  • 三. 与客户端开发者沟通,实现非交互式功能需求。

其中第一种方法在现有环境无法实施,因为目标实例大部分为租户使用,不能在未经租户同意的情况下擅自创建对象。第三种方法需要开发者进行一定的编码操作,需要一定的时间。所以,可临时使用第二种方法自行实现。下文将以某客户端(安全性考虑,不直接给出客户端名称)为示例,给出交互式 Client 端自动化实现相关脚本。

示例

假如有交互式客户端:nothisclient。

使用 expect 改造为非交互式相关脚本示例:

#!/usr/bin/env bash
######################################################################################################################
# Title           : ccc.sh
# Description     : This will execute xxx nointeraction
# Author          : linora
# Last Modified   : 2021/10/11 16:24
# Version         : 0.2 beta
# Notes           :
# Usage           : /usr/bin/timeout 30 \
#                   /xxx/xxx/tmp/xxx.sh >> /xxx/xxx/tmp/xxx.log
######################################################################################################################
# Define vars & function.

set -o noglob

source /etc/profile
source /root/.bash_profile
source /root/.bashrc

nothisclient_abs_path='xxxc'

escape_str4expect() {
  echo "${*}" |
    sed -e 's/\\/\\\\/g' \
      -e 's/\[/\\[/g'
}

target_instance_no=330
# read -r -p 'Target instance NO: ' target_instance_no

expect_timeout=5

nothisclient_user='xxx'
nothisclient_passwd='xxx'

sql_executor() {

  /usr/bin/env expect <<-EOF
  set timeout ${expect_timeout}

  spawn ${nothisclient_abs_path}

  expect "Please Input Your Name: "
  send "$(escape_str4expect ${nothisclient_user})\r"

  expect "Please Input Your Password (Password's period of validity are 60 minutes): "
  send "$(escape_str4expect ${nothisclient_passwd})\r"

  expect "Please Select NO: "
  send "$(escape_str4expect ${target_instance_no})\r"
  expect ".*"

  send "$(escape_str4expect ${*})\r"
  expect eof

  send "exit\r"
  expect "Bye"

  close
  exit

EOF

}

######################################################################################################################
# Main body.

sql_text='select @@report_port,it.* from information_schema.innodb_trx it\G'

sql_executor ${sql_text}

crontab 示例:

比如配置为每 20 分钟执行一次:

# crontab -l
# Add by DBA for snapshot xxx.
*/20 * * * * /usr/bin/timeout 30 /xxx/xxx/tmp/xxx >> /xxx/xxx/tmp/xxx.log

对于不熟悉 crontab 格式的同学,这里推荐一个 crontab 测试小工具:

网址:https://tool.lu/crontab/

expect 相关参数注解:

  • set timeout:配置 expect 响应超时时间。
  • spawn:启动命令,相当于你交互式敲入的命令。
  • expect:获取交互式命令每步进输出,期望的输出,支持正则。相当于交互式执行时,你希望看到的内容。
  • send:发送内容给交互式命令,相当于你交互式执行期间输入的内容,记得按回车,即每个字符串结尾带上 \r。
  • expect eof:等待所有内容输出完毕,相当于你输入一条命令后,等待所有消息体全部返回。一般适用于长消息,等待超时时间对应 set timeout 指定的值。
  • close:关闭 spawn 阶段 fork 出的进程。
  • exit:退出 expect。

合规性建议

  • 此方法为过渡期使用,建议使用完后立即修改相关客户端对应账号密码。
  • 自动化脚本对应权限修改为 0700。

至此,全文结束,负责撸脚本的同学加油!

预告

  • 围绕数据库相关自动化/DevOPS 实践:开篇(未填坑)。

作者:eZy_1990(ixdba/linora)

来源:公众号 - 悟空的数橘窟私房菜(ID:wkDB007)

关于作者:DBA 一枚,09 年开始接触数据库,早年间从事 Oracle DBA 一职,目前专注于开源数据库领域。混过很多家公司,也玩过很多种数据库。

其他说明:不保证全文没有任何错漏之处,如有不妥不吝赐教。

eZy

2021/10/19  阅读:30  主题:默认主题

作者介绍

eZy