Ansible 是一款开源的自动化运维工具,可用于配置管理、应用部署、任务自动化等。它基于 SSH 协议,无需在被控端安装客户端,非常适合轻量级、安全的批量操作。
本文将演示如何在 Ubuntu 主机(控制节点) 上使用 Ansible 对 另外两台 Ubuntu 主机(被控节点) 进行统一管理,共涉及 3 台机器。
核心定义与架构
- 开源属性 :由Michael DeHaan于2012年开发,2015年被Red Hat收购,是**无代理(Agentless)**的自动化工具,通过SSH/WinRM协议与受控节点通信。
- 技术栈:基于Python开发,集成Puppet、Chef等工具优势,支持Linux、Windows、网络设备等多平台管理。
- 架构特点 :
- 控制节点(Control Node):执行Ansible命令或Playbook,需安装Python和Ansible软件。
- 受控节点(Managed Nodes):无需安装客户端,仅需开启SSH服务并配置免密登录。
- 模块化设计 :通过模块(如
copy、service、yum)实现具体操作,支持自定义模块开发。
核心功能与场景
- 批量操作 :
- Ad-Hoc命令 :临时执行单条任务(如
ansible all -m ping测试连通性)。 - Playbook编排:通过YAML文件定义多任务流程(如部署Nginx、配置防火墙)。
- Ad-Hoc命令 :临时执行单条任务(如
- 配置管理 :
- 统一管理主机清单(Inventory),支持分组、变量定义(如
[web] 192.168.1.10 http_port=80)。 - 模板引擎(Jinja2)动态生成配置文件(如Nginx配置)。
- 统一管理主机清单(Inventory),支持分组、变量定义(如
- 应用部署 :
- 自动化安装软件包(如
ansible web -m yum -a "name=nginx state=present")。 - 服务启停与状态管理(如
ansible db -m service -a "name=mysql state=started")。
- 自动化安装软件包(如
- 高级特性 :
- Roles :模块化组织Playbook,实现代码复用(如
roles/nginx/tasks/main.yml)。 - Vault:加密敏感数据(如密码、API密钥)。
- 动态Inventory:集成云平台(AWS、Azure)或CMDB自动生成主机列表。
- Roles :模块化组织Playbook,实现代码复用(如
安装与配置
- 安装方式 :
- Linux :通过包管理器(如
yum install ansible)或pip安装。 - Windows:使用WSL或直接安装,需配置PowerShell远程管理。
- Linux :通过包管理器(如
- 关键配置 :
- 主机清单 :
/etc/ansible/hosts或自定义文件,定义主机分组与变量。 - SSH免密 :通过
ssh-keygen生成密钥,使用ssh-copy-id分发公钥。 - 配置文件 :
ansible.cfg调整并发数、超时时间、日志路径等参数。
- 主机清单 :
对比SaltStack
- 架构差异 :
- Ansible:无代理架构,依赖SSH,适合中小规模或快速部署场景。
- SaltStack:基于Minion代理,支持事件驱动,适合大规模高并发场景。
- 学习曲线 :
- Ansible的YAML Playbook更易上手,适合DevOps初学者。
- SaltStack的Jinja模板和状态系统更灵活,适合复杂环境。
一、实验环境说明
| 主机角色 | IP 地址 | 主机名 | 系统版本 |
|---|---|---|---|
| 控制节点 | 192.168.22.103 | ansible | Ubuntu 22.04 |
| 被控节点1 | 192.168.22.131 | node1 | Ubuntu 22.04 |
| 被控节点2 | 192.168.22.215 | node2 | Ubuntu 22.04 |
二、在控制节点安装 Ansible
-
更新系统软件包:
sudo apt update
-
安装 Ansible:
sudo apt install -y ansible
-
验证安装:
ansible --version

三、配置 SSH 免密登录
为实现自动化,控制节点需能无密码 SSH 登录到被控节点。
-
在控制节点生成 SSH 密钥:
ssh-keygen -t rsa -b 4096
-
将公钥复制到两台被控节点:
ssh-copy-id xxx@192.168.22.131
ssh-copy-id xxx@192.168.22.215
用户名为 xxx,请根据实际情况修改。
-
测试免密登录:
四、配置 Ansible Inventory
创建一个 inventory 文件来定义被控主机。
mkdir ~/ansible-demo && cd ~/ansible-demo
创建文件 inventory.ini:
[webservers]
node1 ansible_host=192.168.22.131 ansible_user=xxx
node2 ansible_host=192.168.22.215 ansible_user=xxx
[webservers] 是主机组名,可自定义
五、测试连通性
使用 ping 模块测试 Ansible 是否能连接到所有节点:
ansible -i inventory.ini webservers -m ping
输出类似:

六、编写并运行 Playbook
创建一个简单的 Playbook,用于在所有被控节点上安装 nginx 并启动服务。
创建文件 install_nginx.yml:
---
- name: Install and start Nginx on webservers
hosts: webservers
become: yes
tasks:
- name: Update apt cache
apt:
update_cache: yes
- name: Install nginx
apt:
name: nginx
state: present
- name: Ensure nginx is running
service:
name: nginx
state: started
enabled: yes
运行 Playbook:
ansible-playbook -i inventory.ini install_nginx.yml
如果执行失败可能是权限问题,需要提权

✅ 解决方法(二选一)
✅ 方法一:【推荐】在 node1 和 node2 上为用户配置 免密 sudo
登录到 node1:
ssh xxx@192.168.22.131
执行(替换 xxx 为你的实际用户名):
echo "xxx ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/xxx
同样操作 node2:
ssh xxx@192.168.22.215
echo "xxx ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/xxx
返回控制机,直接运行 playbook
ansible-playbook -i inventory.ini install_nginx.yml

✅ 方法二:运行时手动输入 sudo 密码(临时用)
如果你不想改 sudo 配置 ,可以用 -K 参数:
ansible-playbook -i inventory.ini install_nginx.yml -K
需要输入 node1 和 node2 上用户 xxx 的 sudo 密码
⚠️ 注意:此方法要求所有主机的 sudo 密码完全一致。如果密码不同,会有一台失败。

成功后,访问 http://192.168.22.131 和 http://192.168.22.215 可以看到 Nginx 欢迎页。

七、扩展建议
- 使用
group_vars和host_vars管理不同主机的变量。 - 结合 Roles 实现更复杂的项目结构。
- 使用 Vault 加密敏感信息。
- 集成 CI/CD 工具实现自动化部署。
通过本次在 Ubuntu 环境中使用 Ansible 管理三台主机的实践,我们不仅完成了 SSH 免密登录配置、Inventory 编写、Playbook 编排等基础操作,还深入理解了 become 权限机制与常见错误的排查方法。自动化运维并非遥不可及------只需几步配置,就能告别重复的手动操作,让部署更高效、更可靠。