Ansible 基础教程
以下是一份 超完整、系统化、可用于生产的 Ansible 详细介绍,包含核心概念、架构、最佳实践、常用模块、目录结构示例、Playbook 设计规范,以及适合你 Kubernetes / Linux / DevOps 场景的实战建议。
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 Controller(控制节点)
|
|—— SSH / WinRM / API
|
Managed Hosts(被管节点)
核心组成:
| 组件 | 说明 |
|---|---|
| Inventory | 主机清单(主机组、变量) |
| Module | 执行任务的功能模块(核心) |
| Play | 定义“对哪些主机执行哪些任务” |
| Playbook | YAML 文件,包含多个 Play |
| Role | 结构化脚本集合(模板、变量、任务) |
| Facts | 自动收集系统信息(CPU/Mem/OS/网卡) |
| Plugins | 执行插件,如 connection、lookups、filters |
基础写法:
[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
Ansible 的核心是模块。常用模块分类如下:
| 模块 | 作用 |
|---|---|
| shell / command | 执行命令(非优先,尽量用专用模块) |
| user / group | 管理用户、权限 |
| service | 管理系统服务 |
| cron | 定时任务 |
| lineinfile | 修改配置文件中特定行 |
| copy / template | 上传文件与模板 |
| 模块 | 作用 |
|---|---|
| file | 创建目录、软链、修改权限 |
| unarchive | 解压文件 |
| synchronize | rsync 同步 |
| 模块 | 作用 |
|---|---|
| yum | RHEL/CentOS |
| apt | Ubuntu/Debian |
| package | 通用接口 |
| 模块 | 用途 |
|---|---|
| mysql_db / mysql_user | MySQL 相关 |
| postgresql_db / postgresql_user | PostgreSQL |
| mongodb_user | MongoDB |
| 模块 | 用途 |
|---|---|
| docker_container | 创建/管理 Docker 容器 |
| docker_image | 拉取镜像 |
| k8s | Kubernetes 资源管理 |
例子:部署 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/
nginx/
tasks/
templates/
files/
vars/
handlers/
meta/
使用方式:
- hosts: web
roles:
- nginx
你项目里每个服务建议用一个 Role:mysql、redis、kubelet、docker、node-exporter…
安装社区 Nginx 角色:
ansible-galaxy install geerlingguy.nginx
你可以快速获取官方最佳实践结构。
- 设置 hostname
- 禁用 swap(Kubernetes 要求)
- 优化 sysctl
- 配置 limits
- 安装基本软件包
- 配置时区
- 配置 Docker / Containerd
写一个 init_server role 即可。
你可以使用 Ansible:
- 部署 K8s(kubeadm)
- 部署 Calico / Cilium
- 自动生成 kubeadm-config.yaml
- 同步证书
- 升级集群
非常适合 Calico/kube-proxy 调优场景。
结合以下模块:
- template 生成配置
- service 管理服务
- synchronize 部署静态文件
- docker_container 托管应用
除非没有模块可用,否则不要用 shell。
生产环境推荐:
project/
inventories/
roles/
playbooks/
group_vars/
host_vars/
例如数据库密码:
ansible-vault encrypt group_vars/prod/db.yml
例如只做初始化:
ansible-playbook site.yml --tags init
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