Ansible 适合在没有客户端代理的环境下做批量配置管理和应用部署,入门建议从临时的 ad-hoc 命令开始,再过渡到 playbook 编排。
先说结论:它是基于 SSH 的无代理工具,控制节点安装后即可管理远程主机,无需在被管服务器安装额外软件。
- 适合:多台 Linux 服务器的批量配置、应用发布或命令执行。
- 先看:控制节点需安装 Python 和 Ansible,被管节点需开放 SSH 并具备 Python 环境(多数 Linux 发行版默认自带)。
- 建议:先用手脚命令测试连通性,再编写 YAML 格式的 playbook 固化流程,注意权限提升配置。
环境准备与安装
在控制节点(发起管理的机器)上安装 Ansible。为避免污染系统 Python 环境,建议优先使用系统包管理器,或使用 pip 的 user 模式。
方式一:系统包管理器(推荐)
# Ubuntu/Debian sudo apt update && sudo apt install ansible # CentOS/RHEL 8+ sudo dnf install ansible
方式二:pip 安装(需注意权限)
python3 -m pip install `--user` ansible
安装完成后,验证版本:ansible `--version`。
主机清单与 SSH 配置
1. 配置主机清单
创建一个名为 hosts 的文件,定义要管理的机器 IP 或域名。
[webservers] 192.168.1.10 192.168.1.11
2. 配置 SSH 免密
为了自动化,建议配置 SSH Key 认证。使用 ssh-copy-id 将公钥发送到目标机器。
ssh-copy-id user@192.168.1.10
3. 测试连通性
使用 ping 模块测试,这里的 ping 不是网络 ping,而是 Ansible 的连通性检查。
ansible webservers -m ping -i hosts
配置文件 ansible.cfg
Ansible 会读取当前目录或 /etc/ansible/ansible.cfg 下的配置。初学者可在项目目录下创建 ansible.cfg 以覆盖默认设置。
[defaults] inventory = ./hosts host_key_checking = False retry_files_enabled = False
安全警告:host_key_checking = False 仅建议在测试环境使用,它会跳过 SSH 主机密钥验证,存在中间人攻击风险。生产环境请手动管理 known_hosts 或使用 ssh-keyscan 预先收集密钥。
编写 Playbook
创建一个 YAML 文件(如 site.yml),定义任务序列。注意不同操作系统的包管理器模块不同,且系统配置通常需要提权。
示例 1:CentOS/RHEL 使用 yum 模块
---
- hosts: webservers
become: true
tasks:
- name: Install nginx on RHEL
yum:
name: nginx
state: present
示例 2:Ubuntu/Debian 使用 apt 模块
---
- hosts: webservers
become: true
tasks:
- name: Install nginx on Debian
apt:
name: nginx
state: present
update_cache: yes
关键参数说明:
become: true:相当于 sudo,用于获取 root 权限执行安装或配置修改。state: present:确保软件包已安装,体现幂等性。
验证与检查
1. 预演模式
执行 playbook 时加上 `--check` 参数可以预演,不会实际修改系统。
ansible-playbook site.yml `--check`
观察返回颜色:绿色代表无变更,黄色代表执行了变更,红色代表失败。
2. 实际执行与状态检查
去掉 `--check` 正式执行。登录目标机器检查服务状态,例如 systemctl status nginx。
常见坑与安全风险
- SSH 主机密钥验证:第一次连接可能会因为 host key 验证失败而报错。生产环境严禁直接关闭检查,建议使用
ssh-keyscan -H target_ip >> ~/.ssh/known_hosts预先添加信任。 - 目标机 Python 版本:Ansible 依赖目标机上有 Python 解释器(通常是 Python 2.7 或 3.x),部分精简版系统(如 Alpine)可能需要手动安装 Python 或指定解释器路径。
- 权限问题:修改系统配置通常需要 root 权限,忘记配置
become: true或命令加`--become`会导致权限拒绝错误。 - 安装源污染:避免直接使用
sudo pip install ansible,这可能破坏系统依赖。优先使用系统包管理器或`--user`参数。