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 件打底的事:

  1. 读配置
    按优先级找配置文件,确认基础规则:一次同时连多少台机器、SSH 怎么连、角色从哪找、缓存开不开等等。

  2. 认主机
    打开主机清单,搞清楚:要管哪些机器、分成几组、每台机器用什么账号/端口/密钥登录。

  3. 拆任务
    把你写的剧本(YAML文件)从头到尾读一遍,理清楚任务顺序、哪些有条件、哪些要触发、哪些打了标签,排成一条有序的任务流水线。

  4. 拼参数
    把全局、分组、单台机器、剧本、角色里所有的配置参数,按“后写的覆盖先写的、命令行给的最大”的规则合并好,算出每台机器最终用什么参数。

  5. 摸家底 主机事实收集(默认开启)
    在第一个业务任务执行前,自动调用 setup 模块(本身也走完整的任务闭环),采集受管节点的系统信息(操作系统、CPU、内存、网卡等),存入 ansible_facts 变量供后续任务调用。


第二层:单任务循环(每个操作都完整走一遍)

剧本里每一条具体操作(比如装 Nginx、拷文件、改服务),都会独立走完下面 5 步,这就是 Ansible“无代理”的核心原理:

  1. 在本地拼好脚本
    主控机把对应功能的代码(比如装软件的模块、拷文件的模块),加上你给的参数,拼成一个独立完整的 Python 小脚本
    如果是模板文件,也先在主控机渲染成最终配置,一起打包进去。

  2. 传到目标机器
    通过 SSH 连接,把这个小脚本传到目标机器的一个临时文件夹里(默认在用户目录下的 .ansible/tmp)。

  3. 远程本地执行
    主控机通过 SSH 调用目标机器上的 Python,直接运行这个脚本。
    脚本会先检查现状:已经是你要的状态就啥也不干;不一样才真正执行修改——这就是“幂等性”,重复跑也不会出问题。

  4. 把结果传回来
    脚本跑完,把结果(成功/失败/有没有改动/报错信息)打成一段 JSON 文字,打印到控制台。
    主控机通过 SSH 接住这段文字,解析后给你显示成绿/黄/红的状态。

  5. 删掉临时文件
    不管成功失败,主控机立刻通过 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 优势

  1. 无代理架构:受管端无需安装 Agent,降低部署与维护成本,避免代理版本兼容问题

  2. 学习门槛低:采用 YAML 声明式语法,接近自然语言,无需深厚编程基础

  3. 幂等性设计:多数内置模块具备幂等性,重复执行不会产生副作用,确保环境一致性

  4. 轻量级部署:控制节点仅需 Python 环境即可运行,无数据库、守护进程等依赖

  5. 跨平台支持:兼容 Linux、Windows、macOS 及主流网络设备,覆盖多云环境

  6. 生态丰富:Ansible Galaxy 提供大量预构建角色与模块,社区活跃度高

  7. 安全可靠:基于标准 SSH/WinRM 加密传输,无需开放额外端口

3.2 劣势

  1. 性能瓶颈:单控制节点并发能力有限,大规模集群(>250台)下执行效率下降明显,SSH 连接开销较大

  2. 调试难度高:Playbook 执行失败时定位问题较复杂,缺乏完善的分步调试机制

  3. Windows 支持较弱:对 Windows 环境的模块覆盖度与稳定性不及 Linux 平台

  4. 状态管理薄弱:原生不支持持久化状态存储,复杂依赖场景下编排能力有限

  5. 企业级功能缺失:社区版缺乏 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 连接复用实现高效的并行管理。

posted @ 2026-08-04 17:14  kyle_7Qc  阅读(19)  评论(0)    收藏  举报