shell训练计划30天之第二十九天

例 91 部署mysql主从

要求:用shell脚本实现,部署mysql主从,假设两台机器上已经安装了mysql,并且目前无新库

要点:1.主上改配置文件,打开bin-log,设定server_id,设定ignore_db,重启,授权用户,锁表,show master status

2.从上改配置文件,设定server_id,重启,stop slave,change master ,start slave

在主上写一个脚本,所有操作在此脚本中完成,包括写expect脚本。

#!/bin/bash

master_ip=192.168.100.12

slave_ip=192.168.100.13

mysql="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

}

 

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

#!/bin/bash

master_ip=192.168.100.12

slave_ip=192.168.100.13

mysql="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

}

 

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 <<EOF

grant replication slave on *.* to 'repl'@$slave_ip identified by 'yourpassword';

flush tables with read lock;

EOF

$mysql -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' /my.cnf

fi

 

/etc/init.d/mysql 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",mas_ter_log_pos=$pos;

start slave;

EOF

EOF

f_exist /tmp/rss_slave.expect

cat > /tmp/rs_slave.expect <<EOF

#!/bin/bash

set passwd "aminglinux"

spawn rsync -a /tmp/slave.sh root@slave_ip:/tmp/slave.sh

expect{

"yes/no" {sed "yes\r"}

"password:" {send "\$passwd\r"}

}

expect eof

EOF

 

chmod +x /tmp/rs_slave.expect

/tmp/rs_slave.expect

check_ok "传输slave.sh"

 

f_exist /tmp/exe.expect

 

cat > /tmp/exe.expect <<EOF

#!/usr/bin/expect

set passwd "aming linux"

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

chmod +x /tmp/exe.expect

/tmp/exe.expect

check_ok "远程执行slave.sh"

 

 

$mysqlc -e "unlock tables"

 

 

 

例92 管理docker

要求:写一个脚本实现一键管理docker容器,比如启动、关闭、删除容器等操作。

1.脚本支持启动全部容器、关闭全部容器、删除全部容器

2.需要提示用户如何使用该脚本,需给出范例

要点:

1.要关闭或启动容器,首先要知道容器的ID,使用命令docker ps -a 查看,第一列就是容器ID

2.需要以交互的方式让用户输入关闭、启动、或者删除的命令,如果用户输入的命令不正确,需要给出提示

3.可以把容器的ID 先存入到一个临时文件里,方便后续遍历。

 

#!/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 $d

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

 

 

例 93 安装配置samba

要求:写一个shell脚本,能够实现一键安装并配置samba服务,执行该脚本时需要带一个参数,为共享的目录,若目录不存在,需自动创建

任何人都可以访问,且不用密码。并且目录是只读的。

要点:需要判断用户给出的目录是不是绝对路径,即是否都是'/'开头

脚本要判断samba服务是否已经安装,若已经安装了,就不需要执行yum install samba了

 

#!/bin/bash

if [ "$#" -ne 1 ]

then

echo "运行脚本的格式为: $0 /dir/"

exit 1

else

else

if ! echo $1 |grep -q '^/.*'

then

echo "请提供一个绝对路径"

exit 1

fi

fi

 

if ! rpm -q samba > /dev/null

then

echo "将要安装samba"

sleep 1

yum install -y samba

if [ $? -ne 0 ]

then

echo "samba安装失败"

exit 1

fi

fi

 

cnfdir="/etc/samba/smb.conf"

car >> $cnfgfir <<EOF

[share]

conmment = share all

path = $1

browseable = yes

public = yes

writable = no

EOF

 

if [ ! -d $1 ]

then

mkdir -p $1

fi

 

chmod 777 $1

echo "test" > $1/test.txt

systemctl start smb

if [ $? -ne 0 ]

then

echo "samba服务启动失败,请检查配置文件是否正确。"

else

echo "samba服务启动完毕,请验证"

fi

 

例94 批量查看多台机器负载

要求:假如公司的一个业务,域名为www.aminglinux.com,现在有5台机器在跑。为了快速查看着5台机器的负载,需要你写一个shell脚本,运行脚本后,就能一下子把5台机器的负载全部打印出来,

要点:expect脚本配置或者配置秘钥认证号

ssh-keygen -f /root/.shh/newkey

ssh -i /root/.ssh/newkey ip

ssh-agent

ssh-add /root/.sh/newkey

eval`ssh-agent`

 

 

#!/bin/bash

for ip in `cat /tmp/ip.list`

do

echo $ip

ssh $ip "uptime"

done

 

 

例95 自动挂云盘

我们使用的是云主机,购买一块云盘后,默认并不是挂载状态的,用shell写一个脚本,只要把盘符和挂载点以参数的形式提供给脚本,该脚本就可以自动格式化、挂载

要求:

不用分区直接格式化

格式化为ext4文件系统类型

要点:参数要有两个,第一个是设备名,第二个是挂载点,需要判断给出的参数个数以及是否可用

格式化磁盘的命令为mkfs.ext4 磁盘设备名

mount命令挂载,挂载完后还需要编辑/etc/fstab配置文件

 

#!/bin/bash

if [ $n -ne 2 ]

then

echo "Useage $0 盘符 挂载点,如: $0 /dev/xvdbb /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 defults 0 0" >> /etc/fstab

mount -a

else

echo "配置文件/etc/fstab中已经存在挂载点$2,请检查"

exit 1

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值