Ansible 是轻量无代理自动化工具,用 YAML 编写 playbook,支持批量部署与配置管理;控制端需 Python 3.6+ 和 ansible,被控端仅需 SSH;通过 inventory 分组主机,playbook 具幂等性,可变量化、模板化及加密敏感信息。

Ansible 是一款轻量、无代理(agentless)的自动化运维工具,适合批量部署、配置管理与任务编排。它用 YAML 写 playbook,语法简洁,学习门槛低,特别适合中小规模 Linux 环境的日常运维。
环境准备:控制端与被控端基础配置
Ansible 控制机需安装 Python 3.6+ 和 ansible 命令行工具;被控节点只需开启 SSH 服务并允许密钥登录(推荐免密),无需安装额外软件。
- 在控制机执行 pip3 install ansible 或使用系统包管理器(如 apt install ansible / yum install ansible)
- 生成 SSH 密钥对:ssh-keygen -t ed25519,再用 ssh-copy-id user@host 分发公钥到各目标主机
- 编辑 /etc/ansible/hosts 或自定义 inventory 文件,按组组织主机,例如:
[web] 192.168.1.10 192.168.1.11[db] 192.168.1.20
第一个 playbook:批量同步时间与更新系统
用一个 YAML 文件完成多台机器的时间同步(chrony)和安全补丁升级,体现 Ansible 的幂等性——重复运行不会引发异常。
- 新建 update.yml,内容如下:
- name: Update servers and sync time
hosts: all
become: true
tasks:
- name: Install chrony
apt:
name: chrony
state: present
when: ansible_facts['os_family'] == "Debian"
- name: Enable and start chronyd
systemd:
name: chronyd
enabled: true
state: started
when: ansible_facts['os_family'] == "RedHat"
- name: Sync system time
command: chronyc -a makestep
args:
executable: /bin/bash
ignore_errors: true
- name: Update packages
apt:
upgrade: dist
update_cache: true
when: ansible_facts['os_family'] == "Debian"
- name: Update yum packages
yum:
name: "*"
state: latest
when: ansible_facts['os_family'] == "RedHat"- 执行命令:ansible-playbook -i hosts update.yml
- 加 --limit web 可限定只操作 web 组;加 -C 参数可预演(check mode),不真正执行
实用技巧:变量管理与模板化配置
避免硬编码,把 IP、路径、版本号等提取为变量,配合 Jinja2 模板生成差异化配置文件。
- 在 playbook 同级建 group_vars/all.yml 定义全局变量,如:nginx_version: "1.24.0"
- 用 template 模块推送带变量的配置,比如 nginx.conf.j2 中写 worker_processes {{ ansible_processor_vcpus }};
- 任务中调用:template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- 也可用 vars_prompt 实现交互式输入,适合临时指定密码或分支名
故障排查与调试建议
Ansible 报错时优先看任务返回状态、SSH 连通性、权限是否足够(become 是否启用)、YAML 缩进是否正确(必须空格,不可 Tab)。
- 加 -vvv 查看详细日志,定位是连接失败、模块参数错误,还是远程命令退出码非 0
- 用 ansible all -m ping 快速验证 inventory 中所有主机是否可达
- 单步调试可用 debug 模块输出变量:- debug: var=ansible_facts['distribution']
- 敏感信息(如数据库密码)不要写进 playbook,改用 ansible-vault 加密变量文件










