🎉 限时公测|限量体验29元4核8G39元8核16G云开发环境一个月,助力Vibe Coding新时代!

Linux 自动化运维 - cron、systemd timers 与 Ansible

初级

深入学习Ubuntu 24.10 Server自动化运维技术,掌握cron定时任务、systemd timers、bash脚本编程和Ansible自动化工具的使用。通过生活化类比和渐进式实践,让初学者轻松掌握自动化运维技能。

未知
easylearning团队
更新于 2025-01-23

🚀 实践环境(SSH)

欢迎使用Easylearning为您专属打磨的自由学习实践环境, 登录后马上开始边学边练吧!

StudyBoard

创建StudyBoard练习实例,系统自动连接到实例后,可以在教程中直接发送远程命令到实例中执行并能查看结果,享受更好的学习体验。

Linux 自动化运维 - cron、systemd timers 与 Ansible

自动化运维是现代Linux系统管理的核心技能,就像工厂的自动化生产线一样重要。在前面的章节中,我们学习了如何监控系统状态和管理日志信息,现在我们要学习如何让系统"自己照顾自己",通过自动化技术将监控发现的问题自动处理,将日志分析的结果自动响应。本教程将通过生活化类比和实践操作,帮助您掌握自动化运维的核心技能。

🎯 学习目标

完成本章学习后,您将能够:

  • 自动化概念理解: 深入理解自动化运维的重要性和在现代IT中的核心作用
  • 定时任务掌握: 熟练使用cron和systemd timers进行任务调度和时间管理
  • 脚本编程技能: 掌握bash脚本编写和自动化逻辑设计的实用技能
  • 配置管理能力: 学会使用Ansible进行批量配置管理和应用部署
  • 监控集成技能: 能够将自动化任务与监控系统集成,实现智能运维

🏗️ 自动化运维核心概念

自动化运维是什么?

官方定义: 根据Linux官方文档,自动化运维是一种通过程序化、脚本化和工具化的方式,替代人工操作来完成系统管理、配置部署、监控维护等运维任务的技术和方法论,旨在提高运维效率、减少人为错误、确保操作一致性和可重复性

生活化类比: 自动化运维就像现代化的智能工厂生产线

  • 生产计划 = 定时任务调度,按时间表自动执行各种操作
  • 机械臂 = 自动化脚本,精确执行重复性工作
  • 质检系统 = 监控检查,自动发现和报告问题
  • 流水线 = 自动化流程,一个任务完成后自动触发下一个
  • 中央控制室 = 配置管理中心,统一管理所有自动化任务
  • 维修工程师 = 运维人员,设计和维护自动化系统
  • 生产报表 = 执行日志,记录所有自动化操作的结果

自动化运维的核心价值

效率提升

  • 批量操作能力:同时管理数百台服务器,大幅提升操作效率
  • 标准化流程:将最佳实践固化为自动化脚本,确保操作一致性
  • 快速响应机制:自动化告警和处理,缩短故障恢复时间

质量保障

  • 减少人为错误:程序化操作避免手工操作的失误和疏忽
  • 操作可重复性:相同的操作在不同环境中产生一致的结果
  • 完整审计跟踪:自动记录所有操作,便于问题追溯和合规审计

成本控制

  • 人力成本优化:减少重复性工作,释放人力资源用于更有价值的工作
  • 时间成本节约:自动化任务可以在非工作时间执行,提高资源利用率
  • 风险成本降低:降低操作风险,减少因故障造成的业务损失

自动化运维架构层次

任务调度层:负责按时间或事件触发自动化任务 脚本执行层:实现具体的自动化逻辑和操作 配置管理层:管理系统配置和应用部署 监控反馈层:监控自动化任务执行状态并提供反馈

自动化应用场景

自动化运维可以应用于IT运维的各个方面,从日常维护到复杂的部署管理,都可以通过自动化技术来提升效率和可靠性。

⏰ Cron 定时任务

Cron是什么?

官方定义: 根据Linux官方文档,Cron是一个基于时间的作业调度器,运行在类Unix操作系统中,允许用户在固定时间、日期或间隔内调度作业(命令或脚本)运行。Cron守护进程(crond)在后台运行,并定期检查用户的crontab文件以执行预定的任务

生活化类比: Cron就像一个智能闹钟管家系统

  • 主控闹钟 = crond守护进程,24小时不间断工作
  • 闹钟设置表 = crontab文件,记录所有的定时任务
  • 闹钟响铃 = 任务执行,到时间就自动运行指定程序
  • 闹钟类型 = 不同的时间模式(每天、每周、每月等)
  • 响铃内容 = 要执行的命令或脚本
  • 闹钟日志 = 系统日志,记录每次任务的执行情况

Cron工作原理深入解析

核心组件

  • crond守护进程:系统启动时自动运行,每分钟检查一次任务表
  • crontab文件:存储用户的定时任务配置,位于/var/spool/cron/crontabs/
  • 时间匹配引擎:当系统时间与任务配置的时间模式匹配时,执行相应命令
  • 执行环境:每个任务在独立的shell环境中执行,环境变量有限

执行流程

  1. 启动阶段:系统启动时crond守护进程自动启动
  2. 检查阶段:每分钟检查所有用户的crontab文件
  3. 匹配阶段:比较当前时间与任务的时间模式
  4. 执行阶段:匹配成功时在新的shell进程中执行命令
  5. 记录阶段:将执行结果记录到系统日志中

Cron时间格式详解

Cron使用五个字段定义执行时间,就像填写一张"预约表",每个字段都有特定的含义:

BASH
# Cron 时间格式结构图
# 分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-7)
#     *         *         *         *         *
#     |         |         |         |         |
#     |         |         |         |         +-- 星期几 (0=Sunday, 7=Sunday)
#     |         |         |         +------------ 月份 (1-12, Jan-Dec)
#     |         |         +---------------------- 日期 (1-31)
#     |         +-------------------------------- 小时 (0-23)
#     +------------------------------------------ 分钟 (0-59)
 
# 记忆口诀:分时日月周
# 分钟 小时 日期 月份 星期

特殊字符含义

字符含义示例说明
*任何值* * * * *每分钟执行
,多个值0,30 * * * *每小时的0分和30分
-范围值0 9-17 * * *每天9点到17点
/间隔值*/5 * * * *每5分钟执行

常用时间模式示例

BASH
# 基础时间模式(推荐初学者使用)
0 0 * * *     # 每天午夜12点执行(日常备份)
0 */2 * * *   # 每2小时执行一次(定期检查)
30 9 * * 1-5  # 工作日上午9:30执行(工作日报告)
0 0 1 * *     # 每月1号午夜执行(月度统计)
0 0 * * 0     # 每周日午夜执行(周度清理)
 
# 进阶时间模式
15,45 */2 * * * # 每2小时的15分和45分执行
0 9-17/2 * * 1-5 # 工作日9-17点,每2小时执行
0 0 1,15 * *    # 每月1号和15号午夜执行

初学者提示

  • 从简单的时间模式开始,如 0 2 * * *(每天凌晨2点)
  • 使用在线Cron表达式生成器来验证你的时间格式
  • 测试时可以设置较短的间隔,如 */2 * * * *(每2分钟)

🛠️ 实践练习1:Cron基础操作

让我们从最简单的Cron操作开始,逐步掌握定时任务的管理。

步骤1:查看和编辑Crontab

请登录以使用远程命令功能
# 查看当前用户的定时任务(初次使用可能为空)
$crontab -l
# 编辑当前用户的定时任务(会打开默认编辑器)
$crontab -e
# 如果是第一次使用,系统会询问选择编辑器

步骤2:创建第一个定时任务

请登录以使用远程命令功能
# 在crontab编辑器中添加以下内容
# 每分钟在家目录创建一个时间戳文件(用于测试)
$* * * * * echo "$(date)" >> ~/cron_test.log
# 保存并退出编辑器
# nano: Ctrl+X, 然后按Y确认,按Enter保存
# vim: 按ESC,输入:wq,按Enter保存

步骤3:验证任务执行

请登录以使用远程命令功能
# 等待1-2分钟后检查日志文件
$cat ~/cron_test.log
# 查看cron系统日志
$sudo tail -f /var/log/syslog | grep CRON
# 删除测试任务(编辑crontab,删除刚才添加的行)
$crontab -e

Cron管理命令详解

请登录以使用远程命令功能
# 基础管理命令
$crontab -l # 列出当前用户的所有定时任务
$crontab -e # 编辑当前用户的定时任务
$crontab -r # 删除当前用户的所有定时任务(谨慎使用)
# 管理其他用户的定时任务(需要root权限)
$sudo crontab -l -u username # 查看指定用户的定时任务
$sudo crontab -e -u username # 编辑指定用户的定时任务
# 服务管理命令
$sudo systemctl status cron # 查看cron服务状态
$sudo systemctl restart cron # 重启cron服务
$sudo systemctl enable cron # 设置cron服务开机自启
# 日志查看命令
$sudo tail -f /var/log/syslog | grep CRON # 实时查看cron日志
$journalctl -u cron -f # 使用systemd查看cron日志

重要提醒

  • crontab -r 会删除所有定时任务,使用前请确认
  • 编辑crontab时,语法错误可能导致任务无法执行
  • 定时任务的输出默认会发送邮件给用户,建议重定向到日志文件

Cron 配置示例

请登录以使用远程命令功能
# 编辑 crontab
$crontab -e
# 常用定时任务示例
# 每分钟执行一次
$* * * * * /usr/local/bin/check_system.sh
# 每小时的第30分钟执行
$30 * * * * /usr/local/bin/hourly_backup.sh
# 每天凌晨2点执行
$0 2 * * * /usr/local/bin/daily_maintenance.sh
# 每周日凌晨3点执行
$0 3 * * 0 /usr/local/bin/weekly_report.sh
# 每月1号凌晨4点执行
$0 4 1 * * /usr/local/bin/monthly_cleanup.sh
# 工作日(周一到周五)上午9点执行
$0 9 * * 1-5 /usr/local/bin/workday_check.sh
# 每10分钟执行一次
$*/10 * * * * /usr/local/bin/frequent_check.sh
# 每2小时执行一次
$0 */2 * * * /usr/local/bin/bi_hourly_task.sh
# 特定时间执行(上午8:30和下午6:30)
$30 8,18 * * * /usr/local/bin/twice_daily.sh
# 环境变量设置
$PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
$MAILTO=admin@example.com
# 带输出重定向的任务
$0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

系统级 Cron 配置

请登录以使用远程命令功能
# 系统级 crontab 文件
$sudo nano /etc/crontab
# 系统 crontab 格式(多了用户字段)
# 分 时 日 月 周 用户 命令
$17 * * * * root cd / && run-parts --report /etc/cron.hourly
$25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
$47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
$52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# 系统 cron 目录
$/etc/cron.hourly/ # 每小时执行的脚本
$/etc/cron.daily/ # 每天执行的脚本
$/etc/cron.weekly/ # 每周执行的脚本
$/etc/cron.monthly/ # 每月执行的脚本
# 查看系统cron目录内容
$ls -la /etc/cron.daily/
$ls -la /etc/cron.weekly/

⏱️ systemd Timers 现代调度

systemd Timers是什么?

官方定义: 根据systemd官方文档,systemd timers是一种基于systemd服务管理器的定时器单元,用于在特定时间或时间间隔触发systemd服务的执行。它提供了比传统cron更精确的时间控制、更好的依赖管理和更完善的日志记录功能

生活化类比: systemd timers就像一个智能项目管理系统

  • 项目经理 = systemd管理器,统一协调所有任务
  • 项目计划 = timer单元文件,定义任务的执行时间
  • 具体任务 = service单元文件,定义要执行的具体工作
  • 任务依赖 = 依赖关系管理,确保前置任务完成后再执行
  • 进度报告 = journald日志,详细记录每个任务的执行情况
  • 资源分配 = cgroups控制,合理分配系统资源
  • 应急预案 = 故障恢复机制,任务失败时自动重试

systemd Timers核心优势

精确时间控制

  • 单调时间支持:基于系统启动时间的相对时间,不受系统时间调整影响
  • 实时时间支持:基于墙上时钟时间,支持传统的日期时间调度
  • 随机延迟功能:支持随机延迟执行,避免多个任务同时启动造成系统负载峰值

强大依赖管理

  • 服务依赖控制:可以依赖其他systemd服务的状态,确保执行环境就绪
  • 资源限制集成:集成cgroups资源限制,防止任务消耗过多系统资源
  • 故障处理机制:支持失败重试和故障恢复,提高任务执行的可靠性

完善日志集成

  • journald无缝集成:任务执行日志自动记录到systemd journal,便于查看和分析
  • 详细状态跟踪:可以查看任务执行历史、状态变化和性能指标
  • 丰富调试支持:提供详细的调试信息,便于问题排查和性能优化

🛠️ 实践练习2:创建systemd Timer

让我们创建一个完整的systemd timer示例,学习现代化的任务调度方法。

步骤1:创建要执行的脚本

请登录以使用远程命令功能
# 创建一个简单的系统状态检查脚本
$sudo mkdir -p /usr/local/bin
$cat <<EOF | sudo tee /usr/local/bin/system-check.sh(多行命令)
#!/bin/bash
# 系统状态检查脚本
$LOG_FILE="/var/log/system-check.log"
$DATE=\$(date '+%Y-%m-%d %H:%M:%S')
$echo "[\$DATE] 开始系统检查" >> \$LOG_FILE
# 检查磁盘使用率
$DISK_USAGE=\$(df / | awk 'NR==2 {print \$5}' | sed 's/%//')
$echo "[\$DATE] 根分区使用率: \${DISK_USAGE}%" >> \$LOG_FILE
# 检查内存使用率
$MEM_USAGE=\$(free | grep Mem | awk '{printf "%.0f", \$3/\$2 * 100.0}')
$echo "[\$DATE] 内存使用率: \${MEM_USAGE}%" >> \$LOG_FILE
# 检查系统负载
$LOAD_AVG=\$(uptime | awk -F'load average:' '{print \$2}' | awk -F',' '{print \$1}' | tr -d ' ')
$echo "[\$DATE] 系统负载: \$LOAD_AVG" >> \$LOG_FILE
$echo "[\$DATE] 系统检查完成" >> \$LOG_FILE
$EOF
# 设置脚本执行权限
$sudo chmod +x /usr/local/bin/system-check.sh

步骤2:创建systemd服务单元

请登录以使用远程命令功能
# 创建服务单元文件
$cat <<EOF | sudo tee /etc/systemd/system/system-check.service(多行命令)
>[Unit]
>Description=System Status Check Service
>Documentation=man:systemd.service(5)
>[Service]
>Type=oneshot
>ExecStart=/usr/local/bin/system-check.sh
>User=root
>Group=root
>StandardOutput=journal
>StandardError=journal
>[Install]
>WantedBy=multi-user.target
>EOF

步骤3:创建systemd定时器单元

请登录以使用远程命令功能
# 创建定时器单元文件
$cat <<EOF | sudo tee /etc/systemd/system/system-check.timer(多行命令)
>[Unit]
>Description=System Status Check Timer
>Documentation=man:systemd.timer(5)
>Requires=system-check.service
>[Timer]
# 每10分钟执行一次(用于测试,实际使用可以设置更长间隔)
$OnCalendar=*:0/10
$Persistent=true
$RandomizedDelaySec=60
$[Install]
$WantedBy=timers.target
$EOF

步骤4:启用和管理定时器

请登录以使用远程命令功能
# 重新加载systemd配置
$sudo systemctl daemon-reload
# 启用定时器(开机自启)
$sudo systemctl enable system-check.timer
# 启动定时器
$sudo systemctl start system-check.timer
# 查看定时器状态
$systemctl status system-check.timer
# 查看所有定时器
$systemctl list-timers
# 手动测试服务
$sudo systemctl start system-check.service
# 查看执行日志
$journalctl -u system-check.service -f

systemd Timer时间格式详解

systemd timer支持多种时间格式,比cron更加灵活和强大。

OnCalendar时间格式

格式示例说明
简写格式daily, weekly, monthly预定义的常用时间
完整格式*-*-* 02:00:00年-月-日 时:分:秒
星期格式Mon *-*-* 09:00:00指定星期几
范围格式Mon..Fri *-*-* 09:00:00工作日范围
BASH
# 常用OnCalendar时间格式示例
OnCalendar=daily              # 每天午夜执行
OnCalendar=weekly             # 每周一午夜执行
OnCalendar=monthly            # 每月1号午夜执行
OnCalendar=*-*-* 02:00:00     # 每天凌晨2点
OnCalendar=Mon *-*-* 09:00:00 # 每周一上午9点
OnCalendar=*-*-01 03:00:00    # 每月1号凌晨3点
OnCalendar=Mon..Fri *-*-* 09:00:00  # 工作日上午9点
OnCalendar=*-*-* 09,12,15:00:00     # 每天9点、12点、15点

相对时间格式

BASH
# 相对时间格式示例
OnBootSec=15min               # 系统启动15分钟后执行
OnStartupSec=30min            # systemd启动30分钟后执行
OnActiveSec=1h                # 定时器激活1小时后执行
OnUnitActiveSec=2h            # 服务单元激活2小时后执行
 
# 时间单位说明
# s, sec, second, seconds - 秒
# m, min, minute, minutes - 分钟
# h, hr, hour, hours - 小时
# d, day, days - 天
# w, week, weeks - 周
# month, months - 月
# y, year, years - 年

时间格式验证: 使用 systemd-analyze calendar 命令可以验证时间格式:

BASH
systemd-analyze calendar "Mon..Fri *-*-* 09:00:00"
systemd-analyze calendar daily

📝 Bash 脚本自动化

Bash自动化脚本是什么?

官方定义: 根据Bash官方文档,Bash脚本是一种使用Bash shell语言编写的可执行文件,通过组合系统命令、控制结构和函数来自动化执行复杂的系统管理任务,是Linux自动化运维的基础工具

生活化类比: Bash脚本就像一个智能助手的工作清单

  • 工作清单 = 脚本文件,记录所有要执行的任务
  • 执行步骤 = 脚本命令,按顺序完成每个操作
  • 条件判断 = if语句,根据不同情况采取不同行动
  • 循环处理 = for/while循环,重复执行相似任务
  • 错误处理 = 异常捕获,遇到问题时的应对措施
  • 工作报告 = 日志记录,记录工作完成情况

🛠️ 实践练习3:编写系统监控脚本

让我们创建一个实用的系统监控脚本,学习Bash自动化编程。

步骤1:创建基础监控脚本

请登录以使用远程命令功能
# 创建脚本目录
$sudo mkdir -p /usr/local/bin/monitoring
# 创建系统监控脚本
$cat <<'EOF' | sudo tee /usr/local/bin/monitoring/system_monitor.sh
#!/bin/bash
# 系统监控自动化脚本
# 作者: easylearning团队
# 版本: 1.0
# 脚本配置部分
$LOG_FILE="/var/log/system_monitor.log"
$HOSTNAME=$(hostname)
$DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 监控阈值设置(可根据实际情况调整)
$CPU_THRESHOLD=80 # CPU使用率阈值(百分比)
$MEMORY_THRESHOLD=85 # 内存使用率阈值(百分比)
$DISK_THRESHOLD=90 # 磁盘使用率阈值(百分比)
# 创建日志目录
$sudo mkdir -p $(dirname $LOG_FILE)
# 日志记录函数
$log_message() {
$ echo "[$DATE] $1" | sudo tee -a $LOG_FILE
$}
# 开始监控检查
$log_message "=== 开始系统监控检查 ==="
# CPU使用率检查
$echo "检查CPU使用率..."
$CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1 | cut -d',' -f1)
$log_message "CPU使用率: ${CPU_USAGE}%"
$if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
$ log_message "警告: CPU使用率过高 (${CPU_USAGE}% > ${CPU_THRESHOLD}%)"
# # 记录高CPU进程
$ log_message "高CPU使用率进程:"
$ ps aux --sort=-%cpu | head -6 | sudo tee -a $LOG_FILE
$fi
# 内存使用率检查
$echo "检查内存使用率..."
$MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100.0}')
$log_message "内存使用率: ${MEM_USAGE}%"
$if [ $MEM_USAGE -gt $MEMORY_THRESHOLD ]; then
$ log_message "警告: 内存使用率过高 (${MEM_USAGE}% > ${MEMORY_THRESHOLD}%)"
# # 记录高内存进程
$ log_message "高内存使用率进程:"
$ ps aux --sort=-%mem | head -6 | sudo tee -a $LOG_FILE
$fi
# 磁盘空间检查
$echo "检查磁盘空间..."
$df -h | awk 'NR>1 && $1!="tmpfs" {
$ usage = substr($5, 1, length($5)-1)
$ if (usage > '$DISK_THRESHOLD') {
$ print "警告: " $6 " 磁盘空间不足 (" $5 " 已使用)"
$ }
$}' | while read line; do
$ if [ -n "$line" ]; then
$ log_message "$line"
$ fi
$done
$log_message "=== 系统监控检查完成 ==="
$echo "监控完成,详细信息请查看: $LOG_FILE"
$EOF
# 设置脚本执行权限
$sudo chmod +x /usr/local/bin/monitoring/system_monitor.sh

步骤2:测试脚本执行

请登录以使用远程命令功能
# 手动执行脚本测试
$sudo /usr/local/bin/monitoring/system_monitor.sh
# 查看执行结果
$sudo cat /var/log/system_monitor.log
# 检查脚本是否正常工作
$echo "如果看到监控数据,说明脚本工作正常"

步骤3:将脚本集成到定时任务

请登录以使用远程命令功能
# 方法1:使用cron定时执行(每10分钟检查一次)
$crontab -e
# 添加以下行:
# */10 * * * * /usr/local/bin/monitoring/system_monitor.sh
# 方法2:使用systemd timer(推荐)
# 创建systemd服务
$cat <<EOF | sudo tee /etc/systemd/system/system-monitor.service(多行命令)
>[Unit]
>Description=System Monitor Service
>Documentation=Custom system monitoring script
>[Service]
>Type=oneshot
>ExecStart=/usr/local/bin/monitoring/system_monitor.sh
>User=root
>StandardOutput=journal
>StandardError=journal
>EOF
# 创建systemd定时器
$cat <<EOF | sudo tee /etc/systemd/system/system-monitor.timer(多行命令)
>[Unit]
>Description=System Monitor Timer
>Requires=system-monitor.service
>[Timer]
>OnCalendar=*:0/10 # 每10分钟执行一次
>Persistent=true
>[Install]
>WantedBy=timers.target
>EOF
# 启用并启动定时器
$sudo systemctl daemon-reload
$sudo systemctl enable system-monitor.timer
$sudo systemctl start system-monitor.timer
# 查看定时器状态
$systemctl list-timers system-monitor.timer

脚本编写最佳实践

  • 使用绝对路径引用所有命令和文件
  • 添加详细的注释说明脚本功能
  • 实现错误处理和日志记录
  • 设置合理的阈值和告警机制
  • 定期测试脚本的执行效果

🤔 思考题

  1. 场景设计题:如果你管理一个包含50台服务器的集群,如何设计一套完整的自动化运维方案?
  2. 工具选择题:在什么情况下应该选择systemd timer而不是cron?各自的优势是什么?
  3. 集成应用题:如何将本节学习的自动化技术与前面的监控和日志管理结合起来?
  4. 故障处理题:自动化脚本执行失败时,应该如何设计故障恢复和通知机制?

📚 扩展阅读

官方文档

进阶学习

  • Infrastructure as Code: 学习Terraform等基础设施即代码工具
  • CI/CD流水线: 了解Jenkins、GitLab CI等持续集成工具
  • 容器编排: 学习Kubernetes等容器编排平台的自动化特性

实践练习

通过实际操作来巩固所学知识,在真实的系统化的训练环境中练习本教程的内容。

Linux 自动化运维 - cron、systemd timers 与 Ansible - 实践练习

待学习
ID: LINUX_05_AUTOMATION
未登录
训练服务器:
训练内容:

基于 Linux 自动化运维 - cron、systemd timers 与 Ansible 教程的实践练习