puppet中的用户路径是如何设置的?

puppet中的用户路径是如何设置的?

我有一个有趣的问题我可以通过手动指定来解决这个问题PATH

问题是,虽然我的root用户PATH是:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

当我以用户身份在 NGINX/Passenger 中运行 Puppet Master 时puppetPATH不知何故被设置为:

/usr/sbin:/sbin

为用户设置的环境变量在哪里PATH?如何确保我的puppet用户拥有正确的权限PATH?用户没有 shell:

puppet:x:103:106::/var/lib/puppet:/bin/false

config.ru负责启动 Puppet Master 的 Rack 文件中,我插入了以下语句来查看PATH用户puppet正在运行的内容:

puts "PATH: " + ENV.fetch('PATH', 'null')

输出为PATH: null,因此PATH当 Passenger 运行时根本没有设置环境变量。

我正在运行 Ubuntu 14.04 amd64 的 Docker 容器中工作。

答案1

一般来说linuxPATH通过读取点文件来设置环境变量。当您登录时,/etc/profile会被读取。设置默认环境变量后,它会读取.shell_profile例如.bash_profile.如果这个点文件不存在,那么它会尝试读取.bash_login,如果也不存在,它将查找.profile.

让我们回到问题上来。用户puppet没有 shell 或不容纳上述文件。您只需执行即可检查它echo "$SHELL" && echo "$PATH"

您可以PATH使用点文件之一手动设置或查看以下内容:http://www.puppetcookbook.com/posts/set-global-exec-path.html

答案2

正如它所说在 NGINX 文档中:

默认情况下,nginx 会删除从其父进程继承的所有环境变量(TZ 变量除外)。

我的具体问题的解决方法可以通过几种不同的方式来实现。

解决方法 1:在 Ruby 中附加 PATH 变量

通过编辑config.ru文件,我们可以简单地定义PATH它(如果尚未定义):

if not ENV['PATH']
    ENV['PATH'] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
end

这很简单并且解决了问题,但是隐藏在您可能永远不会再看的配置中。


解决方法 2:在 NGINX 中设置 PATH 变量

通过在 NGINX 站点配置中设置PATH变量,我们对问题有了更“立即可见”的解决方案:

server {
    listen 8140 ssl default_server;

    # ...
    # manually set PATH for Passenger; see PUP-3000
    env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    passenger_enabled on;
    # ...
}

相关内容