You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:45:32