Ansible 环境配置(基于 RHEL 9)
一、Ansible 概述
1. 核心定义与功能
- 定位:开源自动化运维工具,基于 Python 开发,采用无代理架构,通过 SSH/WinRM 实现远程主机管理。
- 核心功能:批量系统配置、程序部署、命令执行、配置管理、工作流 / 网络自动化,支持应用全生命周期编排。
- 优势:跨平台无代理、YAML 剧本易读、支持版本控制、动态清单、可与 Jenkins / 红帽卫星等工具集成。
2. 核心组成结构
|--------------------|-------------------------------|
| 组件 | 功能描述 |
| Core Modules | Ansible 自带模块,覆盖系统管理、软件部署等基础场景 |
| Custom Modules | 用户自定义扩展模块,补充核心模块功能缺口 |
| Plugins | 扩展功能(如日志记录、邮件通知) |
| Playbooks | YAML 格式剧本,定义主机需执行的任务与模块 |
| Connection Plugins | 连接远程主机的插件,默认使用 SSH |
| Host Inventory | 主机清单,记录受管主机的 IP、端口、密码等信息 |
3. 执行模式
- Ad-hoc(点对点模式):单条命令快速执行(如批量 ping 主机、安装软件)。
- Playbook(剧本模式):通过 YAML 文件定义复杂任务流,为主要管理方式。
二、环境部署前置准备(RHEL 9)
1. 基础环境规划
|-----------|--------------------------------------------------------------------------|----------------------------------------------------|---------------------|
| 主机角色 | 主机名 | IP 地址 | 用途 |
| 控制节点(树主机) | ansible.example.com | 192.168.100.100(与物理机通信)、192.168.122.1(与 KVM 虚拟机通信) | 部署 Ansible,管理所有被控节点 |
| 被控节点 | master.example.com | 192.168.122.100 | 主被控节点,用于批量分发配置 |
| 被控节点 | node1.example.com | 192.168.122.10 | 克隆节点 1 |
| 被控节点 | node2.example.com | 192.168.122.20 | 克隆节点 2 |
| 被控节点 | node3.example.com | 192.168.122.30 | 克隆节点 3 |
| 被控节点 | node4.example.com | 192.168.122.40 | 克隆节点 4 |
| 被控节点 | node5.example.com | 192.168.122.50 | 克隆节点 5 |
2. 控制节点(ansible.example.com)基础配置
(1)配置 IP 与主机名
# 1. 配置网卡 IP(192.168.100.100/24)
nmcli connection modify ens160 ipv4.addresses 192.168.100.100/24 ipv4.gateway 192.168.100.254 ipv4.dns 114.114.114.114 ipv4.method manual connection.autoconnect yes
nmcli connection up ens160
# 2. 修改主机名
hostnamectl hostname ansible.example.com
(2)配置本地 YUM 源
-
创建 YUM 配置文件:
vim /etc/yum.repos.d/server.repo
-
写入以下内容(RHEL 9 分 BaseOS 与 AppStream 仓库):
[aa]
name=aa1
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[bb]
name=bb1
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
-
挂载系统镜像到 /mnt:
mount /dev/cdrom /mnt # 若需开机自动挂载,可添加到 /etc/fstab
(3)安装 KVM 相关工具(用于创建被控节点虚拟机)
# 安装虚拟化工具组
yum -y group install "Virtualization Client" "Virtualization Hypervisor" "Virtualization Tools"
# 重启并设置 libvirtd 服务开机自启
systemctl restart libvirtd
systemctl enable libvirtd
(4)允许 root 远程 SSH 登录
# 编辑 SSH 配置文件
vim /etc/ssh/sshd_config
# 修改以下参数
PermitRootLogin yes
# 重启 SSH 服务
systemctl restart sshd
systemctl enable sshd
(5)将RHEL 9.2 镜像上传到树主机中
三、被控节点(虚拟机)创建与配置
1. 创建 master 虚拟机
- 通过 virt-manager 图形工具创建虚拟机:
-
- 镜像选择 RHEL 9.2 系统镜像;
-
- 创建 root 用户并勾选 "允许 root SSH 登录";
-
- 创建普通用户 student;
-
- 配置 IP 为 192.168.122.100,主机名为 master.example.com。
2. 克隆 node1-node5 虚拟机
-
在 virt-manager 中右键克隆 master 虚拟机,共克隆 5 台(命名为 node1-node5);
-
分别配置每台节点的 IP 与主机名(以 node1 为例):
1. 修改主机名
hostnamectl set-hostname node1.example.com
2. 编辑网卡配置文件(删除 UUID,修改 IP)
vi /etc/NetworkManager/system-connections/enp1s0.nmconnection
修改内容:
ipv4.addresses=192.168.122.10/24
删除 uuid 字段(避免冲突)
3. 重启网络
nmcli connection NetworkManager
nmcli connection up enp1s0
按上述步骤配置 node2-node5,IP 分别为 192.168.122.20/30/40/50。
四、跨主机通信与权限配置
1. 配置主机名解析(控制节点与被控节点)
(1)控制节点(ansible)配置 hosts
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)分发 hosts 文件到所有被控节点
# 1. 发送到 master
scp /etc/hosts root@master:/etc/hosts
# 2. 从 master 批量发送到 node1-node5
ssh root@master "for i in node{1..5}
>do scp /etc/hosts root@\$i:/etc/hosts
>done"
2. 配置 SSH 免密登录(root 与 student 用户)
(1)master 节点生成密钥并分发(root 用户)
# 1. 登录 master 并生成密钥(一路回车默认即可)
ssh root@master
ssh-keygen
# 2. 分发公钥到 node1-node5(root 用户)
for i in node{1..5}
>do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i
>done
# 3. 分发公钥到 node1-node5(student 用户)
for i in node{1..5}
>do ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i
>done
(2)master 节点 student 用户配置免密
# 1. 切换到 student 用户
su - student
# 2. 生成密钥
ssh-keygen
# 3. 分发公钥到 node1-node5(root 与 student)
for i in node{1..5}
>do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i
>done
for i in node{1..5}
>do ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i
>done
3. 配置普通用户 sudo 提权(所有被控节点)
(1)在 master 节点创建 sudo 配置文件
vim /etc/sudoers.d/student
# 添加以下内容(允许 student 免密执行所有命令)
student ALL=(ALL) NOPASSWD: ALL
(2)分发 sudo 配置到 node1-node5
for i in node{1..5}; do
scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/
done
五、Ansible 服务部署与配置
1. 控制节点(ansible)配置网络 YUM 源
(1)安装 httpd 服务并部署 YUM 源文件
# 1. 安装 httpd
yum -y install httpd
# 上传 ansible-automation-platform 相关包到/var/www/html/
# 3. 重启 httpd 并设置开机自启
systemctl restart httpd
systemctl enable httpd
# 4. 关闭防火墙与 SELinux(避免端口拦截)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
(2)被控节点(master/node1-node5)配置网络 YUM 源
# 1. 登录 master 编辑 YUM 配置
ssh student@master
vim /etc/yum.repos.d/server.repo
# 2. 写入以下内容(指向控制节点的 httpd 源)
[aa]
name=aa1
baseurl=http://ansible.example.com/rhel9/BaseOS
enabled=1
gpgcheck=0
[cc]
name=cc1
baseurl=http://ansible.example.com/rhel9/AppStream
enabled=1
gpgcheck=0
[dd]
name=dd1
baseurl=http://ansible.example.com/ansible-automation-platform
enabled=1
gpgcheck=0
# 3. 安装基础工具(vim、命令补全)
sudo yum -y install vim bash-completion net-tools
# 4. 也可以将YUM 配置分布到 node1-node5
for i in node{1..5}; do
scp /etc/yum.repos.d/server.repo student@$i:/etc/yum.repos.d/
ssh student@$i "sudo yum -y install vim bash-completion net-tools"
done
2. 安装 Ansible(master 节点,student 用户)
# 1. 切换到 student 用户
su - student
# 2. 安装 ansible 核心组件
sudo yum -y install ansible-core ansible-navigator
3. 配置 Ansible(master 节点,student 用户)
(1)创建 Ansible 工作目录
#因为我们的ansible目录下没有以上的一些目录和文件
#需要创建(在/home/student/ansible目录下):
cd /home/student/ansible
主机清单:
touch inventory
角色目录:
mkdir roles
模块目录:
mkdir collections
(2)生成并编辑 Ansible 配置文件
# 1. 生成默认配置文件(--disabled 表示注释所有默认配置)(在/home/student/ansible目录下执行)
ansible-config init --disabled > ansible.cfg
# 2. 编辑配置文件(vim ansible.cfg),修改以下关键参数
[inventory]
inventory = /home/student/ansible/inventory # 主机清单路径
[defaults]
remote_user = student # 远程执行用户
roles_path = /home/student/ansible/roles # 角色目录
host_key_checking = False # 关闭 SSH 主机密钥检查
collections_path = /home/student/ansible/collections # 集合目录
[privilege_escalation]
become = True # 开启提权
become_ask_pass = False # 提权无需密码
become_method = sudo # 提权方式(sudo)
become_user = root # 提权目标用户(root)
(3)配置主机清单(inventory 文件)
vim /home/student/ansible/inventory
# 写入以下内容
node1
node2
node3
node4
node5
六、环境验证
在 master 节点的 ansible 工作目录下,执行 ping 测试(验证所有节点连通性):
cd /home/student/ansible
ansible all -m ping

- 若所有节点返回 SUCCESS,表示 Ansible 环境配置成功;
- 若失败,检查 SSH 免密、hosts 解析、sudo 提权配置是否正确。