Ansible 自动化运维:无代理配置管理

FreeGuideOnline 最新 2026-06-13

Ansible 自动化运维完全入门指南

在手动运维向自动化转型的过程中,Ansible 凭借其无代理(Agentless) 的架构脱颖而出。本教程将带你从零基础开始,掌握使用 Ansible 进行配置管理、应用部署和任务编排的核心技能。

什么是 Ansible

Ansible 是一款开源的 IT 自动化工具,能够帮助你以声明式的方式管理服务器配置、部署应用、编排复杂的运维流程。它仅需在控制节点上安装,被管理节点只需支持 SSH 和 Python,无需额外安装代理程序。

无代理架构的优势:

  • 轻量级:受管主机无需维护额外的守护进程,减少资源消耗。
  • 安全:使用标准 SSH 传输,无需开放新的端口,也可集成现有密钥管理。
  • 简单:降低学习曲线和部署复杂度,新机器加入管理只需配置好 SSH 访问。
  • 幂等性:大部分 Ansible 模块天然支持幂等,即重复执行同一任务只会将系统调整为期望状态,不会多次执行。

快速安装 Ansible

控制节点要求:Python 3.9+,本教程以 Linux(Ubuntu/CentOS)环境为例。

在 Ubuntu / Debian 上安装

sudo apt update
sudo apt install ansible

在 CentOS / RHEL / Fedora 上安装

sudo yum install epel-release
sudo yum install ansible

通过 pip 安装(跨发行版)

pip install ansible

安装完成后验证版本:

ansible --version

核心概念速览

在编写第一个自动化任务前,先理解三个核心组件:

  • Inventory(资产清单):定义受管主机的列表,可分组。
  • Module(模块):Ansible 执行具体工作的单元,例如 copyyumservice
  • Playbook(剧本):YAML 格式的编排文件,定义要在哪些主机上执行哪些模块,以及执行的顺序和条件。

编写你的第一个 Inventory

创建 hosts.ini 文件:

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com ansible_user=admin
  • [webservers][dbservers] 为组名,便于批量操作。
  • 主机后可以添加连接参数,如 ansible_useransible_port 等。

基础测试:使用 ping 模块检测连通性

ansible all -i hosts.ini -m ping

如果返回 "pong",说明 SSH 密钥已配置成功。


编写第一个 Playbook

创建文件 install_nginx.yml

---
- name: 安装并启动 Nginx
  hosts: webservers
  become: yes                     # 使用 sudo 提权
  tasks:
    - name: 安装 nginx 包
      apt:
        name: nginx
        state: present
      when: ansible_os_family == "Debian"

    - name: 安装 nginx 包(CentOS)
      yum:
        name: nginx
        state: present
      when: ansible_os_family == "RedHat"

    - name: 确保服务运行并开机自启
      service:
        name: nginx
        state: started
        enabled: yes

解释:

  • hosts: webservers:针对清单中 webservers 组执行。
  • become: yes:提权执行任务。
  • tasks 列表内的每个项包含一个模块调用,name 为可读描述。
  • when 条件确保在不同系统使用正确的包管理器。

执行 Playbook:

ansible-playbook -i hosts.ini install_nginx.yml

常用模块详解

Ansible 拥有数百个内置模块,以下是运维中最高频的几个:

1. 文件管理模块

copy – 将控制节点文件拷贝到远程

- name: 上传配置文件
  copy:
    src: /path/to/local.conf
    dest: /etc/myapp/config.conf
    owner: root
    group: root
    mode: '0644'

template – 使用 Jinja2 模板动态生成文件

- name: 从模板生成配置
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: restart nginx

2. 包管理模块

apt / yum – 安装、更新、移除软件包

- name: 安装 Git
  apt:
    name: git
    state: latest
    update_cache: yes

3. 服务管理模块

service / systemd – 控制服务状态

- name: 启动 Docker
  systemd:
    name: docker
    state: started
    enabled: yes

4. 命令执行模块

command / shell – 直接执行命令(注意非幂等,优先使用专用模块)

- name: 检查磁盘空间
  command: df -h
  register: disk_usage
- name: 打印结果
  debug:
    var: disk_usage.stdout_lines

5. 用户与权限模块

user – 创建/删除用户

- name: 创建运维账户
  user:
    name: ops
    groups: sudo
    shell: /bin/bash
    state: present

变量与事实(Facts)

变量使 Playbook 更加灵活。可以在 Playbook 内定义,也可从外部文件引入:

vars:
  http_port: 8080
  app_version: 1.2.3

tasks:
  - name: 使用变量
    debug:
      msg: "端口 {{ http_port }}, 版本 {{ app_version }}"

Facts 是 Ansible 自动收集的远程主机信息(IP、系统版本、内核等)。可直接使用:

- name: 打印系统发行版
  debug:
    var: ansible_distribution

关闭事实收集可提升速度(适用于低负载任务):

- hosts: all
  gather_facts: no

条件判断与循环

when 语句实现条件执行:

- name: 仅 Debian 系统执行
  apt:
    name: apache2
    state: present
  when: ansible_os_family == "Debian"

循环loop 处理列表:

- name: 安装多个包
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - vim
    - curl
    - htop

结合字典循环:

- name: 批量创建用户
  user:
    name: "{{ item.username }}"
    groups: "{{ item.groups }}"
  loop:
    - { username: 'alice', groups: 'developers' }
    - { username: 'bob', groups: 'admin' }

Handlers:按需触发的任务

Handlers 仅在收到 notify 通知时运行,常用于服务重启:

tasks:
  - name: 修改 Nginx 配置
    template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf
    notify: Reload Nginx

handlers:
  - name: Reload Nginx
    service:
      name: nginx
      state: reloaded

无论一个 Play 中有多少次通知,Handler 只会在所有任务执行完毕之后运行一次。


使用角色(Roles)组织项目

当 Playbook 越来越复杂时,应使用角色(Roles)来模块化代码。标准角色目录结构如下:

roles/
  webserver/
    tasks/
      main.yml
    handlers/
      main.yml
    templates/
      nginx.conf.j2
    files/
      index.html
    vars/
      main.yml
    defaults/
      main.yml

在 Playbook 中引用角色:

- hosts: webservers
  roles:
    - webserver

角色让配置可复用、可共享,推荐使用 ansible-galaxy 从 Ansible Galaxy 社区获取现成角色:

ansible-galaxy install geerlingguy.nginx

实战:用 Ansible 部署简单 Web 应用

以下 Playbook 将完成:

  • 安装 Nginx
  • 部署自定义首页
  • 保证服务运行

目录结构:

.
├── hosts.ini
├── web.yml
├── templates/
│   └── index.html.j2

templates/index.html.j2:

<html>
<body>
<h1>自动化部署成功!</h1>
<p>主机名: {{ ansible_hostname }}</p>
<p>当前时间: {{ ansible_date_time.iso8601 }}</p>
</body>
</html>

web.yml:

---
- name: 部署 Web 服务器
  hosts: webservers
  become: yes
  vars:
    nginx_port: 80

  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: latest
      when: ansible_os_family == "Debian"

    - name: 安装 Nginx (RedHat)
      yum:
        name: nginx
        state: latest
      when: ansible_os_family == "RedHat"

    - name: 上传首页模板
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
      notify: restart nginx

    - name: 开放防火墙端口(UFW)
      ufw:
        rule: allow
        port: "{{ nginx_port }}"
        proto: tcp

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

运行:

ansible-playbook -i hosts.ini web.yml

进阶学习路径

  • Ansible Vault:加密敏感数据(如密码、API密钥)。
  • AWX / Ansible Tower:提供 Web 界面、作业调度和 RBAC。
  • 动态 Inventory:云环境(AWS、Azure)中根据标签自动发现主机。
  • 自定义模块:用 Python 扩展 Ansible 功能。
  • 效率优化:启用 pipelining、调整 forks、使用 async 任务。

常见问题排查

1. SSH 连接失败

  • 确保 SSH 密钥已复制:ssh-copy-id user@host
  • 可用 --private-key 指定密钥文件
  • 临时测试连接:ssh -o StrictHostKeyChecking=no user@host

2. 权限不足

  • 添加 become: yes 和正确的 become_mthod(默认为 sudo)
  • 目标用户需在 sudoers 文件中或无密码 sudo 配置

3. 找不到 Python

  • 对于极简系统,先执行 raw 模块安装 Python:
    - name: 安装 Python 环境
      raw: apt-get update && apt-get install -y python3
    

4. Playbook 语法错误

  • 使用 ansible-playbook --syntax-check 提前检查
  • 确保 YAML 缩进使用空格,不用 Tab

Ansible 的“无代理”设计让它成为混合环境、多云和容器化场景下的理想选择。从几台到几千台服务器,掌握本教程中的核心概念后,你已具备用代码定义基础设施的基本能力。立即动手搭建实验环境,把重复的运维工作自动化起来。