MHA搭建之ssh互信打通脚本
在mysql搭建MHA高可用架构的时候,需要打通master、slave、以及mha manager之间的ssh互信,通常情况下,运维人员需要手动打通ssh互信,在自动化构建的过程中很不方便。如果可以使用自动化的脚本打通服务器之间的ssh互信,对自动化运维会有很大的帮助。
常见的方法是通过Expect来和服务器进行交互,expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。spawn的方法是expect环境里面的内部命令,通常用来打通Linux环境之间的互信。
这里分享一个这两天改过的脚本,来打通服务器之间的ssh互信关系,脚本的主要步骤分为如下几步:
1、使用跳板机在源端,利用ssh-keygen命令生成源端服务器的公钥和私钥
2、使用跳板机在目标端,利用ssh-keygen命令生成目标端服务器的公钥和私钥
3、使用跳板机将源端机器的公钥通过scp命令拷贝到目标端机器的/tmp文件夹下
4、使用跳板机在目标端的机器上将/tmp文件夹下源端的公钥推送到目标端的authorized_keys文件中,并修改.ssh文件夹属性为700,,修改authorized_keys文件的属性为600
按照上面的步骤,我们可以单向打通源端到目标端的ssh,借助shell脚本进行源端和目标端交换,就可以实现ssh的打通。
真实的shell脚本如下:
#!/bin/bash # 输入参数需要遵循src_host dst_host src_username src_pass src_host=$1src_username=$3 src_passwd=$4 dst_host=$2 dst_username=$3 dst_passwd=$4 ssh_port=$5 # 生成公钥,源端和目标端都生成 Keygen_src() { expect << EOF spawn ssh -p $ssh_port $src_username@$src_host ssh-keygen -t rsa while 1 { expect { "password:" { send "$src_passwd " } "yes/no*" { send "yes " } "Enter file in which to save the key*" { send " " } "Enter passphrase*" { send " " } "Enter same passphrase again:" { send " " } "Overwrite (y/n)" { send "n " } eof { exit } } } EOF } # 目标端秘钥生成 Keygen_dst() { expect << EOF spawn ssh -p $ssh_port $dst_username@$dst_host ssh-keygen -t rsa while 1 { expect { "password:" { send "$dst_passwd " } "yes/no*" { send "yes " } "Enter file in which to save the key*" { send " " } "Enter passphrase*" { send " " } "Enter same passphrase again:" { send " " } "Overwrite (y/n)" { send "n " } eof { exit } } } EOF } # 获取公钥,并拷贝到当前的/tmp目录里面 Get_pub() { expect << EOF spawn scp -P $ssh_port $src_username@$src_host:~/.ssh/id_rsa.pub /tmp expect { "password:" { send "$src_passwd ";exp_continue } "yes/no*" { send "yes ";exp_continue } eof { exit } } EOF } # 将源端公钥存入目标端的authorized_keys Put_pub() { src_pub="$(cat /tmp/id_rsa.pub)" expect << EOF spawn ssh -p $ssh_port $dst_username@$dst_host "chmod 700 ~/.ssh;echo $src_pub >> ~/.ssh/authorized_keys;chmod 600 ~/.ssh/authorized_keys" expect { "password:" { send "$dst_passwd ";exp_continue } "yes/no*" { send "yes ";exp_continue } eof { exit } } EOF } Keygen_src Keygen_dst Get_pub Put_pub
上述脚本中,常见的参数说明如下:
命令 作用 send 用于向进程发送字符串 expect 从进程接收字符串 spawn 启动新的进程 interact 允许用户交互 其中,send命令接收一个字符串参数,并将该参数发送到进程; expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令; spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互; interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互;