Как ссылаться на переменные окружения в файле конфигурации logstash?

Можно ли ссылаться на переменные среды в конфигурации logstash?

В моем случае я хочу настроить конфигурационный адрес elasticsearch, который я установил в среде.

Ответ 1

Этот синтаксис можно использовать для использования переменных среды:

input {
  tcp {
    port => "${TCP_PORT}"
  }
}

Теперь задайте значение TCP_PORT:

export TCP_PORT=12345

При запуске Logstash использует следующую конфигурацию:

input {
  tcp {
    port => 12345
  }
}

Если переменная среды TCP_PORT не установлена, Logstash возвращает ошибку конфигурации.

Вы можете исправить эту проблему, указав значение по умолчанию:

input {
  tcp {
    port => "${TCP_PORT:54321}"
  }
}

Ответ 2

С помощью logstash 2.3 вы можете установить ссылки на переменные среды в конфигурацию плагинов Logstash с помощью ${var} или $var. https://www.elastic.co/guide/en/logstash/current/environment-variables.html

До того, как logstash 2.3 вы можете использовать плагин фильтра среды, поддерживаемый сообществом.

Документация по адресу: https://www.elastic.co/guide/en/logstash/current/plugins-filters-environment.html#plugins-filters-environment-add_field_from_env

Как установить этот плагин:

$LOGSTASH_HOME/bin/plugin install logstash-filter-environment

Исходный код: https://github.com/logstash-plugins/logstash-filter-environment

Основная часть:

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"


# Set fields from environment variables
class LogStash::Filters::Environment < LogStash::Filters::Base
  config_name "environment"

  # Specify a hash of fields to the environment variable
  # A hash of matches of `field => environment` variable
  config :add_field_from_env, :validate => :hash, :default => {}

  public
  def register
    # Nothing
  end # def register

  public
  def filter(event)
    return unless filter?(event)
    @add_field_from_env.each do |field, env|
      event[field] = ENV[env]
    end
    filter_matched(event)
  end # def filter
end # class LogStash::Filters::Environment

Ответ 3

Я с трудом могу поверить, что это единственные решения: взломать logstash или использовать какую-то систему шаблонов для перезаписи конфигурации.

На самом деле, я не хочу касаться или настраивать конфигурацию для разных сценариев развертывания. Все, что я хочу, - это передать некоторые параметры для подключения logstash к внешнему миру (например, где находится elasticsearch, имена пользователей/учетных данных для подключения к другие системы). Я уже больше часа нахожусь в Google, и все, что я мог найти, это эти сложные сложные решения для этой простой и общей проблемы.

Я искренне надеюсь, что кто-то придумает лучшую идею вроде

%{ENV[ELASTICSEARCH_HOST]}}

Ответ 4

Это не поддерживается напрямую, нет.

Однако, если вы используете версию более поздней версии 1.4.0, было бы довольно тривиально редактировать elasticsearch.rb, чтобы добавить эту функцию. Примерно строка 183:

client_settings["network.host"] = @bind_host if @bind_host

Вы можете настроить его, чтобы прочитать переменную окружения:

if ENV["ESHOST"].nil? then
    client_settings["network.host"] = ENV["ESHOST"]
else
    client_settings["network.host"] = @bind_host if @bind_host
end

Если вы предпочитаете, вы можете запустить Logstash с параметром командной строки -e для передачи конфигурации через STDIN. Вы можете cat в каком-то файле со специальными токенами, которые вы заменили на переменные среды.

Ответ 5

Конфигурация logstash на момент написания этой статьи - это всего лишь файл конфигурации, но это не язык программирования. Таким образом, он имеет несколько разумных "ограничений", например, он не может ссылаться на переменные среды, не может передавать параметры, трудно повторно использовать другой файл конфигурации. Эти ограничения заставят файл конфигурации logstash успеть поддерживать, когда файл конфигурации растет, или вы хотите настроить его поведение "на лету".

Мой подход заключается в использовании механизма шаблонов для создания файла конфигурации logstash. Я использовал Jinja2 в Python.

Например, результат поиска эластичного поиска может быть затенен как

output {
  elasticsearch {
    index => {{ es_index_name }}
    host => {{ es_hostname }}
  }
}

Затем я написал простой код python, используя Jinja2 для создания файла конфигурации logstash, а значение es_index_name и es_hostname можно передать через аргумент Python script. См. Здесь для учебника Jiaja2: http://kagerato.net/articles/software/libraries/jinja-quickstart.html

Таким образом, большая конфигурация logstash может быть разделена на многократно используемые элементы, и ее поведение можно регулировать на лету.

Ответ 6

Как объяснено в logstash-issues

Связи устанавливаются во время регистрации плагина (во время инициализации, поскольку они почти наверняка должны быть), но интерполяция поля (например, %{escluster}) - это операция времени обработки события. Таким образом, host на самом деле не подходит для такого поведения.

Таким образом, если плагин ввода или вывода не поддерживает синтаксис %{foo}, выполнение любой оценки переменных среды на этапе фильтрации событий слишком поздно для того, чтобы плагин ввода и вывода воспользовался им.

Ответ 7

Переменные среды поддержки файла .conf.  вам просто нужно экспортировать переменную среды:

export EXAMPLE_VAR=123

и используйте его в файле конфигурации следующим образом:

${EXAMPLE_VAR}