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