Ansible 基础概念 #
核心架构 #
整体架构图 #
text
┌─────────────────────────────────────────────────────────────┐
│ 控制节点 (Control Node) │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Ansible Core │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Inventory│ │Modules │ │Plugins │ │Playbooks│ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
SSH / WinRM
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1 │ │ Node 2 │ │ Node 3 │
│ Python │ │ Python │ │ Python │
└─────────┘ └─────────┘ └─────────┘
控制节点 #
定义 #
控制节点是运行 Ansible 的机器,负责发送指令到被管理节点。
特点 #
text
控制节点特点
├── 安装 Ansible
├── 存放 Playbook 和配置
├── 通过 SSH/WinRM 连接被管理节点
├── 不支持 Windows 作为控制节点
└── 可以有多个控制节点
可以安装的内容 #
bash
# 核心组件
ansible # 核心命令行工具
ansible-playbook # Playbook 执行器
ansible-vault # 加密工具
ansible-galaxy # 角色管理工具
ansible-doc # 文档查看工具
ansible-config # 配置管理工具
ansible-inventory # 清单管理工具
ansible-pull # 拉取模式工具
被管理节点 #
定义 #
被管理节点是 Ansible 管理的目标机器,执行控制节点发送的任务。
支持的系统类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 被管理节点类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Linux 系统 Windows 系统 │
│ ├── RHEL/CentOS ├── Windows Server 2012+ │
│ ├── Ubuntu/Debian ├── Windows Server 2016+ │
│ ├── Fedora └── Windows 10/11 │
│ ├── SUSE/OpenSUSE │
│ └── Alpine │
│ │
│ 网络设备 云服务 │
│ ├── Cisco IOS/NX-OS ├── AWS │
│ ├── Juniper Junos ├── Azure │
│ ├── Arista EOS ├── GCP │
│ ├── Huawei VRP └── Alibaba Cloud │
│ └── F5 BIG-IP │
│ │
└─────────────────────────────────────────────────────────────┘
连接方式 #
| 系统 | 连接方式 | 要求 |
|---|---|---|
| Linux | SSH | Python 2.6+ 或 Python 3.5+ |
| Windows | WinRM | PowerShell 3.0+ |
| 网络设备 | SSH/CLI | 无需 Python |
| 云服务 | API | SDK/模块 |
模块 #
定义 #
模块是 Ansible 执行具体任务的代码单元,是 Ansible 的核心组件。
模块分类 #
text
模块分类
├── 系统模块
│ ├── command - 执行命令
│ ├── shell - 执行 shell 命令
│ ├── script - 执行脚本
│ └── raw - 原始命令
│
├── 文件模块
│ ├── copy - 复制文件
│ ├── template - 模板渲染
│ ├── file - 文件属性
│ ├── lineinfile - 行编辑
│ └── synchronize - 同步文件
│
├── 包管理模块
│ ├── apt - Debian/Ubuntu
│ ├── yum - RHEL/CentOS
│ ├── dnf - Fedora
│ ├── pip - Python 包
│ └── npm - Node.js 包
│
├── 服务模块
│ ├── service - 服务管理
│ ├── systemd - Systemd 服务
│ └── supervisor - Supervisor
│
├── 用户模块
│ ├── user - 用户管理
│ └── group - 组管理
│
├── 云模块
│ ├── aws_ec2 - AWS EC2
│ ├── azure_rm - Azure
│ └── gcp - GCP
│
└── 数据库模块
├── mysql_db - MySQL 数据库
├── postgresql - PostgreSQL
└── mongodb - MongoDB
模块使用示例 #
yaml
# command 模块 - 执行命令
- name: Run a command
command: ls -la /tmp
# shell 模块 - 执行 shell 命令
- name: Run shell command
shell: cat /etc/passwd | grep root
# copy 模块 - 复制文件
- name: Copy a file
copy:
src: files/app.conf
dest: /etc/app/app.conf
owner: root
group: root
mode: '0644'
# apt 模块 - 安装软件包
- name: Install Nginx
apt:
name: nginx
state: present
update_cache: yes
# service 模块 - 管理服务
- name: Start Nginx
service:
name: nginx
state: started
enabled: yes
# user 模块 - 管理用户
- name: Create user
user:
name: deploy
shell: /bin/bash
groups: sudo
append: yes
查看模块文档 #
bash
# 列出所有模块
ansible-doc -l
# 查看特定模块文档
ansible-doc copy
ansible-doc apt
ansible-doc service
# 查看简短示例
ansible-doc -s copy
任务 #
定义 #
任务是模块调用的最小单位,是 Playbook 中的基本执行单元。
任务结构 #
yaml
tasks:
- name: 任务描述(可选但推荐)
module_name:
parameter1: value1
parameter2: value2
任务示例 #
yaml
tasks:
- name: Install Nginx web server
apt:
name: nginx
state: present
update_cache: yes
become: yes
- name: Copy Nginx configuration
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
backup: yes
notify: Restart Nginx
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
任务属性 #
yaml
- name: Task with all attributes
copy:
src: file.txt
dest: /tmp/file.txt
when: ansible_os_family == "Debian" # 条件执行
loop: # 循环
- item1
- item2
become: yes # 提权
become_user: root # 提权用户
ignore_errors: yes # 忽略错误
register: result # 注册结果
changed_when: "'success' in result.stdout" # 更改条件
failed_when: "'error' in result.stdout" # 失败条件
notify: handler_name # 通知处理器
tags: # 标签
- install
- config
Play #
定义 #
Play 是针对一组主机执行的一组任务的集合,定义了在哪些主机上执行什么任务。
Play 结构 #
yaml
- name: Play 名称
hosts: 目标主机或组
vars: # 变量(可选)
var1: value1
vars_files: # 变量文件(可选)
- vars.yml
become: yes # 是否提权(可选)
become_user: root # 提权用户(可选)
tasks: # 任务列表
- name: Task 1
...
- name: Task 2
...
handlers: # 处理器(可选)
- name: Handler 1
...
Play 示例 #
yaml
- name: Configure web servers
hosts: webservers
become: yes
vars:
nginx_port: 80
document_root: /var/www/html
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Configure Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
- name: Start Nginx
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
Playbook #
定义 #
Playbook 是包含一个或多个 Play 的 YAML 文件,是 Ansible 自动化的核心。
Playbook 结构 #
yaml
# site.yml
- name: First Play - Configure webservers
hosts: webservers
become: yes
tasks:
- name: Task 1
...
- name: Task 2
...
- name: Second Play - Configure databases
hosts: databases
become: yes
tasks:
- name: Task 3
...
- name: Task 4
...
执行 Playbook #
bash
# 基本执行
ansible-playbook site.yml
# 指定清单文件
ansible-playbook -i inventory/hosts site.yml
# 检查语法
ansible-playbook --syntax-check site.yml
# 模拟执行(不实际更改)
ansible-playbook --check site.yml
# 详细输出
ansible-playbook -v site.yml
ansible-playbook -vv site.yml
ansible-playbook -vvv site.yml
# 指定标签
ansible-playbook --tags "install" site.yml
ansible-playbook --skip-tags "config" site.yml
# 指定开始任务
ansible-playbook --start-at-task "Install Nginx" site.yml
Roles #
定义 #
Roles 是组织 Playbook 的一种方式,将任务、变量、文件、模板等按功能模块化。
Roles 目录结构 #
text
roles/
└── nginx/ # 角色名称
├── tasks/ # 任务
│ └── main.yml
├── handlers/ # 处理器
│ └── main.yml
├── templates/ # 模板
│ └── nginx.conf.j2
├── files/ # 静态文件
│ └── index.html
├── vars/ # 变量(高优先级)
│ └── main.yml
├── defaults/ # 默认变量(低优先级)
│ └── main.yml
├── meta/ # 元数据/依赖
│ └── main.yml
├── library/ # 自定义模块
├── module_utils/ # 模块工具
└── README.md # 文档
使用 Roles #
yaml
# site.yml
- hosts: webservers
become: yes
roles:
- nginx
- mysql
- { role: redis, when: "ansible_os_family == 'Debian'" }
创建 Roles #
bash
# 使用 ansible-galaxy 创建角色
ansible-galaxy init nginx
# 目录结构
# nginx/
# ├── defaults
# │ └── main.yml
# ├── files
# ├── handlers
# │ └── main.yml
# ├── meta
# │ └── main.yml
# ├── README.md
# ├── tasks
# │ └── main.yml
# ├── templates
# ├── tests
# │ ├── inventory
# │ └── test.yml
# └── vars
# └── main.yml
Facts #
定义 #
Facts 是 Ansible 自动收集的被管理节点信息,包括系统、网络、硬件等。
收集 Facts #
bash
# 收集所有 Facts
ansible all -m setup
# 收集特定主机 Facts
ansible web1 -m setup
# 过滤 Facts
ansible web1 -m setup -a "filter=ansible_eth*"
ansible web1 -m setup -a "filter=ansible_mem*"
常用 Facts 变量 #
yaml
# 系统 Facts
ansible_facts['hostname'] # 主机名
ansible_facts['fqdn'] # 完全限定域名
ansible_facts['os_family'] # 系统家族
ansible_facts['distribution'] # 发行版
ansible_facts['distribution_version'] # 版本
ansible_facts['kernel'] # 内核版本
# 网络 Facts
ansible_facts['default_ipv4']['address'] # IPv4 地址
ansible_facts['default_ipv4']['gateway'] # 网关
ansible_facts['interfaces'] # 网络接口列表
# 硬件 Facts
ansible_facts['memtotal_mb'] # 总内存(MB)
ansible_facts['processor_cores'] # CPU 核心数
ansible_facts['processor_count'] # CPU 数量
ansible_facts['mounts'] # 挂载点
# 时间 Facts
ansible_facts['date_time']['date'] # 日期
ansible_facts['date_time']['time'] # 时间
使用 Facts #
yaml
- name: Use facts in tasks
debug:
msg: "System {{ ansible_facts['hostname'] }} has {{ ansible_facts['memtotal_mb'] }} MB RAM"
- name: Conditional based on OS
apt:
name: nginx
state: present
when: ansible_facts['os_family'] == "Debian"
- name: Conditional based on memory
debug:
msg: "This is a large server"
when: ansible_facts['memtotal_mb'] > 8192
禁用 Facts 收集 #
yaml
- hosts: all
gather_facts: no # 禁用 Facts 收集
tasks:
- name: Task
...
变量 #
变量定义位置 #
text
变量优先级(从低到高):
1. 命令行变量
└── ansible-playbook -e "var=value"
2. Role defaults
└── roles/x/defaults/main.yml
3. Inventory 文件或脚本
└── inventory/hosts
4. Inventory group_vars/all
└── inventory/group_vars/all.yml
5. Inventory group_vars/*
└── inventory/group_vars/webservers.yml
6. Inventory host_vars/*
└── inventory/host_vars/web1.yml
7. Host facts
└── ansible_facts[...]
8. Play vars
└── vars:
9. Play vars_prompt
└── vars_prompt:
10. Play vars_files
└── vars_files:
11. Role vars
└── roles/x/vars/main.yml
12. Block vars
└── block: vars:
13. Task vars
└── vars:
14. include_vars
└── include_vars:
15. Role params
└── roles: - { role: x, param: value }
16. Extra vars
└── ansible-playbook -e "@file.yml"
变量定义示例 #
yaml
# 在 Playbook 中定义
- hosts: all
vars:
app_name: myapp
app_port: 8080
# 在文件中定义
# vars.yml
app_name: myapp
app_port: 8080
# 使用变量文件
- hosts: all
vars_files:
- vars.yml
# 在 Inventory 中定义
[webservers]
web1 ansible_host=192.168.1.100
[webservers:vars]
app_name=myapp
app_port=8080
# 在 group_vars 中定义
# inventory/group_vars/webservers.yml
app_name: myapp
app_port: 8080
变量使用 #
yaml
- name: Use variable
debug:
msg: "Application {{ app_name }} is running on port {{ app_port }}"
- name: Use variable in template
template:
src: app.conf.j2
dest: /etc/{{ app_name }}/app.conf
插件 #
插件类型 #
text
插件类型
├── Connection Plugins - 连接插件
│ ├── ssh
│ ├── winrm
│ ├── local
│ └── docker
│
├── Shell Plugins - Shell 插件
│ ├── sh
│ ├── bash
│ └── powershell
│
├── Lookup Plugins - 查找插件
│ ├── file
│ ├── env
│ ├── dict
│ └── password
│
├── Filter Plugins - 过滤器插件
│ └── 自定义 Jinja2 过滤器
│
├── Test Plugins - 测试插件
│ └── 自定义 Jinja2 测试
│
├── Callback Plugins - 回调插件
│ └── 执行结果处理
│
├── Cache Plugins - 缓存插件
│ ├── memory
│ ├── redis
│ └── jsonfile
│
└── Strategy Plugins - 策略插件
├── linear
└── free
使用插件示例 #
yaml
# Lookup 插件 - 读取文件内容
- name: Read file content
debug:
msg: "{{ lookup('file', '/etc/hostname') }}"
# Lookup 插件 - 读取环境变量
- name: Get environment variable
debug:
msg: "{{ lookup('env', 'HOME') }}"
# Lookup 插件 - 生成密码
- name: Generate password
debug:
msg: "{{ lookup('password', '/tmp/password length=15 chars=ascii_letters,digits') }}"
# Filter 插件 - 使用过滤器
- name: Use filter
debug:
msg: "{{ my_list | join(', ') }}"
# Callback 插件 - 在配置文件中启用
# ansible.cfg
[defaults]
callback_whitelist = profile_tasks, timer
执行流程 #
Playbook 执行流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 1. 解析 Playbook │
│ └── 读取 YAML 文件,验证语法 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. 加载 Inventory │
│ └── 读取主机清单,解析组和变量 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. 收集 Facts(如果启用) │
│ └── 在目标主机上执行 setup 模块 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. 执行 Tasks │
│ └── 按顺序执行每个任务 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. 触发 Handlers │
│ └── 执行被通知的处理器 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 6. 输出结果 │
│ └── 显示执行摘要和统计 │
└─────────────────────────────────────────────────────────────┘
下一步 #
现在你已经掌握了 Ansible 的核心概念,接下来学习 清单管理 深入了解如何管理主机清单!
最后更新:2026-03-29