Ansible 简介 #

什么是 Ansible? #

Ansible 是一个开源的 IT 自动化平台,用于配置管理、应用部署、任务编排和云服务管理。它由 Michael DeHaan 于 2012 年创建,2015 年被 Red Hat 收购。Ansible 的设计理念是简单、强大、无代理,让自动化变得触手可及。

核心定位 #

text
┌─────────────────────────────────────────────────────────────┐
│                         Ansible                              │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  配置管理    │  │  应用部署    │  │  任务编排    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  云服务管理   │  │  安全合规    │  │  持续交付    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

Ansible 的历史 #

发展历程 #

text
2012年 ─── Ansible 项目启动
    │
    │      Michael DeHaan 创建
    │      灵感来自 Func 和 Puppet
    │
2013年 ─── AnsibleWorks 公司成立
    │
    │      商业化运营
    │      企业级支持
    │
2015年 ─── Red Hat 收购
    │
    │      成为企业级标准
    │      集成到 Red Hat 生态
    │
2017年 ─── Ansible Tower 集成
    │
    │      可视化管理界面
    │      RBAC 权限控制
    │
2020年 ─── Ansible Automation Platform
    │
    │      统一自动化平台
    │      内容集合
    │
至今   ─── 行业标准
    │
    │      超过 5000+ 模块
    │      活跃的社区贡献

里程碑版本 #

版本 时间 重要特性
1.0 2012 首次发布,基础功能
1.2 2013 引入 Roles 概念
1.7 2014 Windows 支持
2.0 2015 新执行引擎、Blocks
2.2 2016 动态 Inventory 改进
2.5 2018 新 API、模块增强
2.9 2019 稳定性增强
2.10 2020 集合机制引入
2.14 2022 性能优化

为什么选择 Ansible? #

传统运维的痛点 #

在没有 Ansible 之前,IT 运维面临以下问题:

bash
# 手动登录每台服务器
ssh user@server1
ssh user@server2
ssh user@server3

# 重复执行相同命令
sudo apt update
sudo apt install nginx
sudo systemctl start nginx

# 配置文件手动修改
vim /etc/nginx/nginx.conf

# 难以追踪变更
# 容易出错
# 不可重复

Ansible 的解决方案 #

yaml
# site.yml
- hosts: webservers
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Start Nginx
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Copy configuration
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

Ansible 的核心特点 #

1. 无代理架构 #

Ansible 不需要在被管理节点上安装任何代理软件:

text
┌─────────────────────────────────────────────────────────────┐
│                      控制节点 (Control Node)                  │
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │   Ansible   │  │  Inventory  │  │  Playbooks  │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘
                          │
                    SSH / WinRM
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
   ┌─────────┐       ┌─────────┐       ┌─────────┐
   │ Node 1  │       │ Node 2  │       │ Node 3  │
   │ (SSH)   │       │ (SSH)   │       │ (WinRM) │
   └─────────┘       └─────────┘       └─────────┘
   无需代理          无需代理          无需代理

2. 幂等性 #

多次执行结果一致,不会产生副作用:

yaml
# 第一次执行:创建文件
# 第二次执行:文件已存在,不做任何操作
# 第三次执行:文件已存在,不做任何操作

- name: Create a file
  copy:
    content: "Hello Ansible"
    dest: /tmp/hello.txt

3. 简单易学 #

使用 YAML 语法,人类可读:

yaml
# 非常直观的语法
- name: Install packages
  apt:
    name:
      - nginx
      - mysql-server
      - php
    state: present

4. 声明式配置 #

描述期望状态,而非操作步骤:

yaml
# 声明式:描述期望状态
- name: Ensure Nginx is running
  service:
    name: nginx
    state: started
    enabled: yes

# Ansible 会自动判断:
# - 如果服务未启动,则启动
# - 如果服务已启动,则不做任何操作
# - 如果服务未设置开机启动,则设置

5. 模块化设计 #

丰富的内置模块,覆盖各种场景:

text
┌─────────────────────────────────────────────────────────────┐
│                      Ansible 模块                            │
├─────────────────────────────────────────────────────────────┤
│  系统模块      │  文件模块      │  包管理模块    │  云模块    │
│  ─────────────│  ─────────────│  ─────────────│  ─────────│
│  command      │  copy         │  apt          │  aws_ec2  │
│  shell        │  template     │  yum          │  azure_rm │
│  service      │  file         │  dnf          │  gcp      │
│  user         │  lineinfile   │  pacman       │  docker   │
│  group        │  synchronize  │  pip          │  k8s      │
└─────────────────────────────────────────────────────────────┘

Ansible 与其他工具对比 #

Ansible vs Puppet #

特性 Ansible Puppet
架构 无代理 C/S 架构
语言 YAML Puppet DSL
学习曲线 简单 较陡
配置推送 推送模式 拉取模式
实时执行 支持 需配置

Ansible vs Chef #

特性 Ansible Chef
架构 无代理 C/S 架构
语言 YAML Ruby
学习曲线 简单 较陡
配置方式 Playbook Cookbook
实时执行 支持 需配置

Ansible vs SaltStack #

特性 Ansible SaltStack
架构 无代理 可选代理
语言 YAML YAML + Python
扩展性 中等
性能 中等
学习曲线 简单 中等

Ansible 的应用场景 #

1. 配置管理 #

统一管理服务器配置:

yaml
- hosts: all
  become: yes
  tasks:
    - name: Configure sysctl
      sysctl:
        name: "{{ item.name }}"
        value: "{{ item.value }}"
        state: present
      loop:
        - { name: 'net.core.somaxconn', value: '65535' }
        - { name: 'vm.swappiness', value: '10' }

2. 应用部署 #

自动化部署应用程序:

yaml
- hosts: app_servers
  become: yes
  tasks:
    - name: Deploy application
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main

    - name: Install dependencies
      command: npm install
      args:
        chdir: /var/www/app

    - name: Restart application
      systemd:
        name: app
        state: restarted

3. 持续交付 #

集成到 CI/CD 流程:

yaml
# .gitlab-ci.yml
deploy:
  stage: deploy
  script:
    - ansible-playbook -i inventory deploy.yml
  only:
    - main

4. 云服务管理 #

管理云资源:

yaml
- name: Create EC2 instance
  amazon.aws.ec2_instance:
    name: "web-server"
    key_name: "my-key"
    instance_type: "t3.micro"
    image_id: "ami-12345678"
    region: "us-east-1"
    state: present

5. 安全合规 #

执行安全基线检查:

yaml
- hosts: all
  become: yes
  tasks:
    - name: Ensure SSH is configured securely
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: "{{ item.regexp }}"
        line: "{{ item.line }}"
      loop:
        - { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
        - { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }

Ansible 的核心概念 #

控制节点 #

运行 Ansible 的机器:

text
控制节点
├── Ansible 安装
├── Inventory 文件
├── Playbook 文件
├── 模块
└── 插件

被管理节点 #

被 Ansible 管理的目标机器:

text
被管理节点
├── Linux 服务器
├── Windows 服务器
├── 网络设备
├── 云服务
└── 容器

模块 #

执行具体任务的代码单元:

yaml
- name: Use copy module
  copy:
    src: file.txt
    dest: /tmp/file.txt

- name: Use apt module
  apt:
    name: nginx
    state: present

任务 #

模块调用的最小单位:

yaml
tasks:
  - name: This is a task
    module_name:
      parameter: value

Playbook #

包含多个 Play 的 YAML 文件:

yaml
- name: First Play
  hosts: webservers
  tasks:
    - name: Task 1
      ...

- name: Second Play
  hosts: databases
  tasks:
    - name: Task 2
      ...

Ansible 的工作原理 #

执行流程 #

text
┌─────────────────────────────────────────────────────────────┐
│  1. 读取 Inventory                                           │
│     └── 获取目标主机列表                                      │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  2. 解析 Playbook                                            │
│     └── 读取任务定义                                          │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  3. 收集 Facts                                               │
│     └── 获取目标主机信息                                      │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  4. 生成 Python 脚本                                         │
│     └── 将任务转换为可执行代码                                │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  5. SSH 传输并执行                                           │
│     └── 在目标主机上执行                                      │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  6. 返回执行结果                                             │
│     └── 收集输出并报告                                        │
└─────────────────────────────────────────────────────────────┘

通信方式 #

text
Linux/Unix          Windows
    │                   │
    ▼                   ▼
  SSH               WinRM
    │                   │
    └─────────┬─────────┘
              │
              ▼
        目标主机执行
              │
              ▼
        返回结果

Ansible 的局限性 #

已知限制 #

  1. Windows 控制节点:不支持在 Windows 上运行控制节点
  2. 大规模部署:默认串行执行,大规模场景需优化
  3. 实时性:推送模式,非实时监控
  4. 状态存储:无内置状态数据库

解决方案 #

yaml
# 使用策略插件提高并发
- hosts: all
  strategy: free
  tasks:
    - name: Parallel execution
      ...

# 使用异步任务
- hosts: all
  tasks:
    - name: Long running task
      command: /opt/long_task.sh
      async: 3600
      poll: 0

学习路径 #

text
入门阶段
├── 安装配置
├── 基础概念
├── 清单管理
└── Ad-hoc 命令

进阶阶段
├── Playbook 编写
├── 变量管理
├── 模板使用
└── 常用模块

高级阶段
├── Roles 角色
├── Ansible Vault
├── 自定义模块
└── 性能优化

实战阶段
├── 应用部署
├── 云服务管理
├── CI/CD 集成
└── 最佳实践

下一步 #

现在你已经了解了 Ansible 的基本概念,接下来学习 安装与配置 开始实际使用 Ansible!

最后更新:2026-03-29