练习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 }

f_exist() { 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写一个脚本,只要把盘符和挂载点以参数的形式提供给脚本,该脚本就可以自动格式化、挂载。

要求:

  1. 不用分区,直接格式化
  2. 格式化为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