gpt4 book ai didi

elasticsearch - elasticsearch无法解析elasticsearch.yml中的环境变量

转载 作者:行者123 更新时间:2023-12-02 22:25:29 25 4
gpt4 key购买 nike

我的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

但是,从函数 resolvePlaceholder 内部运行 PropertyPlaceholder#parseStringValue之后, 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有什么用?在这一点上,我已经做了很多挖掘工作,但是我敢肯定有一个简单的解决方案即将来临。任何帮助将不胜感激。

最佳答案

我发现了问题。

当我将Elasticsearch作为linux服务而不是shell应用程序运行时,除了很少选择的环境变量外,它无法访问其他环境变量。

我在/etc/sysconfig/elasticsearch的末尾添加了以下行,以加载我希望对程序可用的环境变量:
. /path/to/environment/variables

关于elasticsearch - elasticsearch无法解析elasticsearch.yml中的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24964018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com