Ansible自动化运维:原理以及安装教程
目录
Linux Ansible:作用与原理详解
一、Ansible 的核心作用
1. 配置管理(Configuration Management)
2. 应用部署(Application Deployment)
3. 任务编排(Orchestration)
4. 其他扩展作用
二、Ansible 的核心原理
1. 架构组成:核心组件
2. 核心流程:任务执行步骤
3. 关键特性:为什么选择 Ansible?
ansible部署
1,安装RHEL9版本虚拟机
1.1 配置IP信息,时区,用户,分区等
分区大小:
1.2 安装完成,将ansibleIP改为192.168.100.100
2、配置本地yum源,在/etc/yum.repos.d/目录下新建server.repo,然后配置。
repodata在AppStream和BaseOS下
3、安装软件包组
4,添加node,添加ansible的文件
4.1打开管理器
4.2 用fz将镜像传到root用户下,但是需要先开启远程连接
4.3 设置可以远程连接
5,创建五台node
Vrit-manager
先创建一台名为master,其余都克隆
5.2 安装好后配置好IP等信息
5.3 进入系统:克隆其余五台
6,修改每一台的主机名,IP地址以及删除UUID
Virbro桥接和node通信
Ens33和真实机通信
6.1 重启网卡并ping测试是否可以相互通信
7,master为宿主机,其余五台为虚拟机
7.1 为了方便通信,ansible将所有的IP地址和域名写入 /etc/hosts,然后把文件内容发送给每一台虚拟机。
先将文件传给master,然后通过master批量发送给每一台虚拟机,发送之前先做免密钥
7.2 编辑/etc/hosts,并方式送给master
7.3 配置master主机的免密钥登录
在master将/etc/hosts文件都发给所有主机
8,配置yum仓库
在宿主机ansible中配置本地yum仓库,然后安装httpd服务
将包文件上传到/var/www/html/目录下,然后重启httpd服务,并设置下次启动生效
关闭防火墙,selinux
8.1 在ansible主机中部署yum仓库
8.2 测试安装 三个工具包
9,student用户提权(管理ansible时用普通用户管理,所以需要对student用户提权)
10,安装ansible(用student管理)
11,配置ansible
11.1 定义主机清单位置
修改文件:
1,定义执行命令的对象
2,student用户来管理ansible
打开远程登录
3,创建roles目录,定义目录路径
4,开放ssh远程登录验证
5,定义ansible模块存放路径
创建collections目录
[student@master ansible]$mkdir collections
6,student用户做了Linux的权限委派,但是没做ansible,开启四个
7,测试
单个测试:
[student@master ansible]$ansible node1
测试所有
[student@master ansible]$ansible all -m ping
Linux Ansible:作用与原理详解
Ansible 是一款基于 Python 开发的开源自动化工具,专为 Linux(及 Unix 类系统、Windows)环境设计,核心目标是简化服务器运维中的重复性工作,实现 “自动化部署、配置管理、任务编排” 三大核心场景。它无需在目标主机安装客户端(Agentless),凭借 SSH 协议(或 WinRM 协议 for Windows)即可实现对多台主机的批量管控,是 DevOps 流程中不可或缺的工具之一。
一、Ansible 的核心作用
Ansible 围绕 “自动化运维” 展开,可覆盖从单主机配置到复杂集群部署的全场景,具体作用可分为以下 4 类:
1. 配置管理(Configuration Management)
批量标准化主机配置,确保多台主机的软件、文件、服务状态一致,避免 “人工配置不一致” 导致的运维隐患。
- 典型场景:
- 批量安装 / 卸载软件(如在 100 台主机上安装 Nginx、MySQL)。
- 统一配置文件(如同步
/etc/nginx/nginx.conf
到所有 Web 服务器,确保配置一致)。- 管理系统服务(如批量启动 / 停止 / 设置开机自启 Docker、Redis 服务)。
- 配置系统参数(如调整内核参数
sysctl.conf
、设置防火墙规则iptables
)。2. 应用部署(Application Deployment)
自动化应用发布流程,减少人工操作(如上传代码、执行编译、重启服务)的失误,提高部署效率。
- 典型场景:
- 从 Git 仓库拉取代码到目标主机的 Web 根目录(如
/var/www/html
)。- 自动化编译打包(如对 Java 项目执行
mvn package
,生成 Jar 包后部署到 Tomcat)。- 滚动更新应用(如先更新 1 台测试机,验证无误后批量更新所有生产机,避免服务中断)。
3. 任务编排(Orchestration)
按 “顺序 / 依赖关系” 执行多步复杂任务,实现跨主机、跨服务的协同自动化(如集群部署)。
- 典型场景:
- 部署 Kubernetes 集群:先初始化 Master 节点,再将 Node 节点加入集群,最后部署网络插件(如 Calico)。
- 数据库主从同步配置:先配置主库(开启二进制日志、创建同步账号),再配置从库(设置主库地址、启动同步进程)。
- 多服务联动启动:先启动数据库,再启动缓存服务,最后启动 Web 应用(确保服务依赖顺序正确)。
4. 其他扩展作用
- 批量命令执行:无需登录每台主机,直接批量运行命令(如
ansible web -m command -a "free -h"
查看所有 Web 主机内存使用情况)。- 云资源管理:通过插件对接 AWS、阿里云、华为云等,自动化创建 / 删除 EC2 实例、云硬盘等资源。
- 日志 / 监控集成:与 ELK(日志)、Prometheus(监控)联动,自动化配置日志采集、监控指标上报规则。
二、Ansible 的核心原理
Ansible 采用 “控制节点(Control Node)+ 目标节点(Managed Nodes) ” 的架构,核心是 “无客户端、基于模块、通过 Playbook 编排”,具体原理可拆解为 5 个关键环节:
1. 架构组成:核心组件
Ansible 的架构极简,仅需在 “控制节点” 安装 Ansible,目标节点无需任何额外软件(依赖系统自带的 SSH 服务),核心组件如下:
组件 作用 控制节点(Control Node) 安装 Ansible 的主机(通常是运维人员的工作机或专门的运维服务器),负责发起自动化任务。 目标节点(Managed Nodes) 被管控的服务器(如 Web 服务器、数据库服务器),需开启 SSH 服务并允许控制节点免密登录。 Inventory(主机清单) 配置文件(默认路径 /etc/ansible/hosts
),定义 “目标节点的分组、IP / 域名、SSH 端口” 等信息,Ansible 仅对清单中的主机生效。模块(Modules) Ansible 执行具体任务的 “工具单元”(如 yum
模块安装软件、copy
模块同步文件、service
模块管理服务),内置超 2000 个模块,支持自定义。Playbook(剧本) 基于 YAML 语法的配置文件,将 “多个模块按顺序 / 逻辑” 组合成 “任务集”,实现复杂流程的自动化(如 “安装 Nginx → 配置文件 → 启动服务”)。 SSH 协议 控制节点与目标节点的通信载体,默认通过 SSH 远程执行命令(目标节点需开启 SSH,推荐配置控制节点免密登录,避免每次输入密码)。 2. 核心流程:任务执行步骤
Ansible 执行自动化任务的流程可概括为 “准备 → 解析 → 执行 → 反馈” 四步,具体如下:
步骤 1:准备 Inventory 与认证
- 运维人员在控制节点定义
Inventory
,将目标节点按业务分组(如[web]
组包含所有 Web 服务器,[db]
组包含数据库服务器)。- 配置控制节点到目标节点的 SSH 免密登录(通过
ssh-keygen
生成密钥,ssh-copy-id
分发公钥到目标节点),避免任务执行中频繁输入密码。步骤 2:解析任务指令(Ad-hoc 或 Playbook)
- Ansible 支持两种任务发起方式,控制节点会先解析指令:
- Ad-hoc 命令:单条临时命令(如批量查看主机磁盘使用情况),格式:
ansible <主机组> -m <模块> -a <模块参数>
。
示例:ansible web -m shell -a "df -h /"
(查看web
组所有主机的根目录磁盘使用)。- Playbook 剧本:复杂任务的 YAML 文件(如部署 Nginx),通过
ansible-playbook <剧本名.yml>
执行,Ansible 会解析 YAML 中的 “主机组、任务列表、模块参数”。步骤 3:生成临时执行脚本并推送
- Ansible 不会在目标节点留存任何文件,而是在控制节点动态生成 “临时 Python 脚本”(由模块逻辑转换而来)。
- 通过 SSH 协议将临时脚本推送到目标节点的临时目录(默认
/tmp/ansible-xxx/
),并赋予执行权限。步骤 4:目标节点执行脚本并返回结果
- 目标节点通过 SSH 执行临时脚本,完成具体任务(如安装软件、修改配置)。
- 执行完成后,目标节点删除临时脚本(避免残留),并将 “执行结果”(成功 / 失败、输出日志)通过 SSH 回传至控制节点。
步骤 5:控制节点展示结果
- 控制节点将所有目标节点的执行结果按 “颜色 + 格式” 汇总展示(绿色:成功且无变更;黄色:成功且有变更;红色:失败),便于运维人员快速排查问题。
3. 关键特性:为什么选择 Ansible?
Ansible 的原理设计决定了它的核心优势,也是其广泛应用的原因:
- Agentless(无客户端):目标节点无需安装任何软件,降低部署成本和系统侵入性,尤其适合已上线的生产环境。
- 幂等性(Idempotency):同一任务重复执行多次,结果一致(如 “安装 Nginx” 任务,第一次执行会安装,后续执行仅检查是否已安装,不重复操作),避免重复执行导致的异常。
- 声明式语法(Playbook):通过 YAML 描述 “最终要达到的状态”(如 “Nginx 服务必须启动”),而非 “具体执行步骤”,简化脚本编写。
- 模块化扩展:内置模块覆盖绝大多数运维场景,同时支持 Python 自定义模块,可适配企业个性化需求(如对接内部运维平台)。
一、自动化与linux系统管理(为什么要学习自动化运维)
大多系统管理和基础架构管理都依赖于通过图形或者命令行用户界面执行的手动任务,系统管理员通常使用检查清单、其他文档或者记忆的例程来执行标准任务,这样的做法容易出错,系统管理员很容易跳过某个步骤或者错误的执行某个步骤,对步骤执行是否正确或者产生的预期的结果的验证通常有限。
自动化可以帮助我们避免手动管理系统和基础架构造成的问题。作为系统管理员,我们可以使用它来确保快速、正确地部署和配置所有系统。这样,我们可以自动执行日常计划中的重复性任务,从而空出时间并专注于更重要的事情。
二,什么是ansible
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是一款开源自动化平台,它是一种简单的自动化语言,能够在ansible playbook中完美地描述IT应用基础架构。它也是一个自动化引擎,可运行ansible playbook。
Ansible功能很强大,可以利用ansible部署应用,也可将它用于配置管理、工作流自动化和网络自动化。Ansible可以用于编排整个应用生命周期。
Ansible围绕无代理架构构建。通常而言,ansible通过OpenSSH或WinRM连接它所管理的主机并且运行任务,方法通常是(但不总是)将称为ansible模块的小程序推送至这些主机。这些程序用于将系统置于需要的特定状态。在ansible运行完其任务后,推送的所有模块都会被删除。
Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购
三,ansible优点
跨平台支持:ansible提供Linux、windows、unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
人类可读的自动化:ansible playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。
完美描述应用:可以通过ansible playbook进行每一种更改,并描述和记录应用环境的每一个方面。
轻松管理版本控制:ansible playbook和项目是纯文本,它们可以视作源代码,放在您的现有版本控制系统中。
支持动态清单:可以从外部来源动态更新ansible管理的计算机的列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。
编排可与其他系统轻松集成:能够利用环境中现有的HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到您的ansible工作中。
4,ansible管理方式
Ansible是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用SSH进行远程连接。无需在被管节点上安装附加软件,可使用各种编程语言进行扩展。Ansible管理系统由控制主机和一组被管节点组成。控制主机直接通过SSH控制被管节点,被管节点通过 Ansible的资源清单 (inventory)来进行分组管理。
5,ansible系统架构
5,在控制主机时,ansible是如何知道哪些主机是被自己控制的呢?
这就需要一个Host Inventory(主机清单),用于记录ansible可以控制网络中的哪些主机。另外,要配置和管理这些主机,可以采用两种方式,一种是单一的命令实现,另外一种也可以使用palybook实现。单一的命令模式是采用不同的模块进行管理,一个模块类似于一些管理的命令,如top,ls,ping等等,适用于临时性的操作任务。如果需要执行一些例行性或经常性的操作,则需要采用playbook的方式,playbook类似于一个脚本,将多个模块按一定的逻辑关系进行组合,然后执行。ansible还支持一些插件,如邮件、日志等,在和远程主机通信时,也会采用类似的连接插件,这里使用则是SSH协议的插件进行通信。
核心: ansible
Core Modules: ansible自带的模块
Custom Modules: 核心模块功能不足时,用户可以添加扩展模块
Plugins: 通过插件来实现记录日志,发送邮件或其他功能
Playbooks: 剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
Connection Plugins: ansible基于连接插件连接到各个主机上,默认是使用ssh
Host Inventory: 记录由Ansible管理的主机信息,包括端口、密码、ip等
6,ansible任务执行模式
Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:
ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
7,ansible工作流程
ansible部署
1,安装RHEL9版本虚拟机
1.1 配置IP信息,时区,用户,分区等
分区大小:
1.2 安装完成,将ansibleIP改为192.168.100.100
2、配置本地yum源,在/etc/yum.repos.d/目录下新建server.repo,然后配置。
repodata在AppStream和BaseOS下
mount /dev/cdrom /mnt(需要连接一下光驱)
vim /etc/yum.repos.d/server.repo
[aa]
name=aa1
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0[bb]
name=bb1
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
保存退出
3、安装软件包组
yum group install "Virtualization Client" "Virtualization Hypervisor" "Virtualization Tools" -y
##重启libvirtd服务,并设置下次启动生效
Systemctl restart libvirtd
Systemctl enable libvirtd
4,添加node,添加ansible的文件
4.1打开管理器
[root@ansible ~]# virt-manager
4.2 用fz将镜像传到root用户下,但是需要先开启远程连接
4.3 设置可以远程连接
[root@ansible ~]# vim /etc/ssh/sshd_config
5,创建五台node
Vrit-manager
先创建一台名为master,其余都克隆
5.2 安装好后配置好IP等信息
5.3 进入系统:克隆其余五台
6,修改每一台的主机名,IP地址以及删除UUID
Virbro桥接和node通信
Ens33和真实机通信
主机名 | IP地址 |
node1 | 192.168.122.10 |
node2 | 192.168.122.20 |
node3 | 192.168.122.30 |
node4 | 192.168.122.40 |
node5 | 192.168.122.50 |
6.1 重启网卡并ping测试是否可以相互通信
7,master为宿主机,其余五台为虚拟机
7.1 为了方便通信,ansible将所有的IP地址和域名写入 /etc/hosts,然后把文件内容发送给每一台虚拟机。
先将文件传给master,然后通过master批量发送给每一台虚拟机,发送之前先做免密钥
7.2 编辑/etc/hosts,并方式送给master
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[root@ansible~]#scp /etc/hosts root@master:/etc/hosts
[root@ansible~]#ssh root@master
[root@master~]#
7.3 配置master主机的免密钥登录
master分别用root用户和student用户操作做免密钥
ssh-keygen 一直回车到结束
(root用户)
for i in node{1..5}
do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i
donefor i in node{1..5}
do ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i
done
(student用户)
Su - student #切换到student用户,同样生成密钥发送给所有的student和root用户
ssh-keygenkey
for i in node{1..5}
do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i
donefor i in node{1..5}
do ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i
done
在master将/etc/hosts文件都发给所有主机
8,配置yum仓库
在宿主机ansible中配置本地yum仓库,然后安装httpd服务
将包文件上传到/var/www/html/目录下,然后重启httpd服务,并设置下次启动生效
关闭防火墙,selinux
8.1 在ansible主机中部署yum仓库
关闭防火墙以及selinux
yum -y install httpd##通过filez将网络源文件传到ansible的/etc/www/html文件中[root@ansible~]#vi /etc/yum.repos.d/server.repo
[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
8.2 测试安装 三个工具包
[root@master ~]# yum -y install vim bash-completion net-tools
9,student用户提权(管理ansible时用普通用户管理,所以需要对student用户提权)
[root@master ~]#vim /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALLfor i in node{1..5}
do scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/
done
10,安装ansible(用student管理)
##切换到student用户
[root@master~]#su - student
[student@master~]#sudo yum -y install ansible-core ansible-navigator
11,配置ansible
11.1 定义主机清单位置
##在student用户家目录下新建ansible目录
[student@master ~]$ mkdir ansible
[student@master ~]$ cd ansible/
[student@master ansible]$ pwd
/home/student/ansible
[student@master ansible]$ vim /etc/ansible/ansible.cfg ##默认配置文件
[student@master ansible]$ ansible-config init --disabled > ansible.cfg
[student@master ansible]$ ls
ansible.cfg
[student@master ansible]$ vim ansible.cfg
[student@master ansible]$
修改文件:
1,定义执行命令的对象
执行一条命令,对象是受控主机,而受控主机写在主机清单的位置,所以要修改主机清单的位置
//搜索/inventory (主机清单)
因为没有主机清单所以需要创建
[student@master ansible]$vim inventory
2,student用户来管理ansible
打开远程登录
3,创建roles目录,定义目录路径
4,开放ssh远程登录验证
5,定义ansible模块存放路径
创建collections目录
[student@master ansible]$mkdir collections
6,student用户做了Linux的权限委派,但是没做ansible,开启四个
7,测试
单个测试:
[student@master ansible]$ansible node1
测试所有
[student@master ansible]$ansible all -m ping