ansible远程执行shell报错:command not found

背景

项目中使用到了pm2,用于管理微服务的启停,我在相关机器上安装好了pm2,然后使用ansible进行批量启动服务。在使用ansible的shell模块执行远程命令时候却报了错:/bin/sh: pm2 :command not found,如下图

问题定位

1. 在被执行机器上查看pm2命令,看看是不是没有添加到环境变量(PATH)里。

登陆到这台机器上,执行:which pm2

可以看到pm2已安装到机器上了。

再看看是否已添加到环境变量中。

如下图,我已经把pm2的路径添加到环境变量~/.bash_profile,是不是有可能ansible的shell模块执行时候没有读取到环境变量?

 

2. 尝试在ansible的shell的执行参数加上. ~/.bash_profile,保证执行命令前先读取到环境变量。

执行成功!看来ansible在执行shell命令的时候,没有正确加载到~/.bash_profile。

那到底为什么没法正确加载到~/.bash_profile呢? 

原因

我在网上搜索了一下~/.bash_profile,发现linux里面有多个读取环境变量的配置文件,并且有加载顺序和不同的场景。

首先介绍两个概念:login shell和non-shell shell,顾名思义,一个是交互式的shell,一个是非交互式的shell。

login shell:通常指的是常规登录到某shell环境后,能够在当前命令行中输入shell命令这种情况。

non-login shell:不用登陆的,比如ssh远程执行,是非交互式的。

如下是login shell和non-login shell的环境变量文件的加载顺序。

由图片我们可知,ansible这种非交互式的shell执行应该读取的是~/.bashrc,而我这里配置到了~/.bash_profile 

解决方案

1. 将~/.bash_profile中ansible所需要的环境变量配置到~/.bashrc中

2. 在使用pm2的时候加上pm2的绝对路径

3. 在执行pm2的时候,在前面加上. ~/.bash_profile

比较推荐的是第一种方式,这样ansible后续有其他的环境变量也可以预先配置到~/.bashrc,减小我们改造或者书写ansible命令的成本。

 

备注:图片引用博客地址:https://blog.csdn.net/gatieme/article/details/45064705

传送门:2021最新测试资料与大厂招聘合集

博主:测试生财(一个不为996而996的测开码农)

座右铭:专注测试开发与自动化运维,努力读书思考写作,为内卷的人生奠定财务自由。

内容范畴:技术提升,职场杂谈,事业发展,阅读写作,投资理财,健康人生。

csdn:https://blog.csdn.net/ccgshigao

博客园:https://www.cnblogs.com/qa-freeroad/

51cto:https://blog.51cto.com/14900374

微信公众号:测试生财(定期分享独家内容和资源)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公众号-测试生财

点赞和关注比打赏更重要

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值