79.学习Ansible[2]:小试牛刀

后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
在这里插入图片描述

如何连接远端机器

Ansible主机默认通过SSH协议管理远端机器。默认使用OpenSSH,需要ControlPersist、Kerberos等特性支持,Ansible主机的~/.ssh/config中可能也需要做一些配置(比如Jump Host跳板机的配置)。旧版本OpenSSH不支持ControlPersist,此时Ansible会使用Python的paramiko包(一个高质量的OpenSSH实现)。要使用Ansible的所有特性,建议使用高版本的操作系统和OpenSSH。
如果使用SSH协议,默认使用SSH私钥连接远端机器(建议使用ssh-agent)。连接远端机器需要密码时,可以用--ask-pass参数。如果在远端机器使用sudo提升权限并且sudo需要密码,可以用--ask-become-pass参数。

建议:Ansible主机与远端机器在同一个网络中。

第一条命令

Ansible管理的机器资源列表,默认保存在/etc/ansible/hosts文件中,修改生效的ansible.cfg中的inventory项的配置可以换成其他位置,例如:

inventory=/home/map/ansible/hosts

/home/map/ansible/hosts中添加如下内容,表示Ansible主机管理的远端机器是a.example.comb.example.com,两个机器的组名是example

[example]
a.example.com
b.example.com

在开始第一个命令前,先保证Ansible主机可以通过ssh私钥的形式登录两台远端机器。

  1. 在Ansible主机上生成ssh密钥对:
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C ansible

然后一路回车,生成的私钥文件是~/.ssh/id_rsa,公钥文件是~/.ssh/id_rsa.pub

  1. 把公钥内容拷贝到两台远端机器的~/.ssh/authorized_keys的末尾,修改远端机器的~/.ssh目录权限为700authorized_keys文件权限为600(远端机器重装系统时,记得重新配置authorized_keys)。

  2. 在Ansible主机上配置ssh-agent:

$ ssh-agent $SHELL #启动一个新的shell挂载到ssh-agent
$ ssh-add ~/.ssh/id_rsa #向ssh-agent添加私钥
  1. 在Ansible主机上尝试连接所有远端机器(使用Ansible主机当前登录的用户名作为登录远端机器的用户名),验证远端机器安装配置了正确的python版本。如果成功,ping字段返回值是pong
$ ansible example -m ping
a.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
b.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

注意,这个ping模块并不是ICMP的ping命令。ansible命令后的第一个参数,表示主机要连接的机器名或机器组名,本例中是example。如果要连接Ansible主机的本机地址,可以使用localhost127.0.0.1-m参数,表示使用的Ansible模块名,默认值是command

使用-u参数指定连接远端机器使用的用户名:ansible example -m ping -u mars
mars用户身份连接,然后sudoansible example -m ping -u mars -b
mars用户身份连接,然后切换到有sudo权限的用户looansible example -m ping -u mars -b --become-user loo

在远端机器上执行其他命令:

$ ansible a.example.com -a "/bin/echo hello"
a.example.com | CHANGED | rc=0 >>
hello

上面的命令使用了默认的command模块,-a参数表示传递给Ansible模块的参数,本例中传递给command模块的的参数是/bin/echo hello

至此,我们通过Ansible敲出了在远端机器执行的第一条指令,相当于完成了Ansible工具基本使用环境的搭建。接下来建议继续阅读:学习Ansible[3]:在远端机器临时执行命令

[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:未找到命令" ] }
最新发布
03-09
<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命令。如果有,那么问题显然是因为远程主机没有安装Ansible2. **确认远程主机的环境**:需要确保远程主机上安装了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调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值