练习91
用shell脚本实现,部署mysql主从,假设两台机器上已经安装了mysql,并且目前无新库。
#!/bin/bash
master_ip=192.168.100.12
slave_ip=192.168.100.13
mysqlc="mysql -uroot -paminglinux"
check_ok()
{
if [ $? -ne 0 ]
then
echo "$1 出错了。"
exit 1
fi
}
fexist()
{
d=date +%F%T
if [ -f $1 ]
then
mv $1 $1$d
fi
}
设置主mysql配置
if ! grep '^server-id' /etc/my.cnf
then
sed -i '/^[mysqld]$/a\server-id = 1001' /etc/my.cnf
fi
if ! grep '^log-bin.=.' /etc/my.cnf
then
sed -i '/^[mysqld]$/a\log-bin = aminglinux' /etc/my.cnf
fi
sed -i '/^log-bin.*/a\binlog-ignore-db = mysql ' /etc/my.cnf
/etc/init.d/mysqld restart
check_ok "主上重启mysql"
登录mysql,授权用户、锁表以及show master status。
$mysqlc <<EOF
grant replication slave on . to 'repl'@$slave_ip identified by 'yourpassword';
flush tables with read lock;
EOF
$mysqlc -e "show master status" > /tmp/master.log
file=tail -1 /tmp/master.log|awk '{print $1}'
pos=tail -1 /tmp/master.log|awk '{print $2}'
创建在从上配置和操作的脚本
f_exist /tmp/slave.sh
cat > /tmp/slave.sh << EOF
#!/bin/bash
if ! grep '^server-id' /etc/my.cnf
then
sed -i '/^[mysqld]$/a\server-id = 1002' /etc/my.cnf
fi
/etc/init.d/mysqld restart
check_ok "从上重启mysql"
$mysqlc <<EOF
stop slave;
change master to master_host="$master_ip", master_user="repl", master_password="yourpassword", master_log_file="$file", master_log_pos=$pos;
start slave;
EOF
EOF
创建传输slave.sh的expect脚本
f_exist /tmp/rs_slave.expect
cat > /tmp/rs_slave.expect <<EOF
#!/usr/bin/expect
set passwd "aminglinux"
spawn rsync -a /tmp/slave.sh root@$slave_ip:/tmp/slave.sh
expect {
"yes/no" { send "yes\r"}
"password:" { send "\$passwd\r" }
}
expect eof
EOF
执行expect脚本
chmod +x /tmp/rs_slave.expect
/tmp/rs_slave.expect
check_ok "传输slave.sh"
创建远程执行命令的expect脚本
f_exist /tmp/exe.expect
cat > /tmp/exe.expect <<EOF
#!/usr/bin/expect
set passwd "aminglinux"
spawn ssh root@$slave_ip
expect {
"yes/no" { send "yes\r"}
"password:" { send "\$passwd\r" }
}
expect "]"
send "/bin/bash /tmp/slave.sh\r"
expect "]"
send "exit\r"
EOF
执行expect脚本
chmod +x /tmp/exe.expect
/tmp/exe.expect
check_ok "远程执行slave.sh"
主上解锁表
$mysqlc -e "unlock tables"
#!/bin/bash
while true
do
read -p "请输入你要执行的操作:(stop/start/rm) " opt
if [ -z "$opt" ]
then
echo "请输入要执行的操作。"
continue
else
break
fi
done
docker ps -a |awk '{print $1}' > /tmp/id.txt
case $opt in
stop)
for id in cat /tmp/id.txt
do
docker stop $id
done
;;
start)
for id in cat /tmp/id.txt
do
docker start $id
done
rm)
for id in cat /tmp/id.txt
do
read -p "将要删除容器$id,是否继续?(y|n)" c
case $c in
y|Y)
docker rm -f $id
;;
n|N)
echo "容器$id不会被删除。"
;;
)
echo "你只能输入'y'或者'n'。"
;;
esac
done
)
echo "你只能输入start/stop/rm。"
;;
esac
练习94
假如公司的一个业务,域名为www.aminglinux.com,现在有5台机器在跑。为了快速查看这5台机器的负载,需要你写一个Shell脚本,运行脚本后,就能一下子把5台机器的负载全部打印出来。
#!/bin/bash
for ip in cat /tmp/ip.list
do
echo $ip
ssh $ip "uptime"
done
练习95
我们使用的云主机,购买一块云盘后,默认并不是挂载状态的,用shell写一个脚本,只要把盘符和挂载点以参数的形式提供给脚本,该脚本就可以自动格式化、挂载。
要求:
- 不用分区,直接格式化
- 格式化为ext4文件系统类型
#!/bin/bash
if [ $# -ne 2 ]
then
echo "Useage $0 盘符 挂载点, 如: $0 /dev/xvdb /data"
exit 1
fi
if [ ! -b $1 ]
then
echo "你提供的盘符不正确,请检查后再操作"
exit 1
fi
echo "格式化$1"
mkfs -t ext4 $1
if [ ! -d $2 ] ;then
mkdir -p $2
fi
n=awk '$NF == "$2"' /etc/fstab|wc -l
if [ $n -eq 0 ]
then
echo "$1 $2 ext4 defaults 0 0" >> /etc/fstab
mount -a
else
echo "配置文件/etc/fstab中已经存在挂载点$2,请检查一下."
exit 1
fi