我现在在操作系统级别做什么:
初始化后,更改为需要变量的用户并导出变量,然后还指定在配置文件中设置它们——或者在 root 的情况下在 /etc/environment (Debian) 中进行设置以说明持久性
我通过“echo >>”或“sed”直接对配置文件或主配置查找设置的目录执行了很多此操作。
为了我:
export MYVAR=foobar
echo "export MYVAR=foobar" >> /home/bradchesney79/.profile
第一个使环境变量在执行时可用,但在您注销时它将消失。将命令放入您的 .profile 将在您登录时为您创建它。
sed -i s/export MYVAR=.*/export MYVAR=barfoo/g /home/bradchesney79/.profile
为你:
sudo -u brianchesney80 export HISVAR=something
sudo -u brianchesney80 echo "HISVAR=something" >> /home/brianchesney80/.profile
给大家:
((Not fully certain how to export globally just yet))
sudo echo "OURVAR=fffoooooobbbaaarrr" >> /etc/environment
我不喜欢重启。但是,我没有看到任何方法可以为每个人启用此处设置的环境变量。
那么,想查看其他用户的环境变量吗?
sudo -u www-data printenv PATH
sudo -u www-data env
env 提供的一个简洁的列表还不够吗?尝试:
set > /tmp/setOutput.tmp
使环境变量对 PHP 可用:
值得注意的是,环境变量不能自然地用于守护进程的服务,因为它们传统上不是作为继承父环境变量的子进程启动的。请记住,这是出于非常充分的理由而设置的安全屏障(环境变量将被不加选择地共享不一定是一件好事。)。我的目标是有选择地使某些可测试的环境变量值可用,以便我的系统表现不同或设置正确的凭据并在变量中可用于应用程序 - 所有这些都通过配置脚本进行实例化,其中一些在重新启动之间保持不变。
阿帕奇
例子:
export PATH="/var/www:/var/www/html"
整洁的代码片段,您可以使用它检查 envvars 文件的有效性。
sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL
/etc/apache2(Debian)中有一些设置我想我可以在虚拟主机块中使用......
例子:
SetEnv SPECIAL_PATH /foo/bin
服务器虚拟主机配置块中的上述内容将使自定义环境变量通过 $_SERVER 或 TMR 在评论中提到的类似约定在某处可用。
在 httpd.conf 文件和类似文件或 .htaccess 的其他地方,您可以通过重写规则设置环境变量。
RewriteRule someurl - [E=dbpass:swordfish]
Apache Rewrite 滥用......如果你必须,你必须我猜。我一般不喜欢 .htaccess 文件,也不喜欢重写。
NGINX
看来您可以利用lua NGINX 模块将环境变量插入服务器。这个其他模块也需要。
话虽如此,这主要集中在 PHP 上——如果你使用 nginx 和 PHP——也许看看下面的 PHP 部分,这可能是一个更好的解决方案。
env PATH;
http {
...
server {
location /path {
set_by_lua $path 'return os.getenv("PATH")';
...
}
}
}
PHP
get-cfg-var()将允许您检索 PHP 项目开发人员设置的值 - 以及您设置的任意值。以这种方式在全局范围内小心命名这些变量是值得小心的,并确保阅读用户提供的注释以了解一些自动修改。
例子:
php.ini
environment_type=dev
environment_host=AWS
随机脚本whatever.php
get_cfg_var('environment_type') // returns 'dev'
get_cfg_var('environment_host') // returns 'AWS'
在 php-fpm 池配置文件中,下面将通过 $_SERVER 或 TMR 在评论中幽默我提到的类似约定在某处提供自定义环境变量。
例子:
我的池.conf
env[FOO] = bar
随机脚本whatever.php
echo $_SERVER['FOO']; // returns 'bar'
概括
什么: 我正在寻求的最终结果是我可以编写脚本来建立服务器。由于 weaksauce,我有一个 ansible 包装器,并且运行的 bash 脚本比我想承认的要多。无论如何,我想在操作系统用户级别设置某些变量并让它们向下传播以帮助我或多或少地“匿名化”我的 Web 应用程序代码库。
原因: 好处是许多细节,如用于身份验证的 RSA 密钥(是的,它们适合环境变量)、密码和其他“秘密”不在代码库中——你已经移动了所有这些“秘密”到供应脚本,显然到使用低级访问控制的正在运行的服务器上。开发人员无需更改任何代码即可运行 Web 应用程序。可以检查和处理任何配置或偏差。一次编写,满怀信心地部署到任何地方,即使不相同,一切都非常相似。配置脚本会自动将用于连接到数据库的正确 DSN 用户、主机和密码放入环境变量中;那些引用环境变量的 PHP 变量只是从一开始就选择正确的值。
如何: 这是我的问题。如果您已经这样做了,您会采用哪些步骤和技术?
编辑:
tl;dr - 删除了一个有争议的供应想法,提炼成一个简洁的问题主题
我已经删除了关于检测主机和根据发现配置服务器的内容。有人强烈建议,这种配置服务器的方式可能是一个糟糕的策略,并且配置工具旨在声明设置,而不是目标主机在实例化时发现有关自身的事情并做出适当的反应。——而且,最重要的是,它仅次于手头的任务。我想了解更多关于存储环境变量中可能发生变化的细节的信息,这很棒。
- AnrDaemon 特别提到打破了最小意外原则。
从问题提出的方式来看,唯一可能的答案是“不要那样做”。
网站不应该“试图弄清楚”任何事情,它应该工作。
根据它设置环境和配置网站是部署脚本的工作。
正如@TML 指出的那样,有很多编排工具可以做到这一点。Saltstack,puppet,……说出你的选择。
为了向您的应用程序提供环境信息,诸如dotenv 之类的呢?
phpdotenv 从配置文件中读取以填充 PHP
$_ENV
和$_SERVER
变量,因此您可以在版本控制之外为每个服务器获取单独的 API 密钥或其他配置信息,而无需处理 Web 服务器本身的配置。对我来说,归根结底,我是在使用 AWS 平台的主机上托管一个站点。
最有可能的是,当我部署新代码或主机配置时,我将创建一个新的服务器映像,让我的站点离线一两分钟,指定我的自动缩放组使用新映像,杀死所有旧实例,然后当第一个新实例重新启动时,让我的网站重新上线。诚然,我会事先对所有内容进行测试,并坚信一切都会按计划进行。如果不是,我将杀死新实例并用旧图像中的实例替换它们......
因此,我通过环境变量让我的代码使用正确的配置值(以数据库访问凭证和支持服务的 IP 地址为例)的计划将与我预想的不同。
我的配置脚本将为可以使用它们的其他事物设置环境变量。对于这个单站点服务器上的 PHP,我将附加我自己的任意键 = 值变量对,如下所示。
get-cfg-var() 将允许您检索 PHP 项目开发人员设置的值 - 以及您设置的任意值。以这种方式在全局范围内小心命名这些变量是值得小心的,并确保阅读用户提供的注释以了解一些自动修改。
例子:
php.ini
随机脚本whatever.php
感谢所有花时间让我变得更聪明的人,我已经剪切/粘贴了我在这里学到的东西,以节省下一个 schmuck 一些悲伤和时间。