Ansible教程:添加被控(受控)节点(Ubuntu) 作者:马育民 • 2026-09-20 10:52 • 阅读:10001 # 环境说明 **控制节点**:安装 ansible 的 Ubuntu(用来下发指令) **受控节点**:另一台 Ubuntu(被管理机器) # 控制原理 ansible 通过 SSH 免密登录受控节点,不需要在受控节点装 ansible,只需要 python3 # 步骤一:SSH 免密登录 ### 1. 生成 SSH 密钥 ```bash ssh-keygen -t rsa ``` 然后敲3次回车,生成密钥,如下图: [](https://www.malaoshi.top/upload/0/3/1GW456jH8QRo.png) ### 2. 将公钥推送到受控节点 ```bash ssh-copy-id user@192.168.58.138 ``` **解释:** - `user`:受控节点用户名;`192.168.58.138`:受控节点IP [](https://www.malaoshi.top/upload/0/3/1GW456o7LDHx.png) 3. 测试免密登录 免密 ssh 登录测试: ```bash ssh user@192.168.58.138 ``` 不需要输入密码,即可正常登录,说明配置成功 # 步骤二:配置 inventory(主机清单) 两种方式: - 简易 `/etc/ansible/hosts` - 自定义 inventory 文件 ### 方式1:自定义 inventory(推荐) 新建 `ansible_client.ini` ```ini [web] 192.168.58.138 ansible_user=user ``` **解释:** - `[web]`:主机组名,可以一次性管理组内所有机器 - `ansible_user`:ssh登录的用户名,可省略 **提示:**执行命令时用 `-i ansible_client.ini` 指定。 ### 方式2:修改默认 hosts ```bash sudo nano /etc/ansible/hosts ``` 在文件末尾添加分组: ```ini [web] 192.168.58.138 ansible_user=user ``` **解释:** - `[web]`:主机组名,可以一次性管理组内所有机器 - `ansible_user`:ssh登录的用户名,可省略 # 步骤三:连通性测试 ### 方式一:自定义inventory文件 ##### 测试所有的组内被控端: ```bash ansible all -m ping -i ansible_client.ini ``` ##### 测试 `web` 组内被控端: ```bash ansible web -m ping -i ansible_client.ini ``` ### 方式二:修改默认 hosts ##### 测试所有的组内被控端: ```bash ansible all -m ping ``` ##### 测试 `web` 组内被控端: ```bash ansible web -m ping ``` ### 返回结果 ```json 192.168.58.138 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } ``` **解释:**出现 `pong` 代表受控节点添加完成! # 常见报错排查 1. **ping失败:SSH连接超时** - 受控节点防火墙放行22端口:`sudo ufw allow 22/tcp` - 检查IP是否可达 `ping 192.168.1.100` 2. **Permission denied** - 免密推送失败,重新执行 `ssh-copy-id` - 确认受控节点 `/etc/ssh/sshd_config` 允许公钥认证 `PubkeyAuthentication yes` 3. **Could not find python interpreter** - 受控节点没装 python3:`sudo apt install python3` 4. 需要 sudo 权限执行任务 > 如果受控节点任务需要root,在inventory增加 `ansible_become=yes ansible_become_pass=密码` ```ini [web] 192.168.1.100 ansible_user=ubuntu ansible_become=yes ``` > 受控节点用户需要有sudo免密(可选配置) ```bash # 受控节点 sudo免密,不用每次输入密码 sudo visudo ubuntu ALL=(ALL) NOPASSWD: ALL ``` # 测试其他命令 ### 查看被控节点主机名 ```bash ansible web -m command -a "hostname" -i ansible_client.ini ``` ### 查看被控节点磁盘 ``` ansible web -m command -a "df -h" ``` 原文出处:/show_1GW45ACxfxph.html