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

时间:2014-07-25 20:31:31

标签: elasticsearch environment-variables

我的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有什么用?我已经做了很多挖掘,但我确信有一个简单的解决方案即将到来。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我想出了这个问题。

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

我在/etc/sysconfig/elasticsearch的末尾添加了以下行,以加载我想要的程序环境变量:

. /path/to/environment/variables