1.1 什么是 Ansible

Ansible 是一个开源的自动化平台,用于配置管理、应用部署、任务执行和编排。它由 Red Hat 公司维护,是目前最受欢迎的 IT 自动化工具之一。

1.1.1 Ansible 的特点

  • 无代理架构(Agentless):不需要在目标主机上安装任何代理软件
  • 基于 SSH:使用标准的 SSH 协议进行通信
  • 声明式语言:使用 YAML 语法描述期望的系统状态
  • 幂等性:多次执行相同操作产生相同结果
  • 简单易学:语法简洁,学习曲线平缓
  • 强大的模块库:提供数千个内置模块

1.1.2 Ansible 的优势

# 示例:简单的 Ansible 任务
- name: 确保 nginx 服务正在运行
  service:
    name: nginx
    state: started
    enabled: yes

优势对比

特性 Ansible Puppet Chef SaltStack
无代理
学习难度
配置语言 YAML Ruby DSL Ruby YAML/Python
推送模式
社区支持

1.2 Ansible 架构

1.2.1 核心组件

┌─────────────────────────────────────────────────────────────┐
│                    Ansible 架构图                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────┐    ┌─────────────────┐                │
│  │   Control Node  │    │   Managed Node  │                │
│  │                 │    │                 │                │
│  │  ┌───────────┐  │    │  ┌───────────┐  │                │
│  │  │ Ansible   │  │    │  │   SSH     │  │                │
│  │  │ Engine    │  │────┼──│ Daemon    │  │                │
│  │  └───────────┘  │    │  └───────────┘  │                │
│  │                 │    │                 │                │
│  │  ┌───────────┐  │    │  ┌───────────┐  │                │
│  │  │Inventory  │  │    │  │  Python   │  │                │
│  │  └───────────┘  │    │  └───────────┘  │                │
│  │                 │    │                 │                │
│  │  ┌───────────┐  │    └─────────────────┘                │
│  │  │Playbooks  │  │                                        │
│  │  └───────────┘  │    ┌─────────────────┐                │
│  │                 │    │   Managed Node  │                │
│  │  ┌───────────┐  │    │                 │                │
│  │  │ Modules   │  │    │  ┌───────────┐  │                │
│  │  └───────────┘  │    │  │   SSH     │  │                │
│  └─────────────────┘    │  │ Daemon    │  │                │
│                         │  └───────────┘  │                │
│                         │                 │                │
│                         │  ┌───────────┐  │                │
│                         │  │  Python   │  │                │
│                         │  └───────────┘  │                │
│                         └─────────────────┘                │
└─────────────────────────────────────────────────────────────┘

1.2.2 控制节点(Control Node)

控制节点是运行 Ansible 的机器,负责:

  • 执行 Playbook:解析和执行自动化脚本
  • 管理 Inventory:维护主机清单
  • 模块分发:将模块推送到目标主机
  • 结果收集:收集执行结果并生成报告
# 控制节点要求
# - Python 2.7 或 Python 3.5+
# - SSH 客户端
# - 支持的操作系统:Linux、macOS、WSL

# 检查控制节点环境
python3 --version
ssh -V
ansible --version

1.2.3 被管理节点(Managed Node)

被管理节点是 Ansible 管理的目标主机,要求:

  • SSH 服务:用于接收 Ansible 连接
  • Python 解释器:执行 Ansible 模块
  • 适当权限:执行管理任务的权限
# 被管理节点要求
# - SSH 服务运行
# - Python 2.6+ 或 Python 3.5+
# - sudo 权限(可选)

# 检查被管理节点环境
sudo systemctl status ssh
python3 --version
sudo -l

1.3 Ansible 工作原理

1.3.1 执行流程

sequenceDiagram
    participant User as 用户
    participant Control as 控制节点
    participant Managed as 被管理节点
    
    User->>Control: 执行 ansible-playbook
    Control->>Control: 解析 Playbook
    Control->>Control: 读取 Inventory
    Control->>Managed: SSH 连接
    Control->>Managed: 传输模块代码
    Managed->>Managed: 执行模块
    Managed->>Control: 返回执行结果
    Control->>Control: 清理临时文件
    Control->>User: 显示执行结果

1.3.2 详细执行步骤

  1. 解析阶段 “`yaml

    Ansible 解析 Playbook 和 Inventory

    • hosts: webservers tasks:
      • name: 安装 nginx yum: name: nginx state: present 2. **连接阶段** bash # Ansible 通过 SSH 连接到目标主机 ssh user@target-host “`
  2. 模块传输阶段

    # Ansible 将模块代码传输到目标主机
    # 临时目录:/tmp/.ansible-${USER}/tmp/
    
    1. 执行阶段

      # 在目标主机上执行模块
      python3 /tmp/.ansible-user/tmp/AnsiballZ_yum.py
      
  3. 结果收集阶段

    {
     "changed": true,
     "msg": "Package nginx installed successfully",
     "rc": 0
    }
    

    1.4 Ansible 核心概念

    1.4.1 Inventory(主机清单)

    # /etc/ansible/hosts
    [webservers]
    web1.example.com
    web2.example.com
    [databases]
    db1.example.com
    db2.example.com
    [production:children]
    webservers
    databases
    

1.4.2 Modules(模块)

# 常用模块示例
- name: 文件操作
  file:
    path: /etc/nginx/nginx.conf
    state: file
    mode: '0644'

- name: 包管理
  yum:
    name: nginx
    state: latest

- name: 服务管理
  service:
    name: nginx
    state: started
    enabled: yes

1.4.3 Playbooks(剧本)

---
- name: 配置 Web 服务器
  hosts: webservers
  become: yes
  
  vars:
    nginx_port: 80
    document_root: /var/www/html
  
  tasks:
    - name: 安装 nginx
      yum:
        name: nginx
        state: present
    
    - name: 启动 nginx 服务
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: 配置防火墙
      firewalld:
        port: "{{ nginx_port }}/tcp"
        permanent: yes
        state: enabled
        immediate: yes

1.4.4 Roles(角色)

roles/
├── nginx/
│   ├── tasks/
│   │   └── main.yml
│   ├── handlers/
│   │   └── main.yml
│   ├── templates/
│   │   └── nginx.conf.j2
│   ├── files/
│   ├── vars/
│   │   └── main.yml
│   ├── defaults/
│   │   └── main.yml
│   └── meta/
│       └── main.yml

1.5 Ansible 生态系统

1.5.1 Ansible 工具集

# 核心命令行工具
ansible          # 执行临时命令
ansible-playbook # 执行 Playbook
ansible-vault    # 加密敏感数据
ansible-galaxy   # 管理角色和集合
ansible-config   # 配置管理
ansible-doc      # 查看文档
ansible-inventory # 查看主机清单

1.5.2 Ansible Collections

# requirements.yml
collections:
  - name: community.general
    version: ">=1.0.0"
  - name: ansible.posix
  - name: community.docker
# 安装集合
ansible-galaxy collection install -r requirements.yml

1.5.3 Ansible Galaxy

# 搜索角色
ansible-galaxy search nginx

# 安装角色
ansible-galaxy install geerlingguy.nginx

# 列出已安装角色
ansible-galaxy list

1.6 使用场景

1.6.1 配置管理

# 系统配置标准化
- name: 配置系统参数
  hosts: all
  tasks:
    - name: 设置时区
      timezone:
        name: Asia/Shanghai
    
    - name: 配置 NTP
      template:
        src: ntp.conf.j2
        dest: /etc/ntp.conf
      notify: restart ntp

1.6.2 应用部署

# 应用自动化部署
- name: 部署 Web 应用
  hosts: webservers
  tasks:
    - name: 下载应用代码
      git:
        repo: https://github.com/example/webapp.git
        dest: /var/www/webapp
        version: "{{ app_version }}"
    
    - name: 安装依赖
      pip:
        requirements: /var/www/webapp/requirements.txt
        virtualenv: /var/www/webapp/venv

1.6.3 基础设施编排

# 多层应用部署
- name: 部署三层架构应用
  hosts: localhost
  tasks:
    - name: 配置负载均衡器
      include_role:
        name: nginx-lb
    
    - name: 配置应用服务器
      include_role:
        name: app-server
    
    - name: 配置数据库
      include_role:
        name: mysql-cluster

1.7 与其他工具的集成

1.7.1 CI/CD 集成

# Jenkins Pipeline 示例
pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                ansiblePlaybook(
                    playbook: 'deploy.yml',
                    inventory: 'production',
                    credentialsId: 'ansible-ssh-key'
                )
            }
        }
    }
}

1.7.2 云平台集成

# AWS 资源管理
- name: 创建 EC2 实例
  ec2:
    key_name: my-key
    instance_type: t2.micro
    image: ami-12345678
    wait: yes
    group: webserver
    count: 3
    vpc_subnet_id: subnet-12345678
    assign_public_ip: yes

1.7.3 容器化集成

# Docker 容器管理
- name: 运行 Docker 容器
  docker_container:
    name: webapp
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /var/www:/usr/share/nginx/html
    state: started
    restart_policy: always

1.8 最佳实践预览

1.8.1 目录结构

ansible-project/
├── inventories/
│   ├── production/
│   │   ├── hosts
│   │   └── group_vars/
│   └── staging/
│       ├── hosts
│       └── group_vars/
├── roles/
├── playbooks/
├── group_vars/
├── host_vars/
├── ansible.cfg
└── requirements.yml

1.8.2 安全考虑

# 使用 Ansible Vault 加密敏感数据
- name: 配置数据库连接
  template:
    src: database.conf.j2
    dest: /etc/app/database.conf
  vars:
    db_password: "{{ vault_db_password }}"

1.8.3 性能优化

# ansible.cfg
[defaults]
host_key_checking = False
pipelining = True
forks = 20
gathering = smart
fact_caching = memory

1.9 学习路径建议

1.9.1 初学者路径

  1. 基础概念:理解 Ansible 架构和核心概念
  2. 环境搭建:安装和配置 Ansible 环境
  3. 简单任务:使用 ad-hoc 命令执行简单任务
  4. Playbook 入门:编写第一个 Playbook
  5. 模块学习:掌握常用模块的使用

1.9.2 进阶路径

  1. 角色开发:创建可重用的角色
  2. 变量管理:掌握复杂的变量使用
  3. 模板引擎:使用 Jinja2 模板
  4. 错误处理:实现健壮的错误处理
  5. 性能优化:优化 Playbook 执行性能

1.9.3 专家路径

  1. 自定义模块:开发自定义模块
  2. 插件开发:创建自定义插件
  3. 企业集成:与企业系统集成
  4. 大规模部署:管理大规模基础设施
  5. 社区贡献:参与开源社区

1.10 本章总结

本章介绍了 Ansible 的基本概念、架构设计和核心组件。主要要点包括:

  • Ansible 特点:无代理、基于 SSH、声明式、幂等性
  • 架构组件:控制节点、被管理节点、模块、Playbook
  • 工作原理:解析、连接、传输、执行、收集结果
  • 核心概念:Inventory、Modules、Playbooks、Roles
  • 应用场景:配置管理、应用部署、基础设施编排

1.11 练习题

基础练习

  1. 概念理解

    • 解释 Ansible 无代理架构的优势
    • 描述 Ansible 的执行流程
    • 比较 Ansible 与其他配置管理工具的差异
  2. 架构分析

    • 画出 Ansible 的架构图
    • 说明控制节点和被管理节点的职责
    • 解释模块在 Ansible 中的作用

思考题

  1. 场景分析

    • 在什么情况下选择 Ansible 而不是其他自动化工具?
    • 如何设计一个大型企业的 Ansible 架构?
    • Ansible 在云原生环境中的应用场景有哪些?
  2. 最佳实践

    • 如何确保 Ansible Playbook 的幂等性?
    • 在生产环境中使用 Ansible 需要注意哪些安全问题?
    • 如何优化 Ansible 的执行性能?

下一章第2章:安装与环境配置

返回目录Ansible 自动化运维教程