它解决什么
Terraform 把机器建出来——但机器里要装哪些包、跑哪些服务、放哪些配置文件,IaC 不管。这块是配置管理:
- Ansible
- Puppet
- Chef
- SaltStack
选型层面:Ansible 在社区活跃度和上手门槛上通常领先(无 Agent + YAML),近几年新项目选它的较多;Puppet / Chef 仍有大量 legacy 部署在维护;SaltStack 在需要事件驱动 / 大规模 push 的场景里仍有人选。具体选型要结合团队既有技能和已存在的工具栈,没有"绝对正确"。
Ansible 的两个核心特征
1. 无 Agent
通过 SSH 把命令推到目标机器跑。不需要在目标机器装 Daemon,比 Puppet/Chef 易上手。
2. 幂等
同一个 playbook 跑 1 次和 100 次结果一样:
- 包没装就装;装了就跳过
- 文件已经长这样就不管;不一样才改
- 服务在跑就不动;没跑就启动
三个组件
| 组件 | 是什么 |
|---|---|
| Inventory | 目标机器列表,按组分类 |
| Playbook | "对哪些机器做什么"的 YAML 描述 |
| Role | 可复用的 playbook 单元 |
inventory.yml
all:
children:
web:
hosts:
web1: { ansible_host: 1.2.3.4 }
web2: { ansible_host: 1.2.3.5 }
db:
hosts:
db1: { ansible_host: 1.2.3.6 }
vars:
ansible_user: wadely
ansible_ssh_private_key_file: ~/.ssh/id_ed25519
playbook.yml
- hosts: web
become: yes
tasks:
- name: 装 nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 拷贝配置
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
- name: 起 nginx
service:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
service: { name: nginx, state: restarted }
跑:
ansible-playbook -i inventory.yml playbook.yml
Role:把上面的拆成可复用单元
roles/
└── nginx/
├── tasks/main.yml # 步骤
├── handlers/main.yml # 触发器
├── templates/ # Jinja2 模板
├── defaults/main.yml # 默认变量
└── vars/main.yml
playbook 里只写:
- hosts: web
roles:
- nginx
- app
社区有 Ansible Galaxy 大量现成 role,但生产用前要审一遍——质量参差。
何时用 Ansible,何时不用
适合:
- 配置已存在的机器(VM / 物理机)
- 一次性运维任务(批量打补丁、收集信息)
- 应用部署(小到中型项目)
不适合:
- 创建云资源(用 Terraform)
- 大规模动态环境(K8s 已经管了)
- 需要 push 之外的实时编排(用 SaltStack 或 K8s)
容器化时代 Ansible 还有用吗
- 容器内:Dockerfile 替代了大部分配置管理
- 主机层:仍然要配 Docker、Nginx、cron、SSH——Ansible 在这层不可替代
- 混合环境(K8s + 传统 VM):很多公司用 Ansible 管"K8s 节点的非 K8s 部分"
几个常用模块
- copy: 把文件传过去
- template: Jinja2 渲染后传过去(带变量)
- apt / yum: 装包
- service: 起停服务
- user: 建用户
- file: 改权限 / 软链
- command: 跑任意命令(最后选项,破坏幂等)
- shell: 同上
- lineinfile: 改文件里的某一行
推荐阅读
- Ansible 官方文档 — 模块文档非常全
- Ansible for DevOps (Jeff Geerling) — 业内最系统的 Ansible 实战书
- Ansible Best Practices — 官方建议
- Ansible Galaxy — 社区 role 仓库(用前审)
下一篇:多环境模式——dev / staging / prod 怎么隔离 + 保持一致。