我的elasticsearch.yml
文件中有以下两个设置。他们是唯一从环境变量中获取的人。
cloud.aws.access_key: ${AWS_ACCESS_KEY_ID}
cloud.aws.secret_key: ${AWS_SECRET_KEY}
当我重新启动elasticsearch以从环境加载这些内容时,我收到一个无法解决问题的错误。我已经对它进行了测试,它也无法解决,所以这个错误适用于两者(它首先在底部失败)
- IllegalArgumentException[Could not resolve placeholder 'AWS_SECRET_KEY']
java.lang.IllegalArgumentException: Could not resolve placeholder 'AWS_SECRET_KEY'
at org.elasticsearch.common.property.PropertyPlaceholder.parseStringValue(PropertyPlaceholder.java:124)
at org.elasticsearch.common.property.PropertyPlaceholder.replacePlaceholders(PropertyPlaceholder.java:81)
at org.elasticsearch.common.settings.ImmutableSettings$Builder.replacePropertyPlaceholders(ImmutableSettings.java:1060)
at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareSettings(InternalSettingsPreparer.java:101)
at org.elasticsearch.bootstrap.Bootstrap.initialSettings(Bootstrap.java:106)
at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:177)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32)
我在github上通过elasticsearch的代码存储库进行了一些调查,发现了一些来自环境变量的代码。
ImmutableSettings.java#resolvePlaceholder
from elasticsearch@github
即。 应从环境变量中提取的函数内的行是这些:
Code from resolvePlaceholder
that pulls out environment variables
但是,从函数PropertyPlaceholder#parseStringValue
内部运行resolvePlaceholder
后,System.getenv
调用必须返回null,因为这是抛出该错误的唯一方法。
我编写了一个简单的测试程序,它本质上是ImmutableSettings.java#resolvePlaceholder
的副本,用于测试System.getenv
是否正确地在我的系统上提取环境变量。这实际上返回了我期望的值。
public class Cool {
public static void main(String[] args) {
System.out.println(resolvePlaceholder(args[0]));
}
public static String resolvePlaceholder(String placeholderName) {
if (placeholderName.startsWith("env.")) {
// explicit env var prefix
System.out.println("1: placeholderName.startsWith(\"env.\")");
return System.getenv(placeholderName.substring("env.".length()));
}
String value = System.getProperty(placeholderName);
if (value != null) {
System.out.println("2: System.getProperty");
return value;
}
value = System.getenv(placeholderName);
if (value != null) {
System.out.println("3: System.getenv");
return value;
}
return "Map should've had it";
}
}
运行时,这是输出,显示我们正在获取设置的环境变量(由于显而易见的原因隐藏了键):
[ec2-user@ip-172-31-34-195 ~]$ java Cool AWS_SECRET_KEY
3: System.getenv
XXXXXXXXXXXXXXXXXX
[ec2-user@ip-172-31-34-195 ~]$ java Cool AWS_ACCESS_KEY_ID
3: System.getenv
XXXXXXXXXXXXXXXXXX
对于不能从elasticsearch.yml
解析我的环境变量的elasticsearch有什么用?我已经做了很多挖掘,但我确信有一个简单的解决方案即将到来。非常感谢任何帮助。
答案 0 :(得分:2)
我想出了这个问题。
由于我将elasticsearch作为linux服务而不是shell应用程序运行,因此除了极少数几个外,它不能访问任何环境变量。
我在/etc/sysconfig/elasticsearch
的末尾添加了以下行,以加载我想要的程序环境变量:
. /path/to/environment/variables