#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进行连接每一台服务器,执行添加用户的命令;

现在运行这个脚本并看它的执行结果:

img

脚本的运行很成功,用户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