【问题标题】:elasticsearch can't resolve environment variables in elasticsearch.ymlelasticsearch 无法解析 elasticsearch.yml 中的环境变量
【发布时间】:2014-07-25 20:31:31
【问题描述】:

我的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 无法从elasticsearch.yml 解析我的环境变量是怎么回事?在这一点上,我已经做了很多挖掘工作,但我确信在拐角处有一个简单的解决方案。任何帮助将不胜感激。

【问题讨论】:

    标签: elasticsearch environment-variables


    【解决方案1】:

    我发现了问题。

    由于我将 elasticsearch 作为 linux 服务而不是 shell 应用程序运行,因此它无法访问任何环境变量,除了少数几个。

    我在/etc/sysconfig/elasticsearch 的末尾添加了以下行来加载我希望程序可用的环境变量:

    . /path/to/environment/variables

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      相关资源
      最近更新 更多