PHP执行调用Ansible playbook的bash脚本时报找不到playbook错误
故障核心原因
PHP通过shell_exec执行外部命令时,默认工作目录是PHP进程自身的运行目录,和被执行的bash脚本所在路径没有任何关系,这是ansible找不到playbook文件的根本原因。
web模式下运行的PHP(比如php-fpm、mod_php模式),默认工作目录通常是web站点根目录(比如常见的/var/www/html/路径),具体路径还会受php-fpm池配置的chdir参数、PHP入口文件所在位置影响。你在bash脚本里用相对路径调用ip-prefixlist.yml时,ansible会在PHP的工作目录下查找该文件,自然会返回找不到文件的错误。
快速定位实际工作目录
在你要执行的/var/www/.ansible/tmp/script-copy.sh脚本最开头加一行pwd,再通过PHP触发脚本执行,输出的路径就是PHP执行shell时的真实工作目录,可以直接验证。
修复方案
选任意一种即可,优先推荐用绝对路径的方案,完全不依赖工作目录配置,稳定性最高:
- 方案1:ansible调用时直接写playbook的绝对路径,无需切换目录
把脚本里的ansible执行命令改成如下格式,替换成你自己的playbook实际存放路径即可:ansible-playbook /var/www/.ansible/playbooks/ip-prefixlist.yml - 方案2:在bash脚本内先切换到playbook所在目录,再执行ansible命令
在ansible调用逻辑前增加目录切换命令:# 替换成你的playbook实际存放目录 cd /your/playbook/storage/path/ ansible-playbook ip-prefixlist.yml - 方案3:PHP侧执行命令时先切换到脚本所在目录,再触发脚本
修改PHP的执行命令为:$bash = 'cd /var/www/.ansible/tmp/ && bash script-copy.sh'; $out = shell_exec($bash);
额外注意:路径问题排查完如果仍有异常,需要确认PHP运行用户(通常为www-data、nginx、apache这类web服务用户)对ansible目录、playbook文件有可读权限,避免权限不足导致的文件读取失败。
内容的提问来源于stack exchange,提问作者Poori
相关产品推荐
相关产品推荐

