Назад | Перейти на главную страницу

Прочитать переменную среды (или файл среды) из конфигурации rsyslog?

Я создаю здесь AMI для своей организации, которые включают конфигурацию по умолчанию для отправки всех наших журналов в Loggly из rsyslogd. Он работает довольно хорошо, но я хотел бы иметь возможность настраивать конфигурацию из сценария cloud-init, чтобы предоставлять настраиваемые теги ведения журнала для каждого экземпляра. Я бы хотел сделать что-то подобное в cloud-init:

#cloud-config
write_files:
    - path: /etc/sysconfig/rsyslog-loggly
      content: |
          LOGGLY_TAGS=staging,search,solr,staging-search-solr

Затем прочтите переменную / файл среды в конфигурацию rsyslog:

$template LogglyFormat,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [---TOKEN--- tag=\"$LOGGLY_TAGS\"] %msg%"

Есть ли способ получить файл среды или прочитать переменную среды в конфигурации rsyslog? Я всегда мог дополнить модуль SystemD для rsyslog, включив в него файл среды, при условии, что я смог его прочитать.

Чего я бы хотел избежать, так это сделать что-то вроде этого:

[Service]
...
ExecStartPre=/usr/local/sbin/rewrite-loggly-conf.py

и переписывать конфигурацию при каждой загрузке с помощью скрипта Python.

Есть ли в rsyslog способ сделать то, что я хочу выполнить?

Да, вы можете включать переменные среды аналогично сценариям оболочки, используя обратные кавычки. Это работает с rsyslog 8.33.0

Из Строковые константы в документации rsyslog:

обратные кавычки

Это было добавлено в версии 8.33.0. Идея состоит в том, чтобы предоставить полезное подмножество того, что делает оболочка. На данный момент поддерживается только следующее:

echo $VARNAME - It will evaluate the environment variable and use it as string constant. If the variable is not found, an empty string

генерируется (это не ошибка).

Starting with 8.37.0, the echo case has been enhanced. It is now more along the lines of what bash does. It supports multiple

расширения переменных среды, а также постоянный текст между ними.

An example:
    env SOMEPATH is set to “/var/log/custompath”
    config is: param=echo $SOMEPATH/myfile
    param than is expanded to “/var/log/custompath/myfile”

Note, however, that some common bash features are not supported. Most importantly, ${VAR} does not work. Also, environment variables

заканчиваются только пробелом или /. Также не поддерживаются такие вещи, как $ (pwd). Идея этого параметра состоит не в том, чтобы обеспечить полноценный эквивалент bash, а в предоставлении некоторых функций, которые обычно считаются полезными для настройки конфигурации rsyslog с внешними данными. Тем не менее, мы по-прежнему заинтересованы в расширении охвата, если будет предоставлена ​​четкая необходимость и обоснование.

cat filename - It will evaluate to the content of the given file. Only a single file name is supported. If the file is not readable, it

будет оцениваться как пустая строка.

Любая другая конструкция в настоящее время приведет к сообщению об ошибке. Обратите внимание, что между «echo» или «cat» и другим параметром должен быть ровно один пробел.

Обратные кавычки особенно полезны для файлов конфигурации, которые создаются автоматически, но должны содержать небольшой набор специальных функций.

Чтобы увидеть пример этого в действии, взгляните на устройство докеров rsyslog, доступное по адресу https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine.