Ansible 自动化运维工具:介绍与完整部署(RHEL 9)

Ansible 自动化运维工具:介绍与完整部署(RHEL 9)

Ansible 的介绍与安装

一、自动化运维的必要性

传统手动运维依赖图形/命令行界面、检查清单或记忆执行任务,存在以下核心问题:

  • 易出错:易跳过步骤或执行错误操作,结果验证有限;
  • 效率低:重复性任务占用大量时间,无法聚焦核心工作;
  • 一致性差:不同服务器配置易出现差异,影响业务稳定性。

自动化运维可解决上述问题,实现快速、标准化、无差异的系统部署与配置,释放运维人力。

二、什么是 Ansible

Ansible 是基于 Python 开发的开源自动化运维平台,核心能力包括:

  • 批量操作:支持批量系统配置、程序部署、命令执行;
  • 无代理架构:无需在被管节点安装客户端(Agent),通过 SSH/WinRM 通信;
  • 模块化驱动:本身仅提供框架,实际功能由模块实现(核心模块+自定义模块);
  • 全生命周期管理:覆盖配置管理、应用部署、工作流编排、网络自动化;

其工作原理:控制主机通过 SSH 推送临时模块到被管节点,执行任务后自动删除模块,确保被管节点清洁。

三、Ansible 核心优点

  1. 跨平台支持:覆盖 Linux、Windows、Unix 及网络设备,适配物理机、虚拟机、云、容器;
  2. 易读的自动化脚本:通过 YAML 格式的 Playbook 编写任务,人类可读,便于团队协作;
  3. 版本控制友好:Playbook 为纯文本文件,可直接纳入 Git 等版本控制系统;
  4. 动态清单:支持从外部来源(如云平台、CMDB)动态获取被管主机列表,适应架构变化;
  5. 灵活集成:可与 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):

bash 复制代码
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 主机)

分别切换 rootstudent 用户,生成密钥(一路回车,不设密码):

bash 复制代码
# 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 主机)

通过循环脚本将公钥分发到所有被管节点:

bash 复制代码
# 1. root 用户分发到被管节点 root/student
[root@master ~]# for i in node{1..5}; do
  ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i    # 免密登录被管节点 root
  ssh-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}; do
  ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i
  ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i
done

验证 :执行 ssh node1(root/student 用户),无需输入密码即登录成功。

b 复制代码
[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)配置仓库
  1. 挂载 RHEL 9 镜像,安装 Apache 服务:

    bash 复制代码
    # 挂载镜像
    [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 2. 复制镜像文件到 Apache 根目录(供远程访问): ```ba # 上传 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`,指向宿主机仓库: ```bash [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 免密提权: ```bash # master 主机创建提权文件 [root@master ~]# vim /etc/sudoers.d/student student 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 核心组件: ```bash [root@master ~]$ su - student [student@master ~]$ sudo yum -y install ansible-core ansible-navigator ``` ##### 步骤 6:配置 Ansible(master 主机,student 用户) 在 `student` 家目录下创建 Ansible 工作目录、主机清单、配置文件。 ###### 6.1 创建工作目录 ```bash # 新建核心目录 [student@master ansible]$ mkdir -p /home/student/ansible/{inventory,roles,collections} [student@master ansible]$ cd /home/student/ansible ``` ###### 6.2 定义主机清单(inventory) 按业务分组管理被管节点,编辑 `inventory` 文件: ```bash [student@master ansible]$ vim inventory node1 node1 node2 node3 node4 node5 ``` ###### 6.3 生成并配置 Ansible 主配置(ansible.cfg) 1. 生成默认配置文件: ```bash [student@master ansible]$ ansible-config init --disabled > ansible.cfg ``` 2. 编辑配置文件,修改核心参数: ```bash [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`,示例如下: ```ba [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 对被管节点执行自动化任务。

相关推荐
成都极云科技3 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
溯光笔记3 小时前
服务器内网穿透NPS搭建过程 - 服务端linux服务器 客户端windows系统 - 溯光笔记
linux·服务器·windows
2501_930124704 小时前
Linux之Shell编程(三)流程控制
linux·前端·chrome
我命由我123454 小时前
Word - Word 查找文本中的特定内容
运维·经验分享·笔记·word·运维开发·文档·文本
IDC02_FEIYA5 小时前
服务器托管多少钱一年?服务器托管收费标准
运维·服务器
偶像你挑的噻6 小时前
linux应用开发-嵌入编程基础
linux
偶像你挑的噻6 小时前
linux应用开发-环境构建
linux
key_Go6 小时前
05.《ARP协议基础知识探秘》
运维·服务器·网络·华为·arp
~黄夫人~7 小时前
Nginx Ubuntu vs CentOS 常用命令对照表---详解笔记
运维·笔记·学习·nginx·ubuntu·centos