Ansible入门一:【介绍、安装】
一、简介
Ansible 是一款基于 Python 开发的开源 IT 自动化引擎,由 Michael DeHaan 于 2012 年创建,2015 年被红帽公司收购。它可实现批量系统配置、应用部署、任务编排、云资源管理等功能,属于基础设施即代码(IaC)工具范畴。
核心定位:无代理(Agentless)架构 + 声明式语法 + 轻量级自动化,是当前运维自动化领域市场占有率最高的工具之一,在网络自动化领域覆盖率超过 70%。
二、工作原理与核心架构
2.1 核心架构:无代理(Agentless)设计
-
控制节点(Control Node):安装 Ansible 的机器,负责解析 Playbook、调度任务、管理执行流程
-
受管节点(Managed Node):被管理的目标主机,仅需支持 SSH(Linux/Unix)或 WinRM(Windows)协议即可,无需安装任何额外软件
-
通信协议:默认通过 SSH(默认使用 OpenSSH) 进行所有通信,Windows 则使用 WinRM
这种设计意味着 Ansible 不需要维护后台进程,不占用目标机器的常驻资源,部署和维护成本极低。
2.2 核心组件
| 组件 | 功能说明 |
|---|---|
| Inventory | 主机清单,定义受管节点与分组,支持静态文件(INI/YAML)和动态生成 |
| Modules | 任务执行单元,Ansible 内置 2000+ 模块,负责具体操作的实现 |
| Playbook | 以 YAML 格式编写的任务剧本,描述自动化工作流与目标状态 |
| Plugins | 扩展核心功能的插件,包括连接插件、查找插件、回调插件等 |
| API | 提供编程接口,支持与第三方系统集成 |
2.3 执行流程
Ansible 干活分两层:先做一次全局准备工作,然后每一个具体操作,都完整走一遍「写脚本→发过去→远程跑→收结果→删干净」的循环,全程不用在目标机器上装任何常驻软件。
第一层:全局准备(每组任务只做一次)
你运行一条 Ansible 命令/剧本时,主控机器先做 5 件打底的事:
-
读配置
按优先级找配置文件,确认基础规则:一次同时连多少台机器、SSH 怎么连、角色从哪找、缓存开不开等等。 -
认主机
打开主机清单,搞清楚:要管哪些机器、分成几组、每台机器用什么账号/端口/密钥登录。 -
拆任务
把你写的剧本(YAML文件)从头到尾读一遍,理清楚任务顺序、哪些有条件、哪些要触发、哪些打了标签,排成一条有序的任务流水线。 -
拼参数
把全局、分组、单台机器、剧本、角色里所有的配置参数,按“后写的覆盖先写的、命令行给的最大”的规则合并好,算出每台机器最终用什么参数。 -
摸家底 主机事实收集(默认开启)
在第一个业务任务执行前,自动调用 setup 模块(本身也走完整的任务闭环),采集受管节点的系统信息(操作系统、CPU、内存、网卡等),存入 ansible_facts 变量供后续任务调用。
第二层:单任务循环(每个操作都完整走一遍)
剧本里每一条具体操作(比如装 Nginx、拷文件、改服务),都会独立走完下面 5 步,这就是 Ansible“无代理”的核心原理:
-
在本地拼好脚本
主控机把对应功能的代码(比如装软件的模块、拷文件的模块),加上你给的参数,拼成一个独立完整的 Python 小脚本。
如果是模板文件,也先在主控机渲染成最终配置,一起打包进去。 -
传到目标机器
通过 SSH 连接,把这个小脚本传到目标机器的一个临时文件夹里(默认在用户目录下的.ansible/tmp)。 -
远程本地执行
主控机通过 SSH 调用目标机器上的 Python,直接运行这个脚本。
脚本会先检查现状:已经是你要的状态就啥也不干;不一样才真正执行修改——这就是“幂等性”,重复跑也不会出问题。 -
把结果传回来
脚本跑完,把结果(成功/失败/有没有改动/报错信息)打成一段 JSON 文字,打印到控制台。
主控机通过 SSH 接住这段文字,解析后给你显示成绿/黄/红的状态。 -
删掉临时文件
不管成功失败,主控机立刻通过 SSH 把目标机器上的临时脚本删掉,不留文件、不留后台进程,目标机器像什么都没发生过。
两个关键常识
- 剧本里有多少个任务,就在每台目标机器上重复多少次「发脚本→运行→删脚本」的全过程。
- “重复执行不捣乱”是每个模块自己保证的,像
shell这种直接跑命令的模块,默认没这个能力,要自己写判断。
2.4 并发机制:多进程模型
Ansible 能同时管理成百上千台机器,核心依赖 Python 的 multiprocessing 模块:
-
当需要对 100 台机器执行任务时,Ansible 使用
multiprocessing.Pool(进程池)创建多个子进程(Worker Processes) -
每个子进程负责一小批主机,实现真正的并行 I/O
-
默认并发数由
forks参数控制(默认值为 5,可在ansible.cfg中调大至 50 甚至更高)
同时,Ansible 通过 subprocess 模块调用系统原生的 SSH 客户端(而非 Paramiko 等纯 Python SSH 库),以获得更好的性能和功能支持。
三、优缺点分析
3.1 优势
-
无代理架构:受管端无需安装 Agent,降低部署与维护成本,避免代理版本兼容问题
-
学习门槛低:采用 YAML 声明式语法,接近自然语言,无需深厚编程基础
-
幂等性设计:多数内置模块具备幂等性,重复执行不会产生副作用,确保环境一致性
-
轻量级部署:控制节点仅需 Python 环境即可运行,无数据库、守护进程等依赖
-
跨平台支持:兼容 Linux、Windows、macOS 及主流网络设备,覆盖多云环境
-
生态丰富:Ansible Galaxy 提供大量预构建角色与模块,社区活跃度高
-
安全可靠:基于标准 SSH/WinRM 加密传输,无需开放额外端口
3.2 劣势
-
性能瓶颈:单控制节点并发能力有限,大规模集群(>250台)下执行效率下降明显,SSH 连接开销较大
-
调试难度高:Playbook 执行失败时定位问题较复杂,缺乏完善的分步调试机制
-
Windows 支持较弱:对 Windows 环境的模块覆盖度与稳定性不及 Linux 平台
-
状态管理薄弱:原生不支持持久化状态存储,复杂依赖场景下编排能力有限
-
企业级功能缺失:社区版缺乏 RBAC、审计、凭据管理等治理能力,需付费使用 Ansible Automation Platform
四、常用的自动化运维工具
| 工具名称 | 开发语言 | 描述 |
|---|---|---|
| Ansible | python | 无代理模式,基于ssh协议,适用于中小型应用环境,github关注度63.5k+ |
| Saltstack | python | 有代理,使用前需要部署客户端,但是效率高,github关注度13k+ |
| puppet | ruby | 功能强大,配置复杂,二次开发成本高,适合大型活超大型系统。 |
| Fabric | python | 无代理模式,国内很少使用,文档较少。 |
| Chef | ruby | 国内很少使用,文档较少。 |
有代理:
是指需要再被管理的机器上预先安装客户端软件,类似于C/S架构。
无代理:
是指预先不需要再被管理的机器上做任何操作,只需要被管理机器的远程连接用户名和密码即可。
五、Ansible安装
5.1 ubuntu安装ansible
# 步骤1: 更新系统包列表
在安装任何新的软件包之前,我们首先需要更新Ubuntu的系统包列表。打开终端,输入以下命令
[root@ubt-ans ~]# apt update
Hit:1 https://mirrors.aliyun.com/ubuntu jammy InRelease
Get:2 https://mirrors.aliyun.com/ubuntu jammy-security InRelease [129 kB]
Get:3 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease [128 kB]
Get:4 https://mirrors.aliyun.com/ubuntu jammy-backports InRelease [127 kB]
......
# 步骤2:安装软件源工具
接下来,我们需要安装一个名为'software-properties-common'的包。这个包包含了一些用于管理软件源的脚本。输入以下命令进行安装:
[root@ubt-ans ~]# sudo apt install software-properties-common
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
software-properties-common is already the newest version (0.99.22.9).
software-properties-common set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 96 not upgraded.
......
# 步骤3:添加Ansible的PPA
现在,我们需要添加Ansible的个人软件包存档(PPA)。PPA是Ubuntu用于托管更新和用户特定版本的软件包的地方。输入以下命令:
[root@ubt-ans ~]# sudo add-apt-repository --yes --update ppa:ansible/ansible
Repository: 'deb https://ppa.launchpadcontent.net/ansible/ansible/ubuntu/ jammy main'
....
Hit:3 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease
Hit:4 https://mirrors.aliyun.com/ubuntu jammy-backports InRelease
Get:5 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu jammy InRelease [18.0 kB]
......
# 步骤4:安装Ansible
添加了PPA之后,我们就可以安装Ansible了。输入以下命令:
[root@ubt-ans ~]# apt install ansible
Reading package lists... Done
Building dependency tree... Done
....
Selecting previously unselected package python3-nacl.
Preparing to unpack .../06-python3-nacl_1.5.0-2_amd64.deb ....
Setting up python3-resolvelib (0.8.1-1) ...
......
[root@ubt-ans ~]# ansible --version
ansible [core 2.17.5]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (/usr/bin/python3)
jinja version = 3.0.3
libyaml = True
5.2 二进制安装
# 1 从PPA的网页手动下载.deb文件,然后使用dpkg命令安装从PPA的网页手动下载.deb文件,然后使用dpkg命令安装
wget https://ppa.launchpadcontent.net/ansible/ansible/ubuntu/pool/main/a/ansible/ansible_10.5.0-1ppa~jammy_all.deb
# 2 安装依赖,Ansible软件包依赖于ansible-core,
安装ansible-core:
sudo apt-get install ansible-core
# 3 安装ansible
sudo dpkg -i ansible_10.5.0-1ppa~jammy_all.deb
# 4 解决依赖问题:
如果直接安装ansible-core仍然遇到问题,可以尝试使用apt-get来解决依赖问题:
sudo apt-get install -f
这个命令会尝试修复任何未配置的软件包,并解决依赖问题
# 5 清理和更新:
在安装之前,确保您的软件包列表是最新的,并清理任何可能的残留软件包:
sudo apt-get update
sudo apt-get clean
sudo apt-get autoclean
5.3 centos安装ansible
# 1 pip3安装ansible
安装python3包管理器
yum install -y python3-pip
卸载/tmp/
umount -lf /tmp/
安装ansible #-i 指定源
pip3 install ansible
检查
ansible --version
# 2 yum安装
mkdir -p /root/ansible
yum install --downloadonly --downloaddir=/root/ansible ansible
使用yum包管理器仅下载名为ansible的软件包,而不进行安装,并将下载的RPM文件保存到/root/ansible目录中
cd /root/ansible
tar zcf ansible-2.9.27.tar.gz .
scp给其他机器安装
yum -y localinstall ./*.rpm
ansible --version
六、Ansible使用
6.1 ansible配置文件
- 默认配置文件/etc/ansible/ansible.cfg 没有手动创建mkdir
cat >/etc/ansible/ansible.cfg<<EOF
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python = /usr/bin/python3
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
EOF
- 配置文件解析:
- host_key_checking = False
- 禁用SSH主机密钥检查。这意味着Ansible不会检查目标主机的SSH密钥是否在known_hosts文件中,这可以加快连接速度,但减少了安全性。
- deprecation_warnings = False
- 禁用弃用警告。这将隐藏那些即将在未来版本中被弃用的功能的警告信息。
- interpreter_python = /usr/bin/python3
- 全局设置Ansible使用的Python解释器路径为/usr/bin/python3。这将覆盖Ansible的自动解释器发现机制,始终使用这个指定的解释器。
- [inventory]
- 这个部分是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts。
- [privilege_escalation]
- 这个部分用于配置特权提升相关的设置,如become、become_method等,但在您提供的配置中为空。
- [paramiko_connection]
- 这个部分用于配置使用Paramiko作为后端时的SSH连接设置,但在您提供的配置中为空。
- [ssh_connection]
- 这个部分用于配置SSH连接的设置,如控制密钥交换算法等,但在您提供的配置中为空。
- [persistent_connection]
- 这个部分用于配置持久连接的设置,如连接超时等,但在您提供的配置中为空。
- [accelerate]
- 这个部分用于配置Accelerate模式的设置,这是一种提高Ansible执行速度的方式,通过在目标主机上运行一个代理来减少网络延迟,但在您提供的配置中为空。
- [selinux]
- 这个部分用于配置与SELinux(安全增强型Linux)相关的设置,但在您提供的配置中为空。
- [colors]
- 这个部分用于配置Ansible输出的颜色,如错误、警告、提示等的颜色,但在您提供的配置中为空。
- [diff]
- 这个部分用于配置Ansible在执行任务时显示的差异输出的设置,如always、context等,但在您提供的配置中为空。
- 总的来说,您提供的配置文件中只设置了[defaults]部分的一些基本配置,其他部分都是空的,可以根据需要添加更多的配置选项来控制Ansible的行为。
6.2 前期准备:分发密钥
基于ssh
管理机器分发密钥给被管理机
手动分发密钥:
ssh-keygen
ssh-copy-id root@xxxxxx
脚本分发密钥:
https://www.cnblogs.com/kyle-7Qc/p/18518921
6.3 主机清单
ansible的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory主机清单文件中将其分组组织。
主机定义支持IP地址和主机名两种方式,写法多种多样。inventory文件遵循INI文件风格,中括号的字符为组名,可以将同一个主机归并到不同的组中,此外,如若目标主机使用非默认的SSH端口,还可以在主机名之后使用冒号加端口号来标识,如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机。
注意:
- 1.生产建议在每个项目目录下创建独立的hosts文件;
- 2.通过项目目录下的ansible.cfg文件中的"inventory=./hosts"实现;
参考链接:
https://docs.ansible.com/ansible-core/devel/inventory_guide/intro_inventory.html
6.3.1 分组经典用法
1.定义分组
[consul1]
10.0.0.71
[consul2]
10.0.0.72
[consul3]
10.0.0.73
[csl]
10.0.0.[71:73]
[vsans]
vsan[01:02].node[11:12]
# consul分组从其他分组中引用,无法定义新的主机,从其他多个分组中继承主机(写法不推荐)。
[consul:children]
consul1
consul2
consul3
2.调用特定分组测试
[root@Ans-prometheus /etc/ansible]# ansible csl --list-hosts
hosts (3):
10.0.0.71
10.0.0.72
10.0.0.73
[root@Ans-prometheus /etc/ansible]# ansible consul --list-hosts
hosts (3):
10.0.0.71
10.0.0.72
10.0.0.73
[root@Ans-prometheus /etc/ansible]# ansible vsans --list-hosts
hosts (4):
vsan01.node11
vsan01.node12
vsan02.node11
vsan02.node12
6.3.2 连接主机时指定配置项
1.编写配置文件
cat /etc/ansible/hosts
# 每个主机都可以自定义需要的配置,比如此处我指定了远程主机的连接协议,端口,用户名和密码
master231 ansible_connection=ssh ansible_ssh_port=22 ansible_ssh_user=kyle ansible_ssh_password=1
# 指定主机的用户名和密码。
worker232 ansible_ssh_user=root ansible_ssh_password=1
# 指定主机的IP地址和端口
10.0.0.233:22
2.调用测试
ansible all --list-hosts
hosts (3):
master231
worker232
10.0.0.233
- 主机清单文件分组中常用配置项
- ansible_ssh_host
指定远程主机,可以是IP地址或者主机名。
- ansible_ssh_port
指定SSH端口。
- ansible_ssh_user
指定SSH用户名。
- ansible_ssh_pass
指定SSH密码。
- ansible_sudo_pass
指定SUDO密码。
- ansible_sudo_exe
sudo命令执行路径,适用于1.8+版本。
- ansible_connection
与主机的连接类型,比如local|ssh|paramiko|docker
- ansible_ssh_private_key_file:
SSH私钥文件。
- ansible_ssh_type
目标系统的SHELL类型,默认是sh,可以指定为csh|fish等。
- ansible_python_interpreter
目标主机的Python解释器路径,适用于多Python版本场景或者默认/usr/bin/python路径不存在。
6.4 Ad-Hoc 临时命令
适用于一次性、不重复的批量任务,语法格式:
ansible <主机模式> -m <模块名> -a "<模块参数>"
常用示例:
# 测试所有主机连通性
[root@Ans-prometheus /etc/ansible]# ansible csl -m ping
10.0.0.71 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.72 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.73 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# 批量执行命令
[root@Ans-prometheus /etc/ansible]# ansible csl -m command -a "uptime"
10.0.0.73 | CHANGED | rc=0 >>
21:02:40 up 16 min, 1 user, load average: 0.03, 0.02, 0.04
10.0.0.72 | CHANGED | rc=0 >>
21:02:40 up 16 min, 2 users, load average: 0.00, 0.02, 0.06
10.0.0.71 | CHANGED | rc=0 >>
21:02:40 up 16 min, 2 users, load average: 0.16, 0.16, 0.17
# 批量安装软件
ansible csl -m yum -a "name=nginx state=present"
# 批量复制文件
ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts mode=0644"
技术栈总结
| 层面 | 技术选型 |
|---|---|
| 开发语言 | Python |
| 通信协议 | SSH(Linux)/ WinRM(Windows) |
| 并发模型 | multiprocessing 多进程 |
| 远程执行 | subprocess 调用系统 SSH 客户端 |
| 连接优化 | SSH ControlMaster + Pipelining |
| 数据交换格式 | JSON(模块输出)/ YAML(Playbook) |
| 目标机依赖 | 仅需 Python 解释器(Linux)或 PowerShell(Windows) |
一句话总结
Ansible 的本质就是一个"SSH 批量执行引擎":它在控制节点上将模块代码和参数打包成临时 Python 脚本,通过 SSH 推送到目标机执行,收集 JSON 格式的执行结果后清理临时文件,并通过多进程 + SSH 连接复用实现高效的并行管理。

浙公网安备 33010602011771号