当前位置: 首页 > java >正文

Linux虚拟机ansible部署

Linux虚拟机ansible部署

一、自动化与 Linux 系统管理:为什么要学习自动化运维?

手动运维是传统 IT 管理的主流方式,但在规模化、标准化场景下存在不可忽视的痛点,而自动化运维正是解决这些问题的核心方案。

1. 手动运维的核心痛点

传统运维依赖 “图形界面 / 命令行 + 检查清单 / 记忆”,具体问题包括:

  • 高出错率:人工操作易遗漏步骤(如配置防火墙时忘记开放端口)、执行错误命令(如批量修改配置时少写参数),且错误排查难度大。
  • 低效率:重复性任务耗时久,例如 “批量给 100 台服务器安装 Nginx”,手动操作需逐台 SSH 连接、执行命令,可能花费数小时;自动化仅需几分钟。
  • 难验证:手动操作后,需逐台检查结果(如确认服务是否启动、配置是否生效),缺乏统一的结果校验机制,易留下隐患。
  • 无追溯:操作过程无标准化记录,后续出现问题时,无法快速定位 “谁在何时做了什么操作”。

2. 自动化运维的核心价值

自动化运维通过 “代码化、标准化” 解决上述问题,对系统管理员的实际意义包括:

  • 一致性保障:确保所有目标机器的配置、部署步骤 100% 一致(如所有 Web 服务器的 Nginx 配置完全相同),避免 “一台正常、一台故障” 的差异问题。
  • 效率提升:将重复性任务(如系统初始化、软件部署、日志清理)自动化,例如用 1 个脚本完成 100 台机器的初始化,管理员可专注于架构设计、故障排查等核心工作。
  • 可追溯与可回滚:自动化操作的步骤(如 Playbook)可存入 Git 版本控制,操作记录可审计;若出现问题,可通过历史版本快速回滚。

二、什么是 Ansible?

Ansible 是一款开源自动化运维平台,旨在简化 IT 基础设施的配置管理、应用部署、任务编排等工作,其核心特性可从 “本质、能力、架构” 三方面理解。

1. 本质:简单的自动化框架

  • 技术基础:基于 Python 开发,核心依赖paramiko库(Python 实现的 SSH 协议客户端,为无代理通信提供支持)。
  • 核心定位:Ansible 本身不直接实现 “批量部署”,而是提供一个模块化框架—— 通过调用不同功能的 “模块”(如yum模块安装软件、copy模块传输文件)完成具体任务,用户只需通过 “Playbook” 定义 “要做什么”,无需关心 “怎么做”。
  • 归属:2015 年被红帽(Red Hat)收购,目前是红帽开源生态的核心自动化工具,兼容性与稳定性有官方保障。

2. 核心能力:覆盖全生命周期自动化

Ansible 可应用于 IT 基础设施的多个场景:

  • 配置管理:批量标准化系统配置(如设置时区、关闭 SELinux、配置 SSH 密钥)。
  • 应用部署:从代码拉取到服务启动的全流程自动化(如从 Git 拉取 Java 项目→编译→部署到 Tomcat→启动服务)。
  • 任务编排:按顺序执行多步骤任务(如先部署数据库→再部署 Web 服务→最后配置负载均衡)。
  • 网络自动化:管理网络设备(如 Cisco、Huawei 交换机的 VLAN 配置、路由规则下发)。

3. 架构:无代理(Agentless)设计

Ansible 的核心优势之一是无需在被管节点安装客户端(Agent),其通信与任务执行流程如下:

  1. 控制主机(Controller):安装 Ansible 的机器(通常是 Linux 系统,Windows 需借助 WSL 或 Linux 虚拟机),是自动化任务的发起端。

  2. 通信协议:默认通过OpenSSH(Linux/Unix)或WinRM(Windows)与被管节点建立连接(无需额外配置 Agent)。

  3. 任务执行流程

    • 控制主机将所需的 “Ansible 模块”(如yum模块)通过 SSH 推送到被管节点;
    • 被管节点执行模块(如安装软件),将执行结果返回给控制主机;
    • 任务完成后,被管节点自动删除推送的模块,无残留文件。

三、Ansible 的核心优点

Ansible 之所以成为主流自动化工具,源于其 6 个关键优势,且每个优势都对应明确的运维场景:

优点分类核心解读实际应用场景
跨平台支持无代理覆盖 Linux、Windows、Unix 及网络设备(如 Cisco、Juniper),适配物理机、虚拟机、云(AWS/Azure)、容器(Docker/K8s)环境1. 管理混合架构:同时运维 AWS EC2(Linux)、企业内网 Windows Server、华为交换机; 2. 容器环境:通过 Ansible 批量启动 Docker 容器并配置网络。
人类可读的自动化Playbook 基于 YAML 语法编写,结构清晰、语义易懂,非开发人员也能快速理解一个 “安装 Nginx” 的 Playbook 片段(语义直观): yaml<br>- name: 安装Nginx服务 # 任务描述(人类可直接理解)<br> yum: # 用yum模块<br> name: nginx # 安装的软件名<br> state: present # 确保软件已安装<br>
完美描述应用环境所有配置、部署步骤均通过 Playbook “代码化”,可完整记录应用环境的每一个细节开发环境与生产环境的一致性保障:将生产环境的 Nginx 配置、Java 版本、数据库连接信息全部写入 Playbook,开发环境执行相同 Playbook 即可复现生产环境。
轻松管理版本控制Playbook 是纯文本文件,可直接存入 Git、SVN 等版本控制系统1. 版本回溯:若 Playbook 更新后出现问题,可通过 Git 回滚到上一个稳定版本; 2. 团队协作:多人共同维护 Playbook 时,通过 Git 提交记录追踪谁修改了什么。
支持动态清单可通过脚本 / API 从外部系统(如 AWS EC2、OpenStack、企业 CMDB)动态获取被管节点列表,无需手动维护静态清单AWS 场景:使用 Ansible 官方提供的ec2.py脚本,自动获取当前运行中的 EC2 实例 IP,无需手动添加到清单文件;当实例扩容 / 缩容时,清单自动更新。
易与其他系统集成可对接现有运维工具链,无需替换已有系统1. 与 Jenkins 集成:Jenkins 构建完成后,触发 Ansible Playbook 部署应用; 2. 与 Puppet 集成:保留 Puppet 的配置管理功能,用 Ansible 实现跨工具的任务编排。

四、Ansible 的管理方式

Ansible 采用 “中心控制 + 无代理节点” 的管理架构,核心由 “控制主机” 和 “被管节点” 组成,通过 “清单(Inventory)” 实现分组管理。

1. 核心架构组成

  • 控制主机(Controller Node):

    • 唯一需要安装 Ansible 的机器(需 Python 2.7/3.5 + 环境);
    • 负责编写 Playbook、发起自动化任务、接收被管节点的执行结果。
  • 被管节点(Managed Node):

    • 无需安装 Ansible,仅需满足:
      1. Linux/Unix 节点:开启 SSH 服务,控制主机可通过 SSH 免密登录(推荐配置 SSH 密钥);
      2. Windows 节点:开启 WinRM 服务,配置 PowerShell 3.0 + 环境;
    • 被动接收控制主机的任务指令,执行后返回结果。

2. 清单(Inventory):节点分组管理

清单是 Ansible 识别被管节点的 “地址簿”,用于将节点按功能 / 环境分组,支持静态清单(INI/YAML 格式)和动态清单(脚本 / API)。

示例:静态清单
# 分组1:Web服务器(包含2个节点)
[webservers]
192.168.1.101  # 节点1
192.168.1.102  # 节点2# 分组2:数据库服务器(包含1个节点,指定SSH端口)
[dbservers]
192.168.1.201 ansible_ssh_port=2222  # 非默认22端口时需指定# 分组3:所有节点(通过:children包含子分组)
[all:children]
webservers
dbservers
清单的核心作用
  • 批量操作:对某个分组执行任务,例如 “给 webservers 分组的所有节点安装 Nginx”;
  • 差异化配置:为不同分组设置不同参数(如 dbservers 节点的内存检查阈值高于 webservers)。

3. 核心管理流程

  1. 控制主机编写 Playbook(定义 “要做什么”,如安装软件、修改配置);
  2. 控制主机通过 Inventory 确认被管节点列表及分组;
  3. 控制主机通过 SSH/WinRM 连接被管节点,推送所需模块;
  4. 被管节点执行模块,返回执行结果(成功 / 失败 + 详细日志);
  5. 控制主机汇总所有节点的结果,输出最终报告。

五、ansible系统架构

在这里插入图片描述

组件名称核心职责关键特性 / 示例
1. 核心引擎(Ansible Core)整个架构的 “大脑”,负责解析指令、调度组件(模块、插件、Playbook)、管理执行流程无需在被控主机安装 Agent,通过连接插件与被控端通信;自动处理任务并发(默认 5 个)
**2. 核心模块(Core Modules) **实现 “具体管理操作” 的最小单元,相当于 “预定义的运维命令”Ansible 自带(约 2000 + 个),覆盖常见场景: - ping:测试被控主机连通性 - copy:向被控端传输文件 - yum/apt:安装软件包 - service:管理系统服务(如启动 nginx)
3. 自定义模块(Custom Modules)补充核心模块的功能缺口,满足企业个性化运维需求支持 Python/Shell 等语言开发,例如: - 企业内部 “数据库备份脚本” 封装为模块 - 自定义硬件设备(如交换机)的配置模块
4. 插件(Plugins)扩展 Ansible 的 “辅助功能”,不直接执行管理任务,仅提供支撑能力按功能分类,常见类型: - 日志插件:记录任务执行日志到文件 / ELK - 通知插件:任务执行后发邮件 / 短信(如mail插件) - 过滤插件:在 Playbook 中处理变量(如格式化日期)
5. 剧本(Playbooks)按 “逻辑顺序” 组合多个模块的 “任务清单”,采用 YAML 格式编写,用于 “例行 / 复杂操作”支持变量、条件判断、循环、模板(Jinja2),相当于 “运维脚本”: - 例:一个 Playbook 包含 “安装 nginx→配置 nginx→启动服务”3 个任务
6. 连接插件(Connection Plugins)实现 “Ansible 核心” 与 “被控主机” 的通信,是两者的 “桥梁”默认使用ssh插件(基于 SSH 协议),也支持其他协议: - paramiko:兼容旧版 SSH 协议的主机 - winrm:管理 Windows 主机(替代 SSH)
7. 主机清单(Host Inventory)记录 “Ansible 可控制的所有主机信息”,是 Ansible 识别被控端的 “地址簿”支持静态清单(文本文件)和动态清单(脚本 / API 拉取,如从云平台拉取主机);可对主机分组(如按 “Web 服务器组”“数据库组”)

ad-hoc****模式( 点对点模式)

使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

playbook****模式( 剧本模式)

是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

六、ansible工作原理

在这里插入图片描述

七、虚拟机安装

三、ansible部署

1、安装RHEL9版本虚拟机

(用的VMware)

创建新的虚拟机
在这里插入图片描述

选择自定义配置
在这里插入图片描述
稍后在本地安装操作系统
在这里插入图片描述

选择linux系统
在这里插入图片描述请添加图片描述

自定义虚拟机存放位置

在这里插入图片描述

处理器最好4核起步

请添加图片描述

内存看电脑配置

在这里插入图片描述

网络用nat

请添加图片描述

磁盘类型用scsi

在这里插入图片描述

不要用物理磁盘那会真的占用电脑磁盘
请添加图片描述

选择镜像文件ISO文件地址

请添加图片描述

勾上虚拟化
在这里插入图片描述

选择第一个开始下载操作系统

在这里插入图片描述

语言自定义

在这里插入图片描述

调整时区为亚洲上海

在这里插入图片描述
在这里插入图片描述

分区

在这里插入图片描述

选择自定义分区
在这里插入图片描述

选择Standard Partition标准分区

按图进行分区 /可自定义大小
在这里插入图片描述

关闭KDUMP

在这里插入图片描述
在这里插入图片描述

设置root用户和普通用户账号密码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

普通用户必须为student

在这里插入图片描述

开始下载
在这里插入图片描述

在这里插入图片描述

下载完后重启系统

在这里插入图片描述

重启后使用root账号登录

打开命令终端设置主机名和网

[root@localhost ~]# hostnamectl hostname ansible.example.com   
//与centos7命令不太一样
[root@localhost ~]# bash[root@ansible ~]# nmcli connection show 
NAME    UUID                                  TYPE      DEVICE 
lo      29c3f4a3-7b01-4e63-8475-ae52fe4a676e  loopback  lo     
ens160  47f86174-2763-3fec-911c-e723a12bbae6  ethernet  --  [root@ansible ~]# nmcli connection delete ens160 
Connection 'ens160' (47f86174-2763-3fec-911c-e723a12bbae6) successfully deleted.[root@ansible ~]# nmcli connection add con-name ens160 ifname ens160 type ethernet 
Connection 'ens160' (9ddfaba9-c6aa-4325-99c8-564448d2168c) successfully added.   
[root@ansible ~]# nmcli connection modify ens160 ipv4.addresses 192.168.100.100/24 ipv4.gateway 192.168.100.254 ipv4.dns 8.8.8.8 ipv4.method manual connection.autoconnect yes [root@ansible ~]# nmcli connection up ens160 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10)[root@ansible ~]# nmcli connection show 
NAME    UUID                                  TYPE      DEVICE 
ens160  9ddfaba9-c6aa-4325-99c8-564448d2168c  ethernet  ens160 
lo      29c3f4a3-7b01-4e63-8475-ae52fe4a676e  loopback  lo     

配置yum仓库

[root@ansible ~]# cd /etc/yum.repos.d/[root@ansible yum.repos.d]# ls[root@ansible yum.repos.d]# mount /dev/cdrom /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.[root@ansible yum.repos.d]# find / -name repodata
/mnt/AppStream/repodata
/mnt/BaseOS/repodata
//查询repodata文件地址[root@ansible yum.repos.d]# vim server.repo[aaa]
name=aaa
baseurl=file:///mnt/BaseOS
gpgcheck=0
enabeld=1[bbb]
name=bbb
baseurl=file:///mnt/AppStream
gpgcheck=0
enabled=1[root@ansible yum.repos.d]# 

安装软件包组

[root@ansible yum.repos.d]# yum -y group install "Virtualization Client" "Virtualization Hypervisor" "Virtualization Tools" 
//启动服务
[root@ansible yum.repos.d]# systemctl restart libvirtd
[root@ansible yum.repos.d]# systemctl enable libvirtd

修改ssh配置文件使root用户可以被远程登录

[root@ansible ~]# vim /etc/ssh/sshd_configPermitRootLogin yes[root@ansible ~]# systemctl restart sshd
[root@ansible ~]# systemctl enable sshd

将本地RHEL9.2镜像上传到虚拟机

virt-manager打开虚拟监视器进行安装系统

[root@ansible ~]# virt-manager 

在这里插入图片描述

选择本地安装创建虚拟机

在这里插入图片描述

点击Browse Local本地浏览
在这里插入图片描述

双击镜像
在这里插入图片描述

分配内存
在这里插入图片描述

分配硬盘容量
在这里插入图片描述

勾上选项
在这里插入图片描述

开始安装

在这里插入图片描述

设定成最小安装

在这里插入图片描述在这里插入图片描述

分区

在这里插入图片描述

修改网络

在这里插入图片描述
在这里插入图片描述

修改主机名
在这里插入图片描述

输入root密码时勾上这个选项即可不用配置ssh文件进行远程登录root
在这里插入图片描述

其他操作和前面一样
在这里插入图片描述

克隆master做node1到node5
在这里插入图片描述

修改克隆出来的master名字改为对应的node的名字并修改网卡
在这里插入图片描述

删除uuid修改IP地址防止冲突
在这里插入图片描述

重启网卡服务
在这里插入图片描述

所有node改完后在master上测试IP连通性
在这里插入图片描述

编写hosts域名

[root@master ~]# vi /etc/hosts

在这里插入图片描述

实现ssh免密码

生成密钥

[root@master ~]# ssh-keygen 
//密码为空

使用root账号给所有student账号和root账号的node发送生成的密钥

[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub student@node1
[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
........................
[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub student@node5
[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node5

在使用student账号生成密钥

[root@master ~]# su - student
[student@master ~]$ ssh-keygen 

重复发送密钥的操作

[student@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub student@node1
[student@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
........................
[student@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub student@node5
[student@master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@node5

将hosts文件发给所有node主机

[root@master ~]# for i in node{1..5}
> do scp /etc/hosts root@$i:/etc/hosts
> done
hosts                                      100%  437   592.7KB/s   00:00    
hosts                                      100%  437   784.2KB/s   00:00    
hosts                                      100%  437   693.1KB/s   00:00    
hosts                                      100%  437   519.2KB/s   00:00    
hosts                                      100%  437   460.0KB/s   00:00 

自制网络源

在ansible中安装httpd服务

将包文件上传到/var/www/html/目录下,然后重启httpd服务

关闭selinux和防火墙

在master主机中部署yum仓库

[root@master yum.repos.d]# vi server.repo
baseos]
name=aa1
baseurl=http://ansible.example.com/rhel9/BaseOS
enabled=1
gpgcheck=0[appstream]
name=aa2
baseurl=http://ansible.example.com/rhel9/AppStream
enabled=1
gpgcheck=0[ansible]
name=aa3
baseurl=http://ansible.example.com/ansible-automation-platform
enabled=1
gpgcheck=0

安装配件测试

[root@master yum.repos.d]# yum -y install vim bash-completion net-tools

student用户权限委派

[root@master yum.repos.d]# vim /etc/sudoers.d/studentstudent         ALL=(ALL)       NOPASSWD:ALL

把文件发送给node主机使node主机也能student用户权限委派

[root@master yum.repos.d]# for  i  in  node{1..5}
do  scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/ 
> done
student                          100%   32    54.6KB/s   00:00    
student                          100%   32    66.1KB/s   00:00    
student                          100%   32    48.8KB/s   00:00    
student                          100%   32    48.7KB/s   00:00    
student                          100%   32    55.5KB/s   00:00    
[root@master yum.repos.d]# 

使用student用户下载ansible

[root@master yum.repos.d]# su - student
[student@master ~]$ sudo yum -y  install   ansible-core   ansible-navigator

配置文件

[student@master ~]$ mkdir ansible
[student@master ~]$ cd ansible/
[student@master ansible]$ vim /etc/ansible/ansible.cfg 
//里面默认为空
//提示了如何生成出来 ansible-config init --disabled > ansible.cfg

在ansible目录中使用这条命令

[student@master ansible]$ ansible-config init --disabled > ansible.cfg
[student@master ansible]$ ls
ansible.cfg

创建inventory文件和roles,collections目录

[student@master ansible]$ vim inventory
[student@master ansible]$ mkdir roles
[student@master ansible]$ mkdir collections

配置ansible.cfg文件

[student@master ansible]$ vim ansible.cfg 
//搜索inventory取消注释并修改
inventory=/home/student/ansible/inventory
// Ansible 的一个核心配置,用于指定默认的主机清单(inventory)文件路径。//搜索remote_user取消注释并修改
remote_user=student
// Ansible 中用于指定连接远程主机时默认使用的 SSH 用户名的配置。搜索host_key_checking取消注释并修改为
host_key_checking=False
//禁用 SSH 主机密钥检查//搜索collections_path
collections_path=/home/student/ansibile/collections//搜索privilege取消注释并修改
# (boolean) Toggles the use of privilege escalation, allowing you to 'become' another user after login.
become=True
//启用特权升级功能。设置为 True 后,Ansible 会在登录远程主机(使用 remote_user 指定的用户)后,尝试切换到 become_user 指定的用户。
# (boolean) Toggle to prompt for privilege escalation password.
become_ask_pass=False
//控制是否提示输入特权升级的密码。
# (string) Privilege escalation method to use when `become` is enabled.
become_method=sudo
//指定特权升级的方式。
# (string) The user your login/remote user 'becomes' when using privilege escalation, most systems will use 'root' when no user is specified.
become_user=root
//指定特权升级后要切换到的目标用户。
http://www.xdnf.cn/news/18829.html

相关文章:

  • OSPF 的工作过程、Router ID 机制、报文结构
  • Axios多实例封装
  • 产品运营必备职场通用能力及提升攻略,一文说明白
  • Kafa面试经典题--Kafka为什么吞吐量大,速度快
  • 字帖生成器怎么用?电脑手机双端操作指南
  • 【图像算法 - 24】基于深度学习与 OpenCV 实现人员跌倒识别系统(目标检测方案 - 跌倒即目标)
  • 如何在PC上轻松访问iPhone照片(已解决)
  • 【LeetCode - 每日1题】求对角线最长矩形的面积
  • WebSocket实时通信系统——js技能提升
  • 系统架构设计师备考第7天——网络协议中间件软件构件
  • 计算机网络:天气预报
  • Vue3 + Element Plus实现表格多行文本截断与智能Tooltip提示
  • 论文阅读 2025-8-26 一些半监督学习的工作
  • 04. 鸿蒙_获取app缓存大小和清除缓存
  • iOS 开发中的 UIStackView 使用详解
  • 飞算JavaAI:Java开发新时代的破晓之光
  • 【软考论文】论面向对象建模方法(动态、静态)
  • Go函数详解:从基础到高阶应用
  • 数据结构:单向链表的逆置;双向循环链表;栈,输出栈,销毁栈;顺序表和链表的区别和优缺点;0825
  • Java的四种优化资源密集型任务的策略
  • 每日一题——力扣498 对角线遍历
  • CentOS 部署 Prometheus 并用 systemd 管理
  • Mistral AI音频大模型Voxtral解读
  • 初识神经网络——《深度学习入门:基于Python的理论与实现》
  • QT(1)
  • 【STM32】CubeMX(十二):FreeRTOS消息队列
  • THM Rabbit Hole
  • COREDUMP
  • Life:Internship in OnSea Day 64
  • java基础(十五)计算机网络