Мне трудно разобраться, как перебирать дикты, используя for
для создания файла шаблона (Jinja2) для конфигурации rsyslog.Сценарии состоят в том, что у меня есть централизованный сервер rsyslog, который принимает журналы от различных клиентов rsyslog.
Я создал файл dicts по умолчанию следующим образом:
rsyslog_client_groups:
caprica: [ '"10.5.10.111"' , '"10.5.10.112"', '"10.5.10.11"', '"10.5.10.12"', '"10.5.12.21"' ]
apache: [ '"10.5.13.24"' , '"10.5.13.25"' , '"10.5.13.26"' ]
rsyslog_client_destinations:
apache:
- var: '$syslogtag'
contains: 'apache-access:'
destination: '/logs/web/access.log'
- var: '$syslogtag'
contains: 'apache-error:'
destination: '/logs/web/error.log'
caprica:
- destination: '/logs/mail/mail.log'
Мне нужно написать файл-шаблон (используя for
), комбинирующий дикты rsyslog_client_groups
и rsyslog_client_destinations
так что файл конфигурации rsyslog в конечном итоге создается таким образом на централизованном сервере журналов:
if $fromhost-ip == [ "10.5.10.111", "10.5.10.112", "10.5.10.11", "10.5.10.12", "10.5.12.21" ] then /logs/mail/mail.log
& stop
if $fromhost-ip == [ "10.5.13.24", "10.5.13.25", "10.5.13.26" ] then {
if $syslogtag contains 'apache-access:' then /logs/web/access.log
& stop
else if $syslogtag contains 'apache-error:' then /logs/web/error.log
& stop
else /logs/web/other.log
& stop
}
UPDATE:
Приведенный ниже код наиболее близок к поставленной мной задаче:
{% for k, v in syslog_clients.iteritems() %}
if $fromhost-ip == {{ v }} then /logs/{{ k }}/{{ k }}.log
& stop
{% endfor %}
Это не приводит к конечному результату, так как я не смог установить правильное назначение для журналов с rsyslog_client_groups
в соответствии со строкой contains
, с которой необходимо сопоставить (в rsyslog_client_destinations
)