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

  |   0 评论   |   0 浏览

大家好,欢迎回到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 的基本使用和虚拟机管理。敬请期待!


练习建议

  1. 使用 <span leaf="">crontab</span> 设置一个每天凌晨3点执行的脚本,输出当前时间到 <span leaf="">/tmp/date.log</span>
  2. 编写 Ansible inventory 文件,列出你本地的几个虚拟机(或使用 localhost),并用 <span leaf="">ping</span> 模块测试连通性。
  3. 编写一个简单的 Playbook,在本地创建一个用户,并设置其家目录。
  4. 尝试用 Ansible 的 <span leaf="">file</span> 模块在远程主机上创建一个目录,并用 <span leaf="">copy</span> 模块将本地文件复制过去。

往期文章:

RHCE认证考试学习笔记(十):Shell脚本编程

RHCE认证考试学习笔记(九):文件系统与存储管理

RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线

RHCE工程师认证学习笔记(七):网络配置与管理

RHCE认证学习笔记(六):软件包管理 – 从RPM到YUM仓库

RHCE认证学习笔记(五):进程管理与服务控制

RHCE认证学习笔记(四):用户管理与权限控制

RHCE认证学习笔记(三):重定向、管道与正则表达式

RHCE认证学习笔记(二):文件操作与Vim编辑器

RHCE认证考试学习笔记(一):Linux基础入门


标题:RHCE认证考试学习(十一):计划任务与Ansible自动化
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/26/1774505056911.html