Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Ansible 基础教程

以下是一份 超完整、系统化、可用于生产的 Ansible 详细介绍,包含核心概念、架构、最佳实践、常用模块、目录结构示例、Playbook 设计规范,以及适合你 Kubernetes / Linux / DevOps 场景的实战建议。

🧩 一、Ansible 是什么?

Ansible = 自动化运维 + 配置管理 + 应用部署 + 编排工具

特点:

  • Agentless(无客户端):被管理节点通过 SSH 或 WinRM,不需要安装客户端程序
  • Idempotent(幂等):多次执行结果一致(自动判断是否需要改变)
  • Declarative(声明式):写“想要的状态”,由 Ansible 负责实现
  • Simple(易上手):核心用 YAML
  • Extensible(扩展性强):模块、插件、角色体系非常灵活
  • 适合多平台:Linux、Unix、Windows、网络设备(Cisco、Juniper)、云平台(AWS、AliCloud)

适用于:

  • 服务器一键初始化
  • Kubernetes 集群部署
  • CI/CD 环境自动化
  • 应用发布(Nginx、MySQL、Redis、PostgreSQL、Docker)
  • 防火墙 / 网络设备配置
  • 批量作业执行(like SaltStack, but agentless)

🛠️ 二、Ansible 的架构

Ansible Controller(控制节点)
    |
    |—— SSH / WinRM / API
    |
Managed Hosts(被管节点)

核心组成:

组件 说明
Inventory 主机清单(主机组、变量)
Module 执行任务的功能模块(核心)
Play 定义“对哪些主机执行哪些任务”
Playbook YAML 文件,包含多个 Play
Role 结构化脚本集合(模板、变量、任务)
Facts 自动收集系统信息(CPU/Mem/OS/网卡)
Plugins 执行插件,如 connection、lookups、filters

📦 三、Ansible Inventory(主机清单)

基础写法:

[web]
192.168.1.10
192.168.1.11

[db]
db01 ansible_host=192.168.1.20 ansible_user=root

分组嵌套:

[prod:children]
web
db

Group Vars:

# group_vars/web.yml
http_port: 80
max_clients: 200

Host Vars:

# host_vars/db01.yml
mysql_port: 3306

🎯 四、Module(模块)

Ansible 的核心是模块。常用模块分类如下:

📌 1. 系统管理

模块 作用
shell / command 执行命令(非优先,尽量用专用模块)
user / group 管理用户、权限
service 管理系统服务
cron 定时任务
lineinfile 修改配置文件中特定行
copy / template 上传文件与模板

📌 2. 文件与目录

模块 作用
file 创建目录、软链、修改权限
unarchive 解压文件
synchronize rsync 同步

📌 3. 软件包

模块 作用
yum RHEL/CentOS
apt Ubuntu/Debian
package 通用接口

📌 4. 数据库

模块 用途
mysql_db / mysql_user MySQL 相关
postgresql_db / postgresql_user PostgreSQL
mongodb_user MongoDB

📌 5. 云平台与容器

模块 用途
docker_container 创建/管理 Docker 容器
docker_image 拉取镜像
k8s Kubernetes 资源管理

⭐ 五、Playbook 结构

例子:部署 Nginx

- name: Install Nginx
  hosts: web
  become: yes

  tasks:
    - name: Install package
      apt:
        name: nginx
        state: present

    - name: Copy nginx conf
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx

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

特点:

  • 幂等
  • 自动触发 handler
  • 模块化配置

♻️ 六、Roles(生产强烈推荐)

Roles = 完整的软件部署模板。

结构:

roles/
  nginx/
    tasks/
    templates/
    files/
    vars/
    handlers/
    meta/

使用方式:

- hosts: web
  roles:
    - nginx

你项目里每个服务建议用一个 Role:mysql、redis、kubelet、docker、node-exporter…

⚙️ 七、Ansible Galaxy(官方/社区角色市场)

安装社区 Nginx 角色:

ansible-galaxy install geerlingguy.nginx

你可以快速获取官方最佳实践结构。

🧪 八、Ansible 实战技巧(给你 Kubernetes/DevOps 场景)

1. 一键初始化服务器

  • 设置 hostname
  • 禁用 swap(Kubernetes 要求)
  • 优化 sysctl
  • 配置 limits
  • 安装基本软件包
  • 配置时区
  • 配置 Docker / Containerd

写一个 init_server role 即可。

2. Kubernetes 集群部署

你可以使用 Ansible:

  • 部署 K8s(kubeadm)
  • 部署 Calico / Cilium
  • 自动生成 kubeadm-config.yaml
  • 同步证书
  • 升级集群

非常适合 Calico/kube-proxy 调优场景。

3. 应用发布(Nginx/MySQL/Redis/PostgreSQL)

结合以下模块:

  • template 生成配置
  • service 管理服务
  • synchronize 部署静态文件
  • docker_container 托管应用

📚 九、生产级最佳实践

避免使用 shell/command

除非没有模块可用,否则不要用 shell。

使用 roles 结构化项目

生产环境推荐:

project/
  inventories/
  roles/
  playbooks/
  group_vars/
  host_vars/

使用 Vault 加密密码

例如数据库密码:

ansible-vault encrypt group_vars/prod/db.yml

使用 tags 控制执行

例如只做初始化:

ansible-playbook site.yml --tags init

避免把变量写死,使用 group_vars

🏗️ 十、推荐目录结构(企业级)

ansible/
  inventories/
    prod/
      hosts
      group_vars/
      host_vars/
    staging/
  playbooks/
    site.yml
    init.yml
    deploy.yml
  roles/
    common/
    docker/
    node_exporter/
    nginx/
    mysql/
    redis/

📦 十一、常用命令

ansible all -m ping
ansible-playbook site.yml -i inventories/prod/hosts
ansible-vault encrypt file.yml
ansible-playbook --list-hosts site.yml
ansible-playbook --tags init init.yaml