[root@node-1 ~]# ansible all -m script -a '/root/1.sh' An exception occurred during task execution. To see the full traceback, use -vvv. The error was: NoneType: None 192.168.10.120 | FAILED! => { "changed": true, "msg": "non-zero return code", "rc": 127, "stderr": "Shared connection to 192.168.10.120 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.10.120 closed." ], "stdout": "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n", "stdout_lines": [ "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令" ] }
时间: 2025-03-08 13:07:35 浏览: 55
<think>好的,我现在需要解决用户在使用Ansible执行脚本时遇到的错误。首先,用户运行了命令`ansible all -m script -a '/root/1.sh'`,结果返回了错误信息,显示目标主机192.168.10.120执行失败,返回码是127,并且有“ansible:未找到命令”的提示。
首先,我应该理解错误的原因。返回码127通常表示Shell命令中找不到可执行文件或命令。查看用户的错误输出,发现脚本的第4行多次出现“ansible:未找到命令”,这说明在目标主机上执行脚本时,系统无法找到ansible这个命令。
接下来,我需要分析为什么会发生这种情况。Ansible的script模块是将本地脚本传输到远程主机并在那里执行。所以,问题出在远程主机上,而不是控制节点。用户可能在脚本中调用了ansible命令,而远程主机并没有安装Ansible,导致找不到该命令。
可能的解决步骤包括:
1. **检查脚本内容**:用户使用的脚本/root/1.sh中的第4行是否有调用ansible命令。如果有,那么问题显然是因为远程主机没有安装Ansible。
2. **确认远程主机的环境**:需要确保远程主机上安装了Ansible,或者是否有必要在脚本中调用ansible命令。可能用户的本意是在控制节点上运行Ansible,但错误地在远程主机上执行了该命令。
3. **修改脚本或执行方式**:如果脚本确实需要在远程主机上运行Ansible,那么需要在那些主机上安装Ansible。但通常情况下,Ansible命令应该从控制节点发起,而不是在远程主机上执行。因此,可能需要调整脚本的逻辑,将需要在远程主机执行的任务通过Ansible模块直接管理,而不是通过脚本调用ansible命令。
4. **替代方案**:如果用户是想在控制节点上执行某些操作,应该直接在控制节点运行脚本,而不是通过Ansible的script模块分发到远程主机。或者,如果脚本中的任务可以通过Ansible的模块(如shell、command等)实现,那么直接使用这些模块会更合适。
此外,用户看到的错误信息中的路径`/root/.ansible/tmp/...`是Ansible在远程主机上临时存储脚本的位置,执行完后会自动清理。这也进一步说明脚本是在远程主机上运行的。
总结下来,根本原因是脚本中调用了ansible命令,而远程主机没有安装Ansible。解决方法要么在远程主机安装Ansible,要么修改脚本逻辑,避免在远程执行ansible命令。需要建议用户检查脚本内容,并考虑调整他们的工作流程,合理使用Ansible模块来完成任务,而不是在脚本中嵌套调用ansible命令。</think>以下是问题分析和解决方案的逐步说明:
---
### **错误原因分析**
1. **返回码127解读**
`rc: 127`表示目标主机在执行脚本时找不到命令。具体错误信息`ansible:未找到命令`表明**远程主机**上不存在`ansible`命令。
2. **script模块的特性**
通过`ansible script`模块执行的脚本会被传输到**目标主机**运行(而非控制节点)。若脚本中包含`ansible`命令,则要求**所有目标主机必须安装Ansible**,否则会报此错误。
---
### **验证步骤**
1. **检查脚本内容**
查看`/root/1.sh`第4行内容(错误提示位置),确认是否包含类似命令:
```bash
ansible ... # 此命令在目标主机上执行时会失败
```
2. **验证目标主机的Ansible安装**
在目标主机上手动执行以下命令:
```bash
which ansible || echo "Ansible未安装"
```
如果输出提示未安装,则确认问题根源。
---
### **解决方案**
#### **方案一:修改脚本逻辑(推荐)**
- **核心思路**:避免在远程主机上调用`ansible`命令,改用Ansible原生模块直接管理任务。
- **操作步骤**:
1. 将`1.sh`脚本中的任务改写为Ansible Playbook或直接通过`command`/`shell`模块执行。
2. 示例:
```bash
# 直接通过Ansible执行命令,无需脚本嵌套
ansible all -m shell -a "your_original_command"
```
#### **方案二:在目标主机安装Ansible(不推荐)**
- **适用场景**:确需在远程主机运行`ansible`命令时。
- **操作步骤**:
1. 通过Ansible临时命令安装Ansible(需具备权限):
```bash
ansible all -m raw -a "yum install -y ansible" # CentOS
ansible all -m raw -a "apt-get install -y ansible" # Ubuntu
```
2. **风险提示**:此方法会导致Ansible嵌套调用,可能引发管理混乱。
---
### **附加建议**
- **调试技巧**:
添加`-vvv`参数查看完整错误堆栈:
```bash
ansible all -m script -a '/root/1.sh' -vvv
```
- **路径检查**:
确保脚本中所有命令在目标主机的`$PATH`环境变量中存在,或使用绝对路径(如`/usr/bin/ansible`)。
---
### **总结**
问题根源是**目标主机未安装Ansible**,而脚本中调用了`ansible`命令。建议优先重构脚本,直接使用Ansible模块替代嵌套的Ansible调用。
阅读全文
相关推荐


















