Ansible 核心概念
内容:是什么 -> 为什么 -> 怎么用 -> 易错点
Ansible 是一款无 Agent 的自动化运维与配置管理工具,主要用于:
- 批量命令执行
- 配置管理
- 应用部署
- 系统初始化
- 持续交付(CI/CD)
核心特点
| 特性 | 说明 |
|---|---|
| 无 Agent | 目标主机无需安装客户端 |
| SSH 通信 | 默认基于 SSH |
| YAML 描述 | Playbook 使用 YAML |
| 幂等性 | 多次执行结果一致 |
| 模块化 | 一切操作都是模块 |
控制节点 (Control Node)
┌────────────────────────────┐
│ ansible / ansible-playbook |
└──────────┬─────────────────┘
│ SSH
┌─────────┴─────────┐
│ │
被控节点1 被控节点2
执行流程(非常重要)
- 读取 Inventory(主机清单)
- 解析 Playbook / Ad-Hoc
- 选择模块(module)
- 通过 SSH 推送模块到目标主机
- 模块在远端执行
- 返回 JSON 结果
- 控制端解析并展示
| 角色 | 说明 |
|---|---|
| Control Node | 安装 Ansible 的机器 |
| Managed Node | 被管理的目标主机 |
⚠️ Managed Node 不需要安装 Ansible
是什么?
Inventory 定义 Ansible 要管理哪些主机、如何分组。
支持格式
- INI(传统)
- YAML(推荐)
- 动态 Inventory(云厂商 / API)
核心概念
- Host(主机)
- Group(主机组)
- Group Vars / Host Vars
all:
children:
web:
hosts:
web01:
web02:
本质
模块 = Ansible 执行任务的最小单位
- 每个任务都是一个模块调用
- 模块返回标准 JSON
常见模块分类
| 类型 | 示例 |
|---|---|
| 系统 | package, service, user |
| 文件 | copy, template, file |
| 命令 | command, shell |
| 网络 | uri |
| 云 | ec2, azure_rm |
| 容器 | docker_container |
⚠️ Playbook ≠ Shell 脚本
Ad-Hoc
- 单条命令
- 临时任务
ansible web -m ping
Playbook
- 多任务
- 可复用、可维护
- hosts: web
tasks:
- ping:
- hosts: web
become: true
tasks:
- name: install nginx
package:
name: nginx
state: present
核心字段
| 字段 | 作用 |
|---|---|
| hosts | 目标主机 |
| tasks | 任务列表 |
| become | 提权 |
| vars | 变量 |
| handlers | 事件触发 |
特点
- 顺序执行
- 默认失败即中断
- 幂等
- name: start nginx
service:
name: nginx
state: started
什么是幂等?
多次执行,结果一致,不产生副作用
幂等 vs 非幂等
| 操作 | 是否幂等 |
|---|---|
| 安装软件 | ✅ |
| 确保服务运行 | ✅ |
| echo 1 » file | ❌ |
是什么?
当任务状态发生变化时,才执行的任务
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
- template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
来源优先级(高 -> 低)
- Extra vars(-e)
- Play vars
- Host vars
- Group vars
- Role defaults
nginx_port: 80
是什么?
Ansible 自动采集的主机信息
ansible all -m setup
{{ ansible_hostname }}
{{ ansible_os_family }}
server {
listen {{ nginx_port }};
}
- 条件判断
- 循环
- 变量渲染
作用
- 模块化
- 可复用
- 可测试
- 易维护
roles/
nginx/
tasks/
handlers/
templates/
- name: install nginx
package:
name: nginx
tags: install
ansible-playbook site.yml --tags install
become: true
become_user: root
ignore_errors: true
failed_when: result.rc != 0
block:
- ...
rescue:
- ...
ansible-playbook site.yml --check --diff
- 不实际修改
- 显示差异
Inventory -> 定义对象
Playbook -> 定义流程
Role -> 定义能力
- 无 Agent
- 模块化
- 幂等性
- 声明式
- Push 模型
- YAML + Jinja2
- 结果可预期
- 核心概念(你现在这一步)✔
- 模块体系
- Inventory 设计
- Role 规范
- Playbook 编排
- CI/CD 集成
- 大规模主机治理
Ansible 是一个基于 SSH、无 Agent、模块化、声明式、幂等的自动化运维工具
Inventory 定义目标,Playbook 定义流程,Role 定义能力
所有操作都是模块,所有设计围绕幂等性展开