Шаблон Chef ERB с проблемами шаблона Logstash Grok

У меня есть файл конфигурации logstash, который мне нужно преобразовать в шаблон chef erb (в основном, раздел фильтров). Однако я продолжаю сталкиваться с проблемами из-за формата паттернов Grok. Ниже приведен пример паттерна Grok.

  grok {
    match => ["message", "<%{POSINT:seqnum1}>%{POSINT:seqnum2}: (\d*: |\.|\*)*%{SYSLOGTIMESTAMP:timestamp} %{WORD:tz}: \%%{WORD:facility_label}-(%{WORD:switch_id}-)*%{INT:severity}-%{WORD:program}: %{GREEDYDATA:message}"]

Вот в чем проблема. Вскоре после этого мне нужно заполнить какой-нибудь IP-адрес интерполяцией и т. Д. Но этого не произойдет, потому что <% запускает собственную интерполяцию.

mutate {
  add_field => {"[@metadata][sentry][msg]" => "%{host}"
    "[@metadata][sentry][severity]" => "%{severity}"
    "[@metadata][sentry][host]" => "<%= @sentry_host[:ipaddress] %>"
    "[@metadata][sentry][pid]" => "<%= @sentry_pid %>"
    "[@metadata][sentry][key]" => "<%= @sentry_key %>"
    "[@metadata][sentry][secret]" => "<%= @sentry_secret %>"
  }
}

Таким образом, все указанные выше значения обрабатываются как строка <%= @sentry_... %>.

Есть ли способ обойти это? Я пробовал использовать метод выхода <%%{POSINT:seqnum1}>%{POSINT:seqnum2}:%>, который я видел здесь. Но он по-прежнему вставляет закрывающий %>. Есть ли другие способы экранировать символы / строки в ERB?

Спасибо! Джош


person Joshua Zitting    schedule 10.06.2016    source источник


Ответы (1)


Вы не хотите помещать %> в свой текст. <%% становится буквальным <%, и ему не нужен парный конечный тег.

ИЗМЕНИТЬ пример erb -x:

$ echo '<%% foo <%= asdf %> bar <%= baz %>' | erb -x
#coding:ASCII-8BIT
_erbout = ''; _erbout.concat "<% foo "; _erbout.concat(( asdf ).to_s); _erbout.concat " bar "; _erbout.concat(( baz ).to_s); _erbout.concat "\n"
; _erbout.force_encoding(__ENCODING__)
person coderanger    schedule 10.06.2016
comment
Спасибо, что так быстро узнали об этом! Однако, если я сделаю ‹%%, он не будет ничего интерполировать до закрытия / окончания%› ПОСЛЕ того, как @sentry_host [: ipaddress] "[@metadata][sentry][host]" => "<%= @sentry_host[:ipaddress] %>" "[@metadata][sentry][pid]" => "<%= @sentry_host[:ipaddress] %>" окажется `[@metadata] [sentry] [host] =› ‹% = @sentry_host [ : ipaddress]% ›[@metadata] [sentry] [pid] =› 10.100.100.100` - person Joshua Zitting; 11.06.2016
comment
Сложно следить за этим в комментарии, но вы всегда можете передать фрагмент Erb erb -x, чтобы увидеть сгенерированный код Ruby, который должен дать вам представление о том, что происходит :) - person coderanger; 11.06.2016