它解决什么

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:  改文件里的某一行

推荐阅读

下一篇:多环境模式——dev / staging / prod 怎么隔离 + 保持一致。