我正在尝试使用ansible在远程服务器上运行php脚本。 使用ansible用户(ansible用于登录服务器)运行脚本非常有效。然而,当我的php脚本中包含语句时,ansible任务失败了。
我的php脚本位于
/srv/project
它试图包含
includes/someLibrary.php当任何具有正确访问权限但通过ansible任务运行的用户运行脚本时,一切正常
- name: run script shell: 'php /srv/project/script.php'
它失败了:
failed to open stream: No such file or directory in /srv/project/includes/someLibrary.php
运行一个非常基本的PHP脚本可以很好地工作。
答案 0 :(得分:3)
我刚刚找到问题的解决方案。
问题是,当我手动执行脚本时,我连接到服务器并进入/srv/project
目录,然后调用php script.php
PHP include
在这种情况下查看我想要包含的文件的当前目录。当ansible连接到服务器时,它不会更改目录,从而产生no such file or directory
错误。对此的解决方案很简单,因为shell模块将chdir
作为参数将目录更改为在运行命令之前指定的目录。
我的ansible任务现在看起来如下:
- name: run script shell: 'php /srv/project/script.php' args: chdir: '/srv/project'
感谢大家的帮助!
答案 1 :(得分:0)
Ansible在非交互式ssh会话下运行,因此不应用用户环境设置(例如.bashrc,.bash_profile)。这通常是交互式运行时不同行为的原因。通过Ansible检查交互式printenv和raw: printenv
之间的区别,您可能会发现需要设置的内容(通过ansible task / play environment:
块)来使事情正常工作。