Ansible: повторять через dict - PullRequest
0 голосов
/ 03 февраля 2019

Мне трудно разобраться, как перебирать дикты, используя 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)

...