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),其通信与任务执行流程如下:
-
控制主机(Controller):安装 Ansible 的机器(通常是 Linux 系统,Windows 需借助 WSL 或 Linux 虚拟机),是自动化任务的发起端。
-
通信协议:默认通过OpenSSH(Linux/Unix)或WinRM(Windows)与被管节点建立连接(无需额外配置 Agent)。
-
任务执行流程
:
- 控制主机将所需的 “Ansible 模块”(如
yum
模块)通过 SSH 推送到被管节点; - 被管节点执行模块(如安装软件),将执行结果返回给控制主机;
- 任务完成后,被管节点自动删除推送的模块,无残留文件。
- 控制主机将所需的 “Ansible 模块”(如
三、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,仅需满足:
- Linux/Unix 节点:开启 SSH 服务,控制主机可通过 SSH 免密登录(推荐配置 SSH 密钥);
- Windows 节点:开启 WinRM 服务,配置 PowerShell 3.0 + 环境;
- 被动接收控制主机的任务指令,执行后返回结果。
- 无需安装 Ansible,仅需满足:
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. 核心管理流程
- 控制主机编写 Playbook(定义 “要做什么”,如安装软件、修改配置);
- 控制主机通过 Inventory 确认被管节点列表及分组;
- 控制主机通过 SSH/WinRM 连接被管节点,推送所需模块;
- 被管节点执行模块,返回执行结果(成功 / 失败 + 详细日志);
- 控制主机汇总所有节点的结果,输出最终报告。
五、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
//指定特权升级后要切换到的目标用户。