我使用的是 Ubuntu 14.04 和 16.10;所以我的 init 系统可以是 upstart 也可以是 systemd。
像如何在 Amazon EC2 中设置环境变量Stack Overflow 上展示了如何使用 获取实例 ID curl
,然后使用 获取实例标签aws ec2 describe-tags
,然后将它们作为环境变量导入到交互式 shell 或 shell 脚本中。答案之一还显示了如何运行这些数据jq
。
这一切都很好,但我不需要在 shell 脚本或交互式 shell 中设置变量。拥有一个像这些答案中那样的 shell 脚本source
对我来说没有好处,因为在我需要设置这些东西的地方没有涉及 shell。
我需要将它们设置在从 systemd 或 upstart 启动的守护进程的环境中。特别是在 systemd 情况下,服务单元文件不是 shell 脚本根本不。要设置环境变量,请将类似内容放入Environment=
单元文件中。
那么如何创建链中的最后一个链接呢?借助 Stack Overflow 上的内容,我可以读取数据并从中生成类似环境的字符串。 (我实际上正在读var=val
实例元数据和用户数据但原理是一样的——我提取一些东西curl
,然后进行jq
其他后期处理来制作它。)var=val
如何打造链条中的最后一环,并将这些字符串放入 upstart 和 systemd 运行的特定服务的环境中?
答案1
如果您可以以以下形式获取文件中的字符串环境变量赋值,例如
SOME_NAME=some_value
那么你也许可以使用EnvironmentFile=
单元文件中的设置。更多详细信息,请参见man systemd.exec
.
您始终可以使用脚本替换要启动的服务,该脚本首先使用环境变量设置获取文件,然后exec
获取原始服务。这也应该适用于暴发户。
例如:
#!/bin/sh
. /some/where/environment-variable-settings-file
exec original-service "$@"