Ansible 基础知识总结
一、简介
Ansible 是一个开源软件,提供配置管理和应用程序部署等项目通用的管理功能。它主要运行在类 Unix 系统上,通过特性语言来描述各种资源对象,进而管理类 Unix 系统和 Windows 系统等系统资源,是一款轻量级的自动化运维工具,专注于批量任务执行、配置管理、应用部署等场景。
二、工作特性
基础属性
开发:基于 Python 语言实现;
部署:基于 Python 和 SSH、agentless 实现简单部署;
安全:基于 OpenSSH 加密方式来传输,无序代理不依赖 PKI,命令执行幂等性。
功能属性
设计:基于插件化方式实现定制的功能;
关键:三大关键模块:Paramiko、PyYAML、Jinja2;
定制:支持自定义功能模块,编程语言格式无所谓。
进阶属性
格式:YAML 格式,支持丰富的数据结构;
编排:支持 playbook 自动化方式编排任务;
分层:基于角色特性实现多层解决方案。
劣势
由于基于 ssh 方式来通信,所以受 ssh 的限制比较多,因为 ssh 不是专门为 ansible 做准备的,所以由于性能损耗方面的原因,特别是主机量比较多的场景,效率是相当的低,解决该办法就是通过专用的代理或者客户端的方式来解决这种大环境下的低效。
使用场景
自动化云服务管理、自动化设备管理、自动化应用部署、自动化配置管理、自动化持续交付、自动化安全管理等
三、结构描述
三层结构
用户端、控制端、被控端
控制端
控制节点是架构的核心,即安装 Ansible 的主机,负责发起管理任务,需具备 Python 环境和对被管理节点的通信权限(默认通过 SSH)。包含 Ansible 核心引擎、主机清单(Inventory)、模块(Modules)、剧本(Playbooks)及各类插件(如连接插件、过滤插件等):
主机清单:执行具体任务的最小单元(如文件操作 file、服务管理 service、包管理 yum 等),Ansible 内置数千个模块,也支持自定义。
模块:执行具体任务的最小单元(如文件操作、服务管理等);
剧本(Playbooks):以 YAML 格式编写的任务编排文件,通过 “Play” 定义目标节点、变量、执行的模块序列,实现复杂流程自动化(如 “先安装软件,再配置文件,最后启动服务”)。
插件:扩展 Ansible 功能的组件,如连接插件(默认ssh)、过滤插件(处理数据)、回调插件(格式化输出)等。。
被控端
被管理节点无需安装 Ansible 客户端,仅需支持控制节点的通信方式(默认基于 SSH 协议),通过接收控制节点推送的模块并执行,再将结果返回给控制节点,最终完成批量自动化管理。
四、工作原理
控制节点:控制节点作为核心,负责编写和下发 Ansible 剧本,是管理被管理节点的发起端。
被控节点:Ansible 的通信方式默认基于 SSH 协议,无需在被控节点部署额外客户端,实现无代理连接。
通信方式:控制节点通过预设剧本定义自动化任务,依托指定通信方式向被管理节点推送并执行指令,完成统一管理。
五、工作流程
用户基于命令或者 playbook 方式,向 ansible 的控制端发起用户请求;
ansible 根据用户请求目标,到控制端的主机列表中验证目标是否存在;
若目标主机存在,然后基于连接插件与被控端处于连接状态;
根据用户请求指令,结合相应的功能模块,指定目标主机执行相应的功能;
目标主机执行完毕后,会将相应的状态结果返回给控制端;
控制端在处理过程中,还会通过插件工具实现日志、邮件等辅助功能。
六、命令执行来源
系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令
在 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容依次执行
在 web 管理界面上执行
使用 API 调用执行:配置API接口,让第三方应用或程序调用接口执行 ansible 命令
七、基础核心命令
ansible --version:查看 Ansible 版本,验证安装是否成功。
ansible all -m ping:测试所有受控节点的连通性(all 指代 Inventory 中所有主机)。
ansible <主机组> -a "<shell命令>":在目标主机执行临时 Shell 命令(无需编写剧本)。
ansible-doc -l:列出所有可用模块,ansible-doc <模块名> 查看模块详细用法(如 ansible-doc copy)。
八、模块相关命令(高频场景)
1、命令执行模块
ansible <主机组> -m command -a "<命令>":执行系统命令(不支持管道、变量,更安全)。
ansible <主机组> -m shell -a "<命令>":支持 Shell 语法(管道、重定向,如 ansible web -m shell -a "ps aux | grep nginx")。
2、文件操作模块
ansible <主机组> -m copy -a "src=本地文件 dest=目标路径 mode=权限":复制本地文件到受控节点。
ansible <主机组> -m file -a "path=路径 state=directory mode=755":创建目录(state=file 为创建文件,absent 为删除)。
3、包与服务管理
ansible <主机组> -m yum -a "name=软件名 state=present":CentOS/RHEL 安装软件(absent 为卸载)。
ansible <主机组> -m apt -a "name=软件名 state=present update_cache=yes":Ubuntu/Debian 安装软件。
ansible <主机组> -m service -a "name=服务名 state=started enabled=yes":启动服务并设置开机自启。
九、剧本(Playbook)相关命令
ansible-playbook <剧本名.yml>:运行指定 Playbook(核心编排命令)。
ansible-playbook -C <剧本名.yml>:预执行检查(Dry Run),不实际修改目标主机。
ansible-playbook -i <自定义Inventory> <剧本名.yml>:指定非默认的主机清单文件。
ansible-playbook -v <剧本名.yml>: verbose 输出(-vvv 为最详细日志,用于排错)。
十、Playbook 与单个模块命令的区别
1、核心区别
执行单位与复杂度:单个模块命令是单任务操作,通过命令行直接调用单个 Ansible 模块(如 ansible web -m ping -a "data=hello"),仅能完成单一操作(如 ping 检测、文件创建等),适合简单、临时的任务。Playbook 是多任务编排文件(YAML 格式),可定义一系列有序的任务(如安装软件→配置文件→启动服务),支持复杂流程的组合,适合系统性操作(如应用部署、环境初始化)。
格式与存储:单个模块命令是命令行参数形式,执行后无持久化记录,依赖人工记忆或外部笔记。Playbook 是结构化文本文件,可保存为 .yml 文件,便于纳入版本控制(如 Git),支持团队协作和历史追溯。
流程控制能力:单个模块命令无流程控制逻辑,仅能执行固定动作,无法处理条件判断(如 “仅在 CentOS 系统执行”)、循环(如 “批量创建用户”)或错误处理。Playbook 支持丰富的流程控制:通过 when 实现条件执行、loop 实现循环任务、failed_when 定义错误判定规则等,可灵活应对复杂场景。
变量与模板:支持单个模块命令可通过 -e 参数传递简单变量,但无法结合模板(Jinja2)动态生成配置文件。Playbook 可通过 vars 定义变量、templates 模块调用模板,支持根据主机环境(如开发 / 生产)动态生成差异化配置,适配多环境场景。
幂等性:保障虽然 Ansible 模块本身具备幂等性(重复执行结果一致),但单个模块命令仅能保障单任务幂等;Playbook 可通过任务依赖(如 notify 触发 handlers)和状态检查,系统性保障多任务组合的幂等性(如 “仅在配置文件变更后重启服务”)。
2、Playbook 优势
多任务编排能力:可按顺序串联多个任务,处理依赖关系(如 “先安装依赖再部署应用”),实现端到端的自动化流程。
灵活的流程控制:通过条件、循环、错误处理等逻辑,适配复杂业务场景(如 “不同操作系统执行不同安装命令”)。
可复用与可维护:作为文件可版本化管理,支持团队共享和迭代优化,避免重复编写命令。
环境适配性:结合变量和模板,轻松应对多环境(开发 / 测试 / 生产)的差异化配置需求。
规模化管理:支持通过 Inventory 定义主机组,批量对多台主机执行统一流程,适合大规模集群管理。
十一、主机清单(Inventory)管理
1、主机清单的作用
主机清单是 Ansible 用来识别 “需要管理的目标主机 / 设备” 的配置文件(或动态生成的资源),主要作用包括:
定义管理范围:明确 Ansible 可以操作的主机集合(如服务器、网络设备、虚拟机等),告诉 Ansible “要管理哪些对象”。
提供连接信息:为清单中的主机指定连接参数(如 IP 地址、SSH 端口、登录用户、认证方式等),确保 Ansible 能成功连接目标主机。
存储变量:可以为单个主机或主机组定义变量(如软件版本、配置路径等),这些变量会在 Playbook 中被直接引用,实现 “按组 / 按主机” 的差异化配置。
2、分组管理
2.1、基本分组
用 [组名] 标识一个组(组名自定义,如 webservers、prod);
组名下方列出该组包含的主机(可以是 IP 地址、域名,或主机别名);
主机可同时属于多个组(通过在多个组下重复列出实现)。
[mysql]
10.0.0.15
10.0.0.16[nnginx]
10.0.0.15
10.0.0.1182.2、嵌套组
可以用 [父组名:children] 定义嵌套组(父组包含子组)。
[mysql]
10.0.0.15
10.0.0.16[nginx]
10.0.0.118# 父组:生产环境(包含mysql和nginx子组)
[web:children]
mysql
nginx此时,执行 ansible web -m ping 会对 mysql 和 nginx 中的所有主机执行 ping 模块。
2.3、常用命令
ansible <主机组> --list-hosts:列出指定主机组中的所有主机。
ansible-inventory --list:以 JSON 格式展示所有 Inventory 主机信息。
ansible <主机组> -m ping:对组内所有主机执行 ping 模块。
十二、配置与优化命令
ansible-config list:列出所有 Ansible 配置项及默认值。
ansible-config dump:展示当前生效的 Ansible 配置(结合配置文件优先级)。
ansible <主机组> -f 10 -m ping:指定并行执行数(-f 为 forks,默认 5,提高大批量主机执行效率)。
ansible <主机组> -u <用户名> -k:指定远程登录用户名,且提示输入密码(非密钥登录场景)。
