Можно ли ссылаться на переменные среды в конфигурации logstash?
В моем случае я хочу настроить конфигурационный адрес elasticsearch, который я установил в среде.
Можно ли ссылаться на переменные среды в конфигурации logstash?
В моем случае я хочу настроить конфигурационный адрес elasticsearch, который я установил в среде.
Этот синтаксис можно использовать для использования переменных среды:
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}"
}
}
С помощью 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
Я с трудом могу поверить, что это единственные решения: взломать logstash или использовать какую-то систему шаблонов для перезаписи конфигурации.
На самом деле, я не хочу касаться или настраивать конфигурацию для разных сценариев развертывания. Все, что я хочу, - это передать некоторые параметры для подключения logstash к внешнему миру (например, где находится elasticsearch, имена пользователей/учетных данных для подключения к другие системы). Я уже больше часа нахожусь в Google, и все, что я мог найти, это эти сложные сложные решения для этой простой и общей проблемы.
Я искренне надеюсь, что кто-то придумает лучшую идею вроде
%{ENV[ELASTICSEARCH_HOST]}}
Это не поддерживается напрямую, нет.
Однако, если вы используете версию более поздней версии 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
в каком-то файле со специальными токенами, которые вы заменили на переменные среды.
Конфигурация 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 может быть разделена на многократно используемые элементы, и ее поведение можно регулировать на лету.
Как объяснено в logstash-issues
Связи устанавливаются во время регистрации плагина (во время инициализации, поскольку они почти наверняка должны быть), но интерполяция поля (например,
%{escluster}
) - это операция времени обработки события. Таким образом,host
на самом деле не подходит для такого поведения.
Таким образом, если плагин ввода или вывода не поддерживает синтаксис %{foo}
, выполнение любой оценки переменных среды на этапе фильтрации событий слишком поздно для того, чтобы плагин ввода и вывода воспользовался им.
Переменные среды поддержки файла .conf. вам просто нужно экспортировать переменную среды:
export EXAMPLE_VAR=123
и используйте его в файле конфигурации следующим образом:
${EXAMPLE_VAR}