RHCE认证考试学习(十一):计划任务与Ansible自动化

大家好,欢迎回到RHCE9学习笔记系列。在前十篇文章中,我们从Linux基础命令开始,逐步深入到文件操作、用户权限、进程管理、软件包、网络配置、防火墙、存储管理以及Shell脚本编程。可以说,我们已经掌握了单机运维的必备技能。但在实际工作中,我们往往需要管理成百上千台服务器,重复性的操作如果还靠手动执行,不仅效率低下,还容易出错。今天,我们将学习两种提升效率的利器:计划任务 与Ansible自动化 。
计划任务让脚本可以在指定时间自动运行,而Ansible则让我们能够同时管理多台服务器。掌握这两项技术,你就能真正步入自动化运维的大门。
1. 一次性计划任务 – at
<span leaf="">at</span> 命令用于在未来的某个时间点执行一次性的任务。适合备份、延迟重启等场景。
1.1 安装与启动
大多数Linux系统默认安装了 <span leaf="">at</span>,如果没有,可以用以下命令安装
dnf install at -ysystemctl enable atd --now
1.2 创建一次性任务
# 交互式创建at 14:30at> /root/backup.shat> <EOT> # 按 Ctrl+D 结束输入# 输出:job 1 at Tue Mar 25 14:30:00 2025
# 也可以使用 echo 管道输入echo "/root/backup.sh" | at 14:30
# 指定日期和时间at 10:00 2025-12-25at now + 2 hoursat 3pm tomorrow
1.3 查看与删除任务
atq # 列出所有等待执行的任务atrm 1 # 删除编号为1的任务
1.4 访问控制
通过 <span leaf="">/etc/at.allow</span> 和 <span leaf="">/etc/at.deny</span> 控制哪些用户可以使用 <span leaf="">at</span>:
- 如果
<span leaf="">at.allow</span>存在,只有列出的用户可用。 - 否则,如果
<span leaf="">at.deny</span>存在,列出的用户不可用。 - 两者都不存在,则只有root可用。
2. 周期性计划任务 – crontab
<span leaf="">crontab</span> 用于设置按固定周期重复执行的任务。例如每天凌晨备份、每小时检查服务状态等。
2.1 crond 服务
systemctl status crond # 通常默认已启动
2.2 crontab 命令
crontab -e # 编辑当前用户的计划任务crontab -l # 列出当前用户的任务crontab -r # 删除所有任务crontab -u username # 管理其他用户的任务(需root)
2.3 crontab 时间格式
每行定义一个任务,格式如下:
* * * * * command│ │ │ │ ││ │ │ │ └─── 星期几(0-7,0和7都代表周日)│ │ │ └───── 月份(1-12)│ │ └─────── 日期(1-31)│ └───────── 小时(0-23)└─────────── 分钟(0-59)
特殊符号 :
<span leaf="">*</span>:任意值<span leaf="">*/n</span>:每隔n单位执行一次(如<span leaf="">*/5 * * * *</span>每5分钟)<span leaf="">,</span>:列举多个值(如<span leaf="">1,15,30 * * * *</span>)<span leaf="">-</span>:范围(如<span leaf="">1-5 * * * *</span>第1到5分钟)
示例 :
# 每天凌晨2点30分执行30 2 * * * /root/backup.sh
# 每周一凌晨1点执行0 1 * * 1 /root/weekly_report.sh
# 每15分钟执行一次*/15 * * * * /opt/check_health.sh
# 每月1号0点执行0 0 1 * * /root/monthly_clean.sh
2.4 系统级计划任务
系统级任务通常放在 <span leaf="">/etc/crontab</span> 或 <span leaf="">/etc/cron.d/</span> 目录下。格式比用户级多一个用户字段:
* * * * * username command
例如 <span leaf="">/etc/crontab</span> 中的示例:
# 每小时执行一次0 * * * * root /usr/bin/logrotate /etc/logrotate.conf
2.5 常用目录
系统还提供了快捷目录,将脚本放入其中即可定时执行:
<span leaf="">/etc/cron.hourly/</span><span leaf="">/etc/cron.daily/</span><span leaf="">/etc/cron.weekly/</span><span leaf="">/etc/cron.monthly/</span>
例如,每天自动执行的脚本可以放在 <span leaf="">/etc/cron.daily/</span> 并赋予执行权限。
3. Ansible 自动化运维入门
Ansible 是一款基于 Python 的开源自动化工具,其最大的特点是无代理(agentless),通过 SSH 直接管理远程主机,无需在被管理节点上安装额外软件。它采用声明式的 YAML 语言编写剧本(playbook),易学易用。
3.1 核心概念
- 控制节点(Control Node) :安装了 Ansible 的主机,用于下发任务。
- 被管理节点(Managed Node) :被 Ansible 管理的服务器,只需 SSH 服务。
- Inventory :定义被管理主机的文件。
- Module :Ansible 执行的具体任务单元(如
<span leaf="">copy</span>、<span leaf="">yum</span>、<span leaf="">service</span>)。 - Playbook :一组 play 的集合,每个 play 定义了针对哪些主机执行哪些任务。
3.2 安装 Ansible
在 RHEL 9 中,可以通过 EPEL 仓库安装:
dnf install epel-release -ydnf install ansible -y
验证安装:
ansible --version
3.3 配置 Inventory 文件
Inventory 文件定义了被管理主机的列表,可以按组分类。默认路径为 <span leaf="">/etc/ansible/hosts</span>,也可以自定义。
# 示例 inventory[web]web1.example.comweb2.example.com
[db]db1.example.comdb2.example.com
[all:children]webdb
支持主机范围简写:
[web]web[01:10].example.com
3.4 ansible.cfg 配置文件
Ansible 的配置文件按优先级:<span leaf="">ANSIBLE_CONFIG</span> 环境变量 > 当前目录下的 <span leaf="">ansible.cfg</span> > 用户家目录下的 <span leaf="">.ansible.cfg</span> > <span leaf="">/etc/ansible/ansible.cfg</span>。
常用配置项(在 <span leaf="">[defaults]</span> 段):
inventory = /path/to/inventory # 指定默认 inventoryremote_user = ansible # SSH 登录用户ask_pass = false # 不提示 SSH 密码(用密钥)host_key_checking = False # 不检查主机密钥
提权配置(<span leaf="">[privilege_escalation]</span>):
become = true # 启用提权become_method = sudo # 提权方式become_user = root # 提权到 rootbecome_ask_pass = false # 不提示 sudo 密码
3.5 免密登录配置
为了让 Ansible 能够 SSH 连接到被管理节点,需要配置密钥认证:
# 生成密钥对(如果还没有)ssh-keygen -t rsa
# 将公钥复制到被管理节点ssh-copy-id root@web1.example.com
3.6 ad-hoc 命令
ad-hoc 是临时执行的命令,用于快速操作。格式:
ansible <host-pattern> -m <module> -a "<module-args>" -i <inventory>
常用模块示例 :
# 测试连通性ansible web -m ping
# 在被管理节点上执行命令ansible web -m command -a "uptime"
# 安装软件ansible web -m dnf -a "name=httpd state=present"
# 启动服务ansible web -m service -a "name=httpd state=started enabled=yes"
# 复制文件ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"
# 创建用户ansible web -m user -a "name=deploy state=present"
3.7 Playbook 编写
Playbook 是 YAML 格式的文件,扩展名为 <span leaf="">.yml</span> 或 <span leaf="">.yaml</span>。一个 Playbook 可以包含多个 play,每个 play 指定主机、任务等。
基本结构 :
---- name: 第一个 Play hosts: web become: yes tasks: - name: 安装 httpd dnf: name: httpd state: present
- name: 启动 httpd service: name: httpd state: started enabled: yes
- name: 第二个 Play hosts: localhost tasks: - name: 测试连接 uri: url: http://web1.example.com status_code: 200
执行 Playbook:
ansible-playbook site.yml
3.8 变量与事实
- 变量 :可以在 Playbook、Inventory、命令行中定义,用
<span leaf="">{{ variable }}</span>引用。 - 事实(facts) :Ansible 自动收集的被管理节点信息,如 IP、操作系统、内存等。
- hosts: web vars: package_name: httpd tasks: - name: 安装 {{ package_name }} dnf: name: "{{ package_name }}" state: present
- name: 显示主机名 debug: msg: "主机名是 {{ ansible_hostname }}"
3.9 循环与条件
循环 :使用 <span leaf="">loop</span> 关键字
- name: 安装多个软件包 dnf: name: "{{ item }}" state: present loop: - httpd - nginx - mariadb-server
条件 :使用 <span leaf="">when</span>
- name: 只在 CentOS 上执行 command: /usr/bin/centos-special when: ansible_distribution == "CentOS"
3.10 实战示例:使用 Playbook 部署 Web 服务
假设我们需要在多台服务器上部署 Nginx,并配置自定义首页。
目录结构 :
deploy-web/├── ansible.cfg├── inventory├── site.yml└── files/ └── index.html
ansible.cfg :
[defaults]inventory = inventoryremote_user = ansiblehost_key_checking = False
[privilege_escalation]become = truebecome_method = sudobecome_user = root
inventory :
[web]web1.example.comweb2.example.com
site.yml :
---- name: 部署 Web 服务 hosts: web tasks: - name: 安装 Nginx dnf: name: nginx state: present
- name: 复制首页文件 copy: src: files/index.html dest: /usr/share/nginx/html/index.html owner: root group: root mode: '0644'
- name: 启动并启用 Nginx service: name: nginx state: started enabled: yes
- name: 放行 HTTP 服务(如果防火墙开启) firewalld: service: http permanent: yes immediate: yes state: enabled when: ansible_facts['firewalld'] is defined
执行:
ansible-playbook site.yml
4. 总结
本篇我们学习了两种实现自动化的关键技术:
- 计划任务 :使用
<span leaf="">at</span>执行一次性任务,用<span leaf="">crontab</span>安排周期性任务,适合备份、监控、清理等场景。 - Ansible :无代理的自动化工具,通过 SSH 管理多台主机。我们了解了 Inventory 定义、ad-hoc 命令、Playbook 编写、变量、循环、条件等核心概念。
计划任务让脚本定时运行,Ansible 让命令批量执行。结合两者,你就能搭建起一套高效的自动化运维体系:用 Ansible 批量配置服务器,再用 cron 定期检查状态、收集日志、执行备份,极大减少人工干预。
下一篇,我们将进入 RHEL 9 虚拟化 的探索,学习 KVM 的基本使用和虚拟机管理。敬请期待!
练习建议 :
- 使用
<span leaf="">crontab</span>设置一个每天凌晨3点执行的脚本,输出当前时间到<span leaf="">/tmp/date.log</span>。 - 编写 Ansible inventory 文件,列出你本地的几个虚拟机(或使用 localhost),并用
<span leaf="">ping</span>模块测试连通性。 - 编写一个简单的 Playbook,在本地创建一个用户,并设置其家目录。
- 尝试用 Ansible 的
<span leaf="">file</span>模块在远程主机上创建一个目录,并用<span leaf="">copy</span>模块将本地文件复制过去。
往期文章:
RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线
RHCE认证学习笔记(六):软件包管理 – 从RPM到YUM仓库
标题:RHCE认证考试学习(十一):计划任务与Ansible自动化
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/26/1774505056911.html