Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
Ansible 的介绍与安装
一、自动化运维的必要性
传统手动运维依赖图形/命令行界面、检查清单或记忆执行任务,存在以下核心问题:
- 易出错:易跳过步骤或执行错误操作,结果验证有限;
- 效率低:重复性任务占用大量时间,无法聚焦核心工作;
- 一致性差:不同服务器配置易出现差异,影响业务稳定性。
自动化运维可解决上述问题,实现快速、标准化、无差异的系统部署与配置,释放运维人力。
二、什么是 Ansible
Ansible 是基于 Python 开发的开源自动化运维平台,核心能力包括:
- 批量操作:支持批量系统配置、程序部署、命令执行;
- 无代理架构:无需在被管节点安装客户端(Agent),通过 SSH/WinRM 通信;
- 模块化驱动:本身仅提供框架,实际功能由模块实现(核心模块+自定义模块);
- 全生命周期管理:覆盖配置管理、应用部署、工作流编排、网络自动化;
其工作原理:控制主机通过 SSH 推送临时模块到被管节点,执行任务后自动删除模块,确保被管节点清洁。
三、Ansible 核心优点
- 跨平台支持:覆盖 Linux、Windows、Unix 及网络设备,适配物理机、虚拟机、云、容器;
- 易读的自动化脚本:通过 YAML 格式的 Playbook 编写任务,人类可读,便于团队协作;
- 版本控制友好:Playbook 为纯文本文件,可直接纳入 Git 等版本控制系统;
- 动态清单:支持从外部来源(如云平台、CMDB)动态获取被管主机列表,适应架构变化;
- 灵活集成:可与 Puppet、Jenkins、红帽卫星等现有系统集成,复用现有架构。
四、Ansible 管理架构
Ansible 由控制主机和被管节点组成,核心组件如下:
组件 | 作用 |
---|---|
控制主机 | 运行 Ansible 核心程序,发起任务执行(需安装 Ansible,被管节点无需) |
被管节点 | 接收控制主机的任务指令,执行对应操作(仅需支持 SSH,无需安装 Ansible) |
Host Inventory | 主机清单,记录被管节点的 IP、端口、账号等信息,支持分组管理 |
Modules | 任务执行单元(核心模块/自定义模块),如 ping (测试连通性)、yum (安装软件) |
Playbooks | 任务剧本,通过 YAML 组合多个模块,定义被管节点的最终状态(例行任务首选) |
Plugins | 扩展功能,如日志插件(记录执行日志)、邮件插件(任务结果通知) |
Connection Plugins | 连接插件,默认使用 SSH 插件与被管节点通信 |
五、Ansible 任务执行模式
Ansible 提供两种核心执行模式,适配不同场景:
模式 | 特点 | 适用场景 |
---|---|---|
Ad-hoc 模式(点对点) | 单条命令+单个模块,无需保存,执行快速 | 临时性操作(如批量查看磁盘、测试连通性) |
Playbook 模式(剧本) | 多模块按逻辑组合,YAML 格式保存,可重复执行 | 例行性任务(如 Web 服务部署、数据库备份) |
六、Ansible 完整部署流程(RHEL 9)
环境规划
共 6 台 RHEL 9 主机,1 台控制主机(master)+ 5 台被管节点(node1~node5),网络信息如下:
主机名 | IP 地址 | 角色 | 用途 |
---|---|---|---|
master.example.com | 192.168.122.100 | 控制主机 | 运行 Ansible,管理被管节点 |
node1.example.com | 192.168.122.10 | 被管节点 | 测试节点(test01 组) |
node2.example.com | 192.168.122.20 | 被管节点 | 测试节点(test02 组) |
node3.example.com | 192.168.122.30 | 被管节点 | Web 节点(web 组) |
node4.example.com | 192.168.122.40 | 被管节点 | Web 节点(web 组) |
node5.example.com | 192.168.122.50 | 被管节点 | 测试节点(test05 组) |
ansible.example.com | 192.168.122.1 | 宿主机 | 提供 YUM 仓库服务 |
步骤 1:基础环境准备(所有主机)
1.1 安装 RHEL 9 虚拟机
- 安装 1 台 RHEL 9 虚拟机作为“模板机”,配置 IP 后,通过
virt-manager
克隆出 5 台,共 6 台主机; - 注意:克隆后需删除所有主机网卡配置文件的
UUID
(避免冲突),路径:/etc/sysconfig/network-scripts/ifcfg-<网卡名>
(如ifcfg-ens33
)。
1.2 配置主机名与 /etc/hosts
所有主机统一配置 /etc/hosts
,实现主机名解析(无需 DNS):
vim /etc/hosts
# 添加以下内容
192.168.122.1 ansible.example.com ansible
192.168.122.100 master.example.com master
192.168.122.10 node1.example.com node1
192.168.122.20 node2.example.com node2
192.168.122.30 node3.example.com node3
192.168.122.40 node4.example.com node4
192.168.122.50 node5.example.com node5
步骤 2:配置控制主机(master)免密钥登录
Ansible 通过 SSH 通信,需实现 master 到所有被管节点(node1~node5)的免密登录(root + student 用户)。
2.1 生成 SSH 密钥(master 主机)
分别切换 root
和 student
用户,生成密钥(一路回车,不设密码):
# root 用户
[root@master ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:fu+YtSh2VzPILf27GULLWKt/71xihlpGacQABgid3PU root@master.example.com
The key's randomart image is:
+---[RSA 3072]----+
| .+ +.o+.. |
| = .. . o |
| E o |
| . . |
| S .+* |
| . oO.O |
| . ..=B+=.|
| o..Xo+.+=|
| . o=+=..=B|
+----[SHA256]-----+# student 用户(若不存在,先创建:useradd student && passwd student)
[root@master ~]# su - student
[student@master ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/student/.ssh/id_rsa):
/home/student/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/student/.ssh/id_rsa
Your public key has been saved in /home/student/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:N5v5lxQ1PcwK9bqjZllkxr7voQJ8IR8KzdBtYxjaiE4 student@master.example.com
The key's randomart image is:
+---[RSA 3072]----+
| ..+ ..o .|
| ..+o * .=o|
| E o+.o + .oo|
| o . + o *o |
| . S * B. . |
| = B oo |
| * o+.o |
| *..= .|
| o.oooo |
+----[SHA256]-----+
2.2 批量分发公钥(master 主机)
通过循环脚本将公钥分发到所有被管节点:
# 1. root 用户分发到被管节点 root/student
[root@master ~]# for i in node{1..5}; dossh-copy-id -i ~/.ssh/id_rsa.pub root@$i # 免密登录被管节点 rootssh-copy-id -i ~/.ssh/id_rsa.pub student@$i # 免密登录被管节点 student
done# 2. student 用户分发到被管节点 root/student(切换到 student 执行)
su - student
[root@master ~]# for i in node{1..5}; dossh-copy-id -i ~/.ssh/id_rsa.pub root@$issh-copy-id -i ~/.ssh/id_rsa.pub student@$i
done
验证:执行 ssh node1
(root/student 用户),无需输入密码即登录成功。
[root@master ~]# for i in node{1..5}; do scp /etc/hosts root@$i:/etc/hosts; done
hosts 100% 437 520.7KB/s 00:00
hosts 100% 437 700.9KB/s 00:00
hosts 100% 437 472.2KB/s 00:00
hosts 100% 437 141.6KB/s 00:00
hosts 100% 437 660.6KB/s 00:00
步骤 3:配置 YUM 仓库(宿主机 + master)
Ansible 安装依赖自定义 YUM 仓库(宿主机提供源,master 及被管节点使用)。
3.1 宿主机(ansible.example.com)配置仓库
- 挂载 RHEL 9 镜像,安装 Apache 服务:
# 挂载镜像 [root@ansible ~]# mount /dev/cdrom /mnt # 安装 Apache [root@ansible ~]# yum -y install httpd [root@ansible ~]# systemctl restart httpd [root@ansible ~]# systemctl enable httpd # 关闭防火墙与 SELinux [root@ansible ~]# systemctl stop firewalld [root@ansible ~]# systemctl disable firewalld
[root@ansible ~]# setenforce 0
[root@ansible ~]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
- 复制镜像文件到 Apache 根目录(供远程访问):
# 上传 Ansible自动化平台包 BaseOS 与 AppStream源到 /var/www/html/(需提前准备包自行上传)[root@ansible ~]# ls /var/www/html/ansible-automation-platform materials rhel9 roles
3.2 master 主机配置 YUM 仓库
创建 /etc/yum.repos.d/server.repo
,指向宿主机仓库:
[root@master ~]$ vim /etc/yum.repos.d/server.repo[aa]
name=RHEL9 BaseOS
baseurl=http://ansible.example.com/rhel9/BaseOS
enabled=1
gpgcheck=0[cc]
name=RHEL9 AppStream
baseurl=http://ansible.example.com/rhel9/AppStream
enabled=1
gpgcheck=0[dd]
name=Ansible Automation Platform
baseurl=http://ansible.example.com/ansible-automation-platform
enabled=1
gpgcheck=0
验证:执行 yum -y install vim
,确认能正常安装软件。
步骤 4:student 用户提权(所有主机)
Ansible 通常使用普通用户(student)执行任务,需配置 sudo 免密提权:
# master 主机创建提权文件
[root@master ~]# vim /etc/sudoers.d/studentstudent ALL=(ALL) NOPASSWD: ALL
# student 免密执行所有 sudo 命令# 批量分发到所有被管节点
[root@master ~]# [root@master ~]# for i in node{1..5}; do scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/; done
student 100% 32 68.3KB/s 00:00
student 100% 32 61.5KB/s 00:00
student 100% 32 41.3KB/s 00:00
student 100% 32 37.0KB/s 00:00
student 100% 32 52.1KB/s 00:00
步骤 5:安装 Ansible(master 主机)
切换到 student
用户,安装 Ansible 核心组件:
[root@master ~]$ su - student
[student@master ~]$ sudo yum -y install ansible-core ansible-navigator
步骤 6:配置 Ansible(master 主机,student 用户)
在 student
家目录下创建 Ansible 工作目录、主机清单、配置文件。
6.1 创建工作目录
# 新建核心目录
[student@master ansible]$ mkdir -p /home/student/ansible/{inventory,roles,collections}
[student@master ansible]$ cd /home/student/ansible
6.2 定义主机清单(inventory)
按业务分组管理被管节点,编辑 inventory
文件:
[student@master ansible]$ vim inventorynode1
node1
node2
node3
node4
node5
6.3 生成并配置 Ansible 主配置(ansible.cfg)
-
生成默认配置文件:
[student@master ansible]$ ansible-config init --disabled > ansible.cfg
-
编辑配置文件,修改核心参数:
[student@master ansible]$ vim ansible.cfg [defaults] inventory=/home/student/ansible/inventory # 主机清单路径 remote_user=student # 远程执行用户 roles_path=/home/student/ansible/roles # 角色存放路径 host_key_checking=False # 关闭 SSH 主机密钥检查(避免首次登录交互) collections_path=/home/student/ansible/collections # 集合存放路径[privilege_escalation] become=True # 启用权限提升(普通用户→root) become_ask_pass=False # 提升权限不询问密码 become_method=sudo # 提升方式为 sudo become_user=root # 提升到 root 用户
步骤 7:验证 Ansible 环境
执行 ping 模块,测试所有被管节点连通性,成功标志所有节点返回 SUCCESS
,示例如下:
[student@master ansible]$ ansible all -m ping
node5 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
node1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
node4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
node3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
node2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
至此,Ansible 控制主机部署完成,可通过 Ad-hoc 命令或 Playbook 对被管节点执行自动化任务。