我正在编写Ansible playbooks来在Solaris服务器上设置和安装我们的应用程序 .
问题是我需要执行的(bash)脚本都假定某个目录位于PATH上,即 /data/bin
- 如果不是Ansible忽略所有 .profile
和 .bashrc
配置,这通常不会成为问题 .
现在,我知道您可以通过 environment
标志为 shell
任务指定环境,例如:
- shell: printenv
environment:
PATH: /usr/bin:/usr/sbin:/data/bin
这将正确路径 /data/bin
文件夹, printenv
命令将正确显示(或我的bash脚本将正确运行) .
But. 但是有两个问题:
-
首先,必须一遍又一遍地指定环境是非常烦人的 . 我知道你可以在一些playbook基本文件变量和引用中定义环境,但你仍然必须在每个
shell
任务上设置environment: ...
. -
其次,上面的例子不允许我动态地指定路径,例如as
PATH: $PATH:/data/bin
- 因为Ansible以不解析$PATH
的方式执行此操作,因此命令会灾难性地失败 . 所以基本上这将覆盖对PATH
的任何其他更改 .
我正在寻找一个解决方案
-
只应添加
PATH
条目 once -
附加
PATH
条目不应覆盖其他任务添加的条目
附:我在how to do this on Linux上找到了这个很好的解释,但是它使用了Solaris上不存在的 /etc/environment
. (Ansible再次忽略了 /etc/profile
. )
1 回答
尝试在ansible.cfg中将
-o SendEnv=PATH
添加到ssh_args
. 需要那个运行ansible的shell在PATH中有/ data / bin . 或者,ansible允许您修改当前/本地PATH变量 .
远程机器已正确设置AcceptEnv .