#10: 脚本实现自动化
现在你可以用前面章节中学到的bash知识来创建自己有用的脚本,这些脚本可以帮你自动化的执行一些枯燥无味的重复性管理任务。
无论什么时候,编写shell脚本实现自动化,都应该是你的最终目标。
这一节,将展示一些自动化脚本,你可以扩展这些脚本来自动化完成一些你想要的完成的任务。
自动化用户管理
在多台服务器上创建用户可能是你作为系统管理员的日常工作,它和枯燥无味,所以我们干脆就用脚本来自动完成它。
首先,创建一个文本,在里面写入需要添加用户的所有服务器的主机名和IP地址。
例如下面的servers.txt文件就包含了5个不同的服务器名:
sean@debian-12:~$ cat servers.txt
server1
server2
server3
server4
server5
因为我已经将需要管理的服务器IP信息配置在/etc/hosts文件中,所以这里使用的是服务器的主机名。当然你也可以在这里配置ssh的信息。关于ssh的配置和使用这里就不说了。不是本节的内容范围。
现在看看下面的adduser.sh脚本的代码:
#!/bin/bash
servers=$(cat servers.txt)
echo -n "Enter the username: "
read name
echo -n "Enter the user id: "
read uid
for i in $servers; do
echo $i
ssh $i "sudo useradd -m -u $uid ansible"
if [ $? -eq 0 ]; then
echo "User $name added on $i"
else
echo "Error on $i"
fi
done
adduser.sh脚本会首先要求你输入要添加的用户的用户名和用户ID;然后它会读取servers.txt文件,遍历文件中的每行数据,循环通过ssh进行连接每一台服务器,执行添加用户的命令;
现在运行这个脚本并看它的执行结果:
脚本的运行很成功,用户ansible被添加到五台机器上面了。关于这个脚本的执行,你还需要理解以下的内容。
- 你可以使用在服务器上配置公私钥登录的方式来不免运行ssh登录的时候提示输入密码。
- 服务器上的用户必须是一个拥有超级管理员权限的用户,因为创建用户需要超管的权限。
假设你现在需要在近百台,甚至更多的服务器上做创建用户的操作,这个adduser.sh脚本可以帮你接收很多的工作时间。
自动备份
备份数据也是系统运维管理员经常需要做的事情,所以,为什么不自动话呢?,下面请看backup.sh脚本:
#!/bin/bash
backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)
echo "Starting backup of: ${backup_dirs[@]}"
for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done
sudo rm /tmp/*.gzecho "Backup is done."
因此,首先创建一个名为backup_dirs的数组,在里面存储了需要备份的所有目录名。然后再创建三个变量
- dest_dir: 指定备份的目标目录。
- dest_server: 指定需要备份的目标服务器。
- backup_time: 指定备份的时间。
接下来,在/tmp/目录中创建压缩的归档文件,使用scp命令将这些归档文件通过ssh通道发送到目标服务器的目标目录中保存。最后删除掉/tmp中的归档文件。
下面是运行这个脚本的示例:
sean@debian-12:~$ ./backup.sh
Starting backup of: /etc /home /boot
/etc backup succeeded.
etc-Aug-30-20.tar.gz 100% 1288KB 460.1KB/s 00:02
/etc transfer succeeded.
/home backup succeeded.
home-Aug-30-20.tar.gz 100% 2543KB 547.0KB/s 00:04
/home transfer succeeded.
/boot backup succeeded.
boot-Aug-30-20.tar.gz 100% 105MB 520.2KB/s 03:26
/boot transfer succeeded.
Backup is done.
你可能还想在每天的午夜执行一下备份的操作,这时候,你可以使用命令crontab -e将脚本添加到定时任务的调度中。下面的代码就是在每天的零点零分crontab会自动调度执行/home/sean/scripts/backup.sh这个脚本。
sean@debian-12:~$ crontab -e
0 0 * * * /home/sean/scripts/backup.sh
监控磁盘可用空间
文件系统空间总有耗尽的时候,你唯一能做的,就是在空间耗尽、系统崩溃发生之前,及时了解情况,并采取必要的行动!可以使用df命令查看任何文件系统的剩余空间。
sean@debian-12:~$ df -h / /apps /database
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 20G 7.9G 11G 44% /
/dev/mapper/vg1-applv 4.9G 2.4G 2.3G 52% /apps
/dev/mapper/vg1-dblv 4.9G 4.5G 180M 97% /database
可以看到,我的/database空间基本耗尽,当前的使用率是97%,可以只显示已使用,用awk命令显示第五列就是。
现在看看下面的disk_space.sh脚本的代码:
#!/bin/bash
filesystems=("/" "/apps" "/database")
for i in ${filesystems[@]}; do
usage=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $usage -ge 90 ]; then
alert="Running out of space on $i, Usage is: $usage%"
echo "Sending out a disk space alert email."
echo $alert | mail -s "$i is $usage% full" your_email
fi
done
首先,我们创建了一个filesystems数组,其中保存了要监控的所有文件系统。然后,获取每个文件系统的使用率,并检查它是否大于或等于90。如果使用率超过90%,它会发送一个警告电子邮件,表明文件系统的空间即将耗尽。
请将脚本中的your_email替换为你实际的电子邮箱地址。
现在运行脚本
sean@debian-12:~$ ./disk_space.sh
Sending out a disk space alert email.
在电子邮箱的收件箱里收到了邮件。
如果你需要6个小时运行一次disk_space.sh脚本的话,可以在crontab中这样设置:
sean@debian-12:~$ crontab -e
0 */6 * * * /home/sean/scripts/disk_space.sh
You may practice some more by trying to solve the problems presented in the workbook below. And yes, they include the answers as well.
练习题
自己动手做练习可以帮助你记忆刚学到的东西,下面是几到简单的练习题,用到了上面提到的内容。如果您是初学者,建议您可以自己动手做一下。
练习 1:在服务器上自动化用户管理
在多个服务器上创建用户可能是系统管理员每天都要做的事情。这是一项乏味的任务。编写一个bash脚本,使整个过程自动化。
难度级别:困难
提示: 首先,创建一个文本文件,其中包含你希望添加用户的所有服务器主机名或IP地址。
例如,你可以创建包含五个不同服务器名称的文件servers.txt:
sean@debian-12:~$ cat servers.txt
server1
server2
server3
server4
server5
这些是服务器主机名。IP地址已经假设包含在/etc/hosts文件中,且已经配置了免密登陆。脚本会先让你输入想要添加的用户的用户名和用户ID;然后,它将循环并通过SSH连接到servers.txt文件中的所有服务器,并添加所请求的用户。
练习 2:自动备份到一个单独的服务器
写一个shell脚本,在单独的服务器上备份文件存档。
难度级别:困难
提示:创建一个名为backup_dirs的数组,存储我们想要备份的所有目录名。接下来,创建另外三个变量:
-
dest_dir:指定备份的目标目录。
-
dest_server:指定备份目的服务器
-
backup_time:指定备份日期
最后,对于backup_dirs数组中的所有目录,在/tmp下创建一个gzip压缩的tar归档文件,然后使用scp命令将备份发送/复制到目标服务器。最后,删除/tmp下的所有gzip压缩归档文件。
练习 3:定期自动备份
每天午夜在单独的备份服务器上根据练习2进行备份。
难度级别:中等
提示:安排练习2中描述的脚本作为cron作业运行。
练习 4:自动监控可用磁盘空间
使用df、tail、awk和cut命令来获取系统的磁盘使用百分比,并检查它是否大于或等于90%。
难度级别:困难
提示:首先,创建一个filesystems数组,其中保存了你想要监控的所有文件系统。然后,对每个文件系统,使用给定的命令获取使用百分比,并检查它搜狗大于或等于90%。如果使用率高于90%,它应该发送一个警告电子邮件,表明文件系统即将耗尽空间。
练习 5:定期自动监控磁盘空间
根据练习4每六个小时检查一次系统上的磁盘使用情况。
难度级别:中等
提示:安排练习4中的脚本作为cron的作业运行。
练习 6:自动执行磁盘空间监控和定时备份
每天午夜在单独的备份服务器上使用cton根据练习2进行备份;还有根据练习4每六个小时检查一次系统上的磁盘使用情况。
难度级别:中等
提示:将练习2和练习4作为cron的作业运行
练习题答案
答案 1:在服务器上自动化用户管理
在多个服务器上创建用户可能是系统管理员每天都要做的事情。这是一项乏味的任务。编写一个bash脚本,使整个过程自动化。
#!/bin/bash
servers=$(cat servers.txt)
echo -n "Enter the username: "
read name
echo -n "Enter the user id: "
read uid
for i in $servers; do
echo $i
ssh $i "sudo useradd -m -u $uid ansible"
if [ $? -eq 0 ]; then
echo "User $name added on $i"
else
echo "Error on $i"
fi
done
答案 2:自动备份到一个单独的服务器
写一个shell脚本,在单独的服务器上备份文件存档。
#!/bin/bash
backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)
echo "Starting backup of: ${backup_dirs[@]}"
for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done
sudo rm /tmp/*.gzecho "Backup is done."
答案 3:定期自动备份
每天午夜在单独的备份服务器上根据练习2进行备份。
sean@debian-12:~$ crontab -e
0 0 * * * /home/sean/scripts/backup.sh
答案 4:自动监控可用磁盘空间
使用df、tail、awk和cut命令来获取系统的磁盘使用百分比,并检查它是否大于或等于90%。
#!/bin/bash
filesystems=("/" "/apps" "/database")
for i in ${filesystems[@]}; do
usage=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $usage -ge 90 ]; then
alert="Running out of space on $i, Usage is: $usage%"
echo "Sending out a disk space alert email."
echo $alert | mail -s "$i is $usage% full" your_email
fi
done
答案 5:定期自动监控磁盘空间
根据练习4每六个小时检查一次系统上的磁盘使用情况。
sean@debian-12:~$ crontab -e
0 */6 * * * /home/sean/scripts/disk_space.sh
答案 6:自动执行磁盘空间监控和定时备份
每天午夜在单独的备份服务器上使用cton根据练习2进行备份;还有根据练习4每六个小时检查一次系统上的磁盘使用情况。
sean@debian-12:~$ crontab -e
0 0 * * * /home/sean/scripts/backup.sh
0 */6 * * * /home/sean/scripts/disk_space.sh
