Skip to content

14. 自动化与脚本编写

本章节指导在 RHEL 8.10(主机名 ZSLinux)上使用 SecureCRT 进行自动化和脚本编写,配合 SecureFX 传输脚本文件。内容涵盖 Shell 脚本编写、Ansible 自动化、定时任务管理和实用工具配置,以支持自动化部署和日常运维,全面实用,适合初学者快速掌握和运维人员实践。所有操作在 ZSLinux 环境中测试,确保实验一致性。

14.1 前提条件

  • RHEL 8.10 已安装(参考第 1 章),主机名设置为 ZSLinux.
  • 使用 SecureCRT 登录(SSH2 协议,端口 2222,参考第 6 章).
  • 使用 SecureFX 传输文件(SFTP 协议).
  • 具有 root 或 sudo 权限.
  • 系统已订阅并启用 RHEL 和 EPEL 仓库(参考第 4 和 7 章).
  • sshd 服务已配置(参考第 6 章).

14.2 自动化工具

14.2.1 配置 Ansible

  • 安装 Ansible:
    bash
    dnf install -y ansible  # 安装 Ansible 自动化工具
  • 配置 SSH 密钥(参考第 6 章):
    bash
    ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa  # 生成 SSH 密钥对
    ssh-copy-id -p 2222 testuser@ZSLinux  # 复制公钥到目标主机
  • 创建库存文件:
    bash
    vim /etc/ansible/hosts  # 编辑 Ansible 库存文件
    # 添加:
    [webservers]
    ZSLinux ansible_port=2222 ansible_user=testuser
  • 测试 Ansible 连接:
    bash
    ansible -i /etc/ansible/hosts webservers -m ping  # 测试 Ansible 连接

14.2.2 编写 Ansible Playbook

  • 创建 Playbook 安装 httpd
    bash
    vim /etc/ansible/playbook.yml  # 创建 Playbook 文件
    # 添加:
    - hosts: webservers
      tasks:
        - name: Install httpd
          dnf:
            name: httpd
            state: present
        - name: Start httpd
          service:
            name: httpd
            state: started
            enabled: yes
    ansible-playbook /etc/ansible/playbook.yml  # 运行 Playbook

14.3 脚本与定时任务

14.3.1 编写 Shell 脚本

  • 创建备份脚本:
    bash
    vim /usr/local/bin/backup.sh  # 创建备份脚本
    # 添加:
    #!/bin/bash
    BACKUP_DIR="/backup"
    DATE=$(date +%F)
    tar -czf $BACKUP_DIR/etc-$DATE.tar.gz /etc  # 备份 /etc 目录
    echo "Backup completed: $BACKUP_DIR/etc-$DATE.tar.gz" >> /var/log/backup.log
    chmod +x /usr/local/bin/backup.sh  # 添加执行权限

14.3.2 调试 Shell 脚本

  • 测试脚本语法:
    bash
    bash -n /usr/local/bin/backup.sh  # 检查脚本语法错误
  • 启用调试模式:
    bash
    bash -x /usr/local/bin/backup.sh  # 运行脚本并显示调试信息

14.3.3 配置定时任务

  • 配置 crontab 定时备份:
    bash
    crontab -e  # 编辑用户 crontab
    # 添加:
    0 0 * * * /usr/local/bin/backup.sh  # 每天 00:00 执行备份
    systemctl enable --now crond  # 启用并启动 crond 服务
  • 配置一次性任务:
    bash
    at now + 1 hour  # 安排 1 小时后执行任务
    # 输入:
    /usr/local/bin/backup.sh
    # 按 Ctrl+D 提交
  • 配置 anacron(非连续运行任务):
    bash
    vim /etc/anacrontab  # 编辑 anacron 配置文件
    # 添加:
    1 5 backup.daily /usr/local/bin/backup.sh  # 每天运行一次,延迟 5 分钟
    systemctl enable --now anacron  # 启用并启动 anacron 服务

14.3.4 自动化部署脚本

  • 创建 Git 部署脚本:
    bash
    vim /usr/local/bin/auto_deploy.sh  # 创建 Git 自动化脚本
    # 添加:
    #!/bin/bash
    LOG_FILE="/var/log/git_deploy.log"
    echo "$(date '+%Y-%m-%d %H:%M:%S'): Starting deploy" >> $LOG_FILE
    if git diff-index --quiet HEAD --; then
        echo "$(date '+%Y-%m-%d %H:%M:%S'): No changes to commit" >> $LOG_FILE
    else
        git add .  # 添加所有更改
        git commit -m "docs: Updated on $(date '+%Y-%m-%d %H:%M:%S')"  # 提交更改
        git push -u origin main  # 推送到远程仓库
        echo "$(date '+%Y-%m-%d %H:%M:%S'): Deploy completed" >> $LOG_FILE
    fi
    chmod +x /usr/local/bin/auto_deploy.sh  # 添加执行权限

14.3.5 使用实用工具

  • 安装并使用 fdupes
    bash
    dnf install -y fdupes  # 安装 fdupes 工具
    fdupes -r /backup  # 递归查找重复文件
    fdupes -r -d -N /backup  # 删除重复文件,保留第一个,无提示

14.4 验证

  • 验证 Ansible 配置:
    bash
    ansible -i /etc/ansible/hosts webservers -m ping  # 验证 Ansible 连接
    systemctl is-active httpd  # 验证 httpd 服务状态
  • 验证 Shell 脚本:
    bash
    /usr/local/bin/backup.sh  # 运行备份脚本
    cat /var/log/backup.log  # 检查备份日志
  • 验证定时任务:
    bash
    crontab -l  # 查看 crontab 配置
    atq  # 查看 at 任务队列
    cat /var/log/anacron  # 检查 anacron 日志
  • 验证 Git 部署:
    bash
    /usr/local/bin/auto_deploy.sh  # 运行 Git 部署脚本
    cat /var/log/git_deploy.log  # 检查部署日志
  • 验证 fdupes
    bash
    fdupes -r /backup  # 检查重复文件
  • 常见问题:
    • Ansible 连接失败:检查 SSH 密钥(~/.ssh/id_rsa) 和库存文件(/etc/ansible/hosts)。
    • 脚本失败:运行 bash -n 检查语法,或 bash -x 调试。
    • 定时任务未运行:确认 crondanacron 服务状态(systemctl status crond)。

14.5 实践任务

  1. 使用 SecureCRT 登录 ZSLinux,安装 Ansible 并配置 SSH 密钥连接。
  2. 编写 Ansible Playbook 安装并启动 httpd 服务。
  3. 创建 Shell 脚本 /usr/local/bin/backup.sh,配置 crontab 每天备份 /etc.
  4. 编写 Git 自动化部署脚本并验证日志。

14.6 自测问题

  • 问题:如何运行 Ansible Playbook?
    • 答案ansible-playbook /etc/ansible/playbook.yml
  • 问题:如何配置每天运行的定时任务?
    • 答案crontab -e,添加 0 0 * * * /path/to/script
  • 问题:如何检查 Git 工作区是否干净?
    • 答案git diff-index --quiet HEAD --

Released under the MIT License.