【Linux运维极简教程】09-定时任务与自动化运维
09 - 定时任务与自动化运维一、cron 定时任务cron 是 Linux 最常用的定时任务服务可以按固定时间周期执行命令或脚本。1.1 crontab 命令# 编辑当前用户的定时任务crontab-e# 查看当前用户的定时任务crontab-l# 删除所有定时任务crontab-r# 编辑指定用户的定时任务需要 rootcrontab-ualice-ecrontab-ualice-l1.2 cron 表达式* * * * * 要执行的命令 │ │ │ │ │ │ │ │ │ └── 星期 (0-70和7都是周日) │ │ │ └────── 月份 (1-12) │ │ └─────────── 日期 (1-31) │ └────────────── 小时 (0-23) └───────────────── 分钟 (0-59)常用 cron 表达式表达式含义*/5 * * * *每 5 分钟0 * * * *每小时整点0 2 * * *每天凌晨 2 点0 2 * * 1每周一凌晨 2 点0 0 1 * *每月 1 号零点0 2 * * 1-5工作日凌晨 2 点*/30 9-18 * * 1-5工作时间每 30 分钟0 0,12 * * *每天零点和 12 点特殊关键字reboot# 系统启动时执行yearly# 每年0 0 1 1 *monthly# 每月0 0 1 * *weekly# 每周0 0 * * 0daily# 每天0 0 * * *hourly# 每小时0 * * * *1.3 crontab 示例# 每天凌晨 2 点备份数据库02* * * /opt/scripts/backup_db.sh/var/log/backup_db.log21# 每 5 分钟检查服务状态挂了自动重启*/5 * * * * /opt/scripts/check_service.sh# 每周日凌晨 3 点清理日志03* *0find/var/log-name*.log-mtime30-delete# 开机时启动自定义脚本reboot /opt/scripts/init_env.sh1.4 cron 注意事项# 1. cron 环境变量极少脚本中需手动设置 PATHPATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 2. cron 中的百分号 % 需要转义或用在脚本中# 错误写法# 0 2 * * * date %Y%m%d /tmp/date.txt# 正确写法02* * *date\%Y\%m\%d/tmp/date.txt# 3. 推荐将复杂逻辑放在脚本中cron 只调用脚本02* * * /opt/scripts/daily_task.sh# 4. 确保脚本有执行权限chmodx /opt/scripts/daily_task.sh1.5 系统级定时任务除了用户 crontab还可以通过以下方式配置系统级定时任务# /etc/crontab - 系统主 crontab多一个用户字段# 格式分 时 日 月 周 用户 命令02* * * root /opt/scripts/system_backup.sh# /etc/cron.d/ - 放置独立的定时任务文件# 格式同 /etc/crontabcat/etc/cron.d/backupEOF 0 2 * * * root /opt/scripts/backup.sh EOF# /etc/cron.hourly/ - 每小时执行# /etc/cron.daily/ - 每天执行# /etc/cron.weekly/ - 每周执行# /etc/cron.monthly/ - 每月执行# 只需将脚本放入对应目录即可cpbackup.sh /etc/cron.daily/chmodx /etc/cron.daily/backup.sh1.6 cron 日志# 查看 cron 执行日志# CentOS/RHELgrepCRON /var/log/cron# Ubuntu/DebiangrepCRON /var/log/syslog# 查看 cron 服务状态systemctl status crond# CentOSsystemctl statuscron# Ubuntu二、at 一次性任务at用于执行一次性定时任务执行后自动删除。# 安装yuminstall-yat# CentOSaptinstall-yat# Ubuntu# 启动服务systemctlenable--nowatd# 今晚 23:00 执行echoshutdown -h now|at23:00# 5 分钟后执行echoecho hello /tmp/test.txt|at now 5minutes# 明天早上 8 点执行at8:00 tomorrow atechoGood morningatCtrlD# 按 CtrlD 提交# 查看待执行任务atq at-l# 删除任务atrm1# 删除任务 ID 为 1 的任务三、Ansible 自动化运维3.1 Ansible 简介Ansible 是基于 SSH 的自动化运维工具无需在目标机器安装客户端。特性说明无 Agent通过 SSH 管理目标机器幂等性多次执行结果一致YAML 语法易读易写模块化丰富的内置模块3.2 安装与配置# 安装控制端yuminstall-yansible# CentOSaptinstall-yansible# Ubuntupipinstallansible# 通用# 配置主机清单cat/etc/ansible/hostsEOF [webservers] 192.168.1.10 ansible_ssh_userroot 192.168.1.11 ansible_ssh_userroot [dbservers] 192.168.1.20 ansible_ssh_userroot [all:vars] ansible_ssh_private_key_file~/.ssh/id_rsa EOF# 测试连通性ansible all-mpingansible webservers-mping3.3 Ad-hoc 命令# 执行命令ansible all-auptimeansible webservers-adf -h# 使用模块# yum 模块 - 安装软件ansible webservers-myum-anamenginx statepresent# service 模块 - 管理服务ansible webservers-mservice-anamenginx statestarted enabledyes# copy 模块 - 复制文件ansible webservers-mcopy-asrc/etc/hosts dest/etc/hosts# file 模块 - 创建目录ansible webservers-mfile-apath/data/app statedirectory mode0755# user 模块 - 创建用户ansible all-muser-anamedeploy shell/bin/bash groupswheel# setup 模块 - 获取主机信息ansible webservers-msetup ansible webservers-msetup-afilteransible_memory_mb3.4 Playbook 示例---# deploy_nginx.yml - 部署 Nginx-name:Deploy Nginx Web Serverhosts:webserversbecome:yes# 使用 sudotasks:-name:Install Nginxyum:name:nginxstate:present-name:Copy nginx configcopy:src:files/nginx.confdest:/etc/nginx/nginx.confbackup:yesnotify:restart nginx-name:Create web rootfile:path:/var/www/htmlstate:directoryowner:nginxgroup:nginxmode:0755-name:Copy index pagecopy:src:files/index.htmldest:/var/www/html/index.html-name:Start and enable Nginxservice:name:nginxstate:startedenabled:yeshandlers:-name:restart nginxservice:name:nginxstate:restarted# 执行 playbookansible-playbook deploy_nginx.yml# 检查语法ansible-playbook --syntax-check deploy_nginx.yml# 模拟执行不实际修改ansible-playbook--checkdeploy_nginx.yml# 查看执行步骤ansible-playbook --list-tasks deploy_nginx.yml四、其他自动化工具4.1 工具对比工具特点适用场景Shell cron简单直接无需额外安装小规模、简单任务Ansible无 AgentYAML 语法学习成本低中小规模批量管理SaltStack高性能实时通信大规模基础设施Puppet声明式成熟稳定大型企业Terraform基础设施即代码云资源管理4.2 自动化运维最佳实践脚本版本管理所有运维脚本纳入 Git 管理幂等性设计脚本可以安全地重复执行日志记录每次执行都有日志便于追溯错误通知任务失败时发送告警邮件/钉钉/微信测试环境验证先在测试环境验证再推到生产五、实战场景场景一监控 自动恢复#!/bin/bash# /opt/scripts/monitor_service.sh# 检查服务状态自动重启并告警SERVICEnginxLOG/var/log/service_monitor.logALERT_EMAILopsexample.comif!systemctl is-active--quiet$SERVICE;thenecho[$(date)]$SERVICE已停止尝试重启...$LOGsystemctl restart$SERVICEsleep3ifsystemctl is-active--quiet$SERVICE;thenecho[$(date)]$SERVICE重启成功$LOGecho$SERVICE在$(date)自动重启成功|mail-s服务恢复告警$ALERT_EMAILelseecho[$(date)]$SERVICE重启失败$LOGecho$SERVICE在$(date)重启失败请紧急处理|mail-s紧急故障告警$ALERT_EMAILfifi# 加入 cron每 2 分钟检查*/2 * * * * /opt/scripts/monitor_service.sh场景二日志轮转#!/bin/bash# /opt/scripts/log_rotate.sh# 按天切割日志保留 30 天LOG_DIR/var/log/myappKEEP_DAYS30# 切割日志cd$LOG_DIRforlog_filein*.log;do[-f$log_file]||continuemv$log_file${log_file}.$(date%Y%m%d)gzip${log_file}.$(date%Y%m%d)done# 通知应用重新打开日志文件# kill -USR1 $(pidof nginx)# 清理旧日志find$LOG_DIR-name*.log.*.gz-mtime$KEEP_DAYS-deleteecho[$(date)] 日志轮转完成/var/log/log_rotate.log# 每天凌晨执行00* * * /opt/scripts/log_rotate.sh场景三定时备份并同步到远程#!/bin/bash# /opt/scripts/backup_and_sync.shset-euopipefailSOURCE/data/mysqlLOCAL_BACKUP/backup/mysqlREMOTE_SERVERbackup192.168.1.100:/backup/mysql/DATE$(date%Y%m%d)KEEP7mkdir-p$LOCAL_BACKUP# 1. 备份数据库mysqldump-uroot -p$DB_PASS--all-databases|gzip$LOCAL_BACKUP/db_${DATE}.sql.gz# 2. 同步到远程rsync-az--progress$LOCAL_BACKUP/db_${DATE}.sql.gz$REMOTE_SERVER# 3. 清理本地旧备份find$LOCAL_BACKUP-namedb_*.sql.gz-mtime$KEEP-deleteecho[$(date)] 备份并同步完成/var/log/backup.log# 每天凌晨 3 点执行03* * * /opt/scripts/backup_and_sync.sh/var/log/backup.log21六、小结本篇介绍了 cron 定时任务、at 一次性任务、Ansible 自动化运维以及实战自动化脚本。定时任务结合 Shell 脚本是运维自动化的第一层Ansible 则适合大规模批量管理。核心原则是能自动化的不要手动做。上一篇08 - Shell 脚本编程入门下一篇10 - 日志管理与故障排查