脚本中,将expect命令的关键字(比如“password:”、“mysql>”等)作为匹配模式,如果匹配到对应的模式,则自动发送相应的响应文本。这样就可以在执行期间不需要任何输入了。同时,使用exp_continue命令可以让脚本继续等待下一个匹配模式的出现,从而实现自动化操作
#!/usr/bin/expect
# 定义两个CentOS服务器的IP、用户名和密码
set server1_ip [lindex $argv 0]
set server1_user [lindex $argv 1]
set server1_pass [lindex $argv 2]
set server2_ip [lindex $argv 3]
set server2_user [lindex $argv 4]
set server2_pass [lindex $argv 5]
# 在第一台服务器上安装MySQL
spawn ssh $server1_user@$server1_ip "yum install -y mariadb-server"
expect {
"*(yes/no)?" {send "yes\r";exp_continue}
"assword:" {send "$server1_pass\r";exp_continue}
}
# 启动MySQL服务并设置开机启动
spawn ssh $server1_user@$server1_ip "systemctl start mariadb && systemctl enable mariadb"
expect {
"assword:" {send "$server1_pass\r";exp_continue}
}
# 在第二台服务器上安装MySQL
spawn ssh $server2_user@$server2_ip "yum install -y mariadb-server"
expect {
"*(yes/no)?" {send "yes\r";exp_continue}
"assword:" {send "$server2_pass\r";exp_continue}
}
# 启动MySQL服务并设置开机启动
spawn ssh $server2_user@$server2_ip "systemctl start mariadb && systemctl enable mariadb"
expect {
"assword:" {send "$server2_pass\r";exp_continue}
}
# 在第一台服务器上创建用于主主同步的用户、数据库和表
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'CREATE USER \"repl\"@\"$server2_ip\" IDENTIFIED BY \"password\";GRANT REPLICATION SLAVE ON *.* TO \"repl\"@\"$server2_ip\";CREATE DATABASE repl_db;USE repl_db;CREATE TABLE test (id INT(11) NOT NULL AUTO_INCREMENT, data VARCHAR(255), PRIMARY KEY (id)) ENGINE=InnoDB'"
expect {
"assword:" {send "$server1_pass\r";exp_continue}
"mysql>" {}
}
# 在第二台服务器上创建用于主主同步的用户、数据库和表
spawn ssh $server2_user@$server2_ip "mysql -u root -e 'CREATE USER \"repl\"@\"$server1_ip\" IDENTIFIED BY \"password\";GRANT REPLICATION SLAVE ON *.* TO \"repl\"@\"$server1_ip\";CREATE DATABASE repl_db;USE repl_db;CREATE TABLE test (id INT(11) NOT NULL AUTO_INCREMENT, data VARCHAR(255), PRIMARY KEY (id)) ENGINE=InnoDB'"
expect {
"assword:" {send "$server2_pass\r";exp_continue}
"mysql>" {}
}
# 在第一台服务器上配置主控制节点的my.cnf文件
spawn ssh $server1_user@$server1_ip "cp /etc/my.cnf /etc/my.cnf.bak;echo '[mysqld]' > /etc/my.cnf;echo 'server-id=1' >> /etc/my.cnf;echo 'log-bin=mysql-bin' >> /etc/my.cnf;echo 'binlog-do-db=repl_db' >> /etc/my.cnf;echo 'relay-log=mysqld-relay-bin' >> /etc/my.cnf;echo 'relay-log-index=mysqld-relay-bin.index' >> /etc/my.cnf;echo 'auto_increment_offset=1' >> /etc/my.cnf;echo 'auto_increment_increment=2' >> /etc/my.cnf;systemctl restart mariadb"
expect {
"assword:" {send "$server1_pass\r";exp_continue}
}
# 在第二台服务器上配置从控制节点的my.cnf文件
spawn ssh $server2_user@$server2_ip "cp /etc/my.cnf /etc/my.cnf.bak;echo '[mysqld]' > /etc/my.cnf;echo 'server-id=2' >> /etc/my.cnf;echo 'log-bin=mysql-bin' >> /etc/my.cnf;echo 'binlog-do-db=repl_db' >> /etc/my.cnf;echo 'relay-log=mysqld-relay-bin' >> /etc/my.cnf;echo 'relay-log-index=mysqld-relay-bin.index' >> /etc/my.cnf;echo 'auto_increment_offset=2' >> /etc/my.cnf;echo 'auto_increment_increment=2' >> /etc/my.cnf;systemctl restart mariadb"
expect {
"assword:" {send "$server2_pass\r";exp_continue}
}
# 在第一台服务器上获取二进制日志文件名及位置
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS'"
expect {
"assword:" {send "$server1_pass\r";exp_continue}
"*************************** 1. row ***************************" {}
}
set output $expect_out(buffer)
regexp {mysql-bin.*\d+} $output bin_file
regexp {\d+} $output bin_pos
# 在第二台服务器上从第一台服务器拷贝二进制日志文件
spawn ssh $server2_user@$server2_ip "mysql -u root -e 'STOP SLAVE';rsync -avz --delete $server1_user@$server1_ip:/var/lib/mysql/$bin_file /var/lib/mysql/;mysql -u root -e 'CHANGE MASTER TO MASTER_HOST=\"$server1_ip\", MASTER_USER=\"repl\", MASTER_PASSWORD=\"password\", MASTER_LOG_FILE=\"$bin_file\", MASTER_LOG_POS=$bin_pos;START SLAVE'"
expect {
"assword:" {send "$server2_pass\r";exp_continue}
}
# 在第一台服务器上从第二台服务器拷贝二进制日志文件
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'STOP SLAVE';rsync -avz --delete $server2_user@$server2_ip:/var/lib/mysql/mysql-bin.* /var/lib/mysql/;mysql -u root -e 'CHANGE MASTER TO MASTER_HOST=\"$server2_ip\", MASTER_USER=\"repl\", MASTER_PASSWORD=\"password\", MASTER_AUTO_POSITION=1;START SLAVE'"
expect {
"assword:" {send "$server1_pass\r";exp_continue}
}
# 解锁第一台服务器上的数据库表
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'UNLOCK TABLES'"
expect {
"assword:" {send "$server1_pass\r"}
}
# 提示操作完成
puts "MySQL主主同步配置完成!"
Keepalived服务部分
#!/usr/bin/expect
# 定义两个CentOS服务器的IP、用户名和密码
set server1_ip [lindex $argv 0]
set server1_user [lindex $argv 1]
set server1_pass [lindex $argv 2]
set server2_ip [lindex $argv 3]
set server2_user [lindex $argv 4]
set server2_pass [lindex $argv 5]
# 安装keepalived服务
spawn ssh $server1_user@$server1_ip "yum install -y keepalived"
expect {
"*yes/no*" {send "yes\r";exp_continue}
"*assword:*" {send "$server1_pass\r";exp_continue}
}
spawn ssh $server2_user@$server2_ip "yum install -y keepalived"
expect {
"*yes/no*" {send "yes\r";exp_continue}
"*assword:*" {send "$server2_pass\r";exp_continue}
}
# 配置keepalived主节点
spawn ssh $server1_user@$server1_ip "cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak;
echo '! Configuration File for keepalived' > /etc/keepalived/keepalived.conf;
echo 'global_defs {' >> /etc/keepalived/keepalived.conf;
echo ' router_id LVS_DEVEL' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf;
echo '' >> /etc/keepalived/keepalived.conf;
echo 'vrrp_instance VI_1 {' >> /etc/keepalived/keepalived.conf;
echo ' state MASTER' >> /etc/keepalived/keepalived.conf;
echo ' interface eth0' >> /etc/keepalived/keepalived.conf;
echo ' virtual_router_id 51' >> /etc/keepalived/keepalived.conf;
echo ' priority 100' >> /etc/keepalived/keepalived.conf;
echo ' advert_int 1' >> /etc/keepalived/keepalived.conf;
echo ' authentication {' >> /etc/keepalived/keepalived.conf;
echo ' auth_type PASS' >> /etc/keepalived/keepalived.conf;
echo ' auth_pass 123456' >> /etc/keepalived/keepalived.conf;
echo ' }' >> /etc/keepalived/keepalived.conf;
echo ' virtual_ipaddress {' >> /etc/keepalived/keepalived.conf;
echo ' 192.168.0.100' >> /etc/keepalived/keepalived.conf;
echo ' }' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf"
expect {
"*assword:*" {send "$server1_pass\r";exp_continue}
}
# 配置keepalived备节点
spawn ssh $server2_user@$server2_ip "cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak;
echo '! Configuration File for keepalived' > /etc/keepalived/keepalived.conf;
echo 'global_defs {' >> /etc/keepalived/keepalived.conf;
echo ' router_id LVS_DEVEL' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf;
echo '' >> /etc/keepalived/keepalived.conf;
echo 'vrrp_instance VI_1 {' >> /etc/keepalived/keepalived.conf;
echo ' state BACKUP' >> /etc/keepalived/keepalived.conf;
echo ' interface eth0' >> /etc/keepalived/keepalived.conf;
echo ' virtual_router_id 51' >> /etc/keepalived/keepalived.conf;
echo ' priority 90' >> /etc/keepalived/keepalived.conf;
echo ' advert_int 1' >> /etc/keepalived/keepalived.conf;
echo ' authentication {' >> /etc/keepalived/keepalived.conf;
echo ' auth_type PASS' >> /etc/keepalived/keepalived.conf;
echo ' auth_pass 123456' >> /etc/keepalived/keepalived.conf;
echo ' }' >> /etc/keepalived/keepalived.conf;
echo ' virtual_ipaddress {' >> /etc/keepalived/keepalived.conf;
echo ' 192.168.0.100' >> /etc/keepalived/keepalived.conf;
echo ' }' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf"
expect {
"*assword:*" {send "$server2_pass\r";exp_continue}
}
# 启动keepalived服务并设置开机启动
spawn ssh $server1_user@$server1_ip "systemctl start keepalived && systemctl enable keepalived"
expect {
"*assword:*" {send "$server1_pass\r";exp_continue}
}
spawn ssh $server2_user@$server2_ip "systemctl start keepalived && systemctl enable keepalived"
expect {
"*assword:*" {send "$server2_pass\r";exp_continue}
}
# 执行完毕,退出
exit
请注意脚本中的变量