LINUX.ORG.RU

Вставить многострочный текст после ключевого слова

 , , , ,


0

1

Нужно скриптом, на паре-восьмёрке серверов, добавить в конфиг Nginx, после определённого ключевого слова mykeyword, дополнительное описание формата логирования.
Примерный кусок, который нужно вставить

# Additional log_format

log_format myformat escape=json '{'
  '"remote_addr":"$remote_addr",'
  '"status":$status,'
  '"request_time":$request_time,'
  '"http_referer":"$http_referer"'
  '}';

# End of additional log_format

Поначалу подумал что это прям изян, но потом осознал, что у sed и прочих тяжёлых наследий всё сложно с экранированиями и прочими многострочностями и простой sed -i «/mykeyword/a$myvar» nginx.conf тут не прокатит.
Раз не sed, то чем и как это проще решить?

★★★★★

Как вариант, потратить единократно чуть больше времени, и реализовать на Ansible или подобных решениях. Наверняка, непоследняя групповая операция для 2-8 серверов-то.

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfi...

https://www.geekytidbits.com/ansible-module-modify-json/

NDfan ()
Ответ на: комментарий от xaizek

Мм...пока как-то не вырисовывается.
Обилие кавычек сильно всё усложняет, а в некоторых моих попытках шелл даже раскрывает внутренние переменые Nginx(типа $status), получается ещё смешнее

zolden ★★★★★ ()
Ответ на: комментарий от ABW

Спасибо за идею, получается примерно так:

#!/bin/bash
IFS='' read -r -d '' MYVAR <<"EOF"
# Additional log_format
log_format myformat escape=json '{'
  '"remote_addr":"$remote_addr",'
  '"status":$status,'
  '"request_time":$request_time,'
  '"http_referer":"$http_referer"'
  '}';
# End of additional log_format
EOF


echo "${MYVAR}" > /tmp/foo.bar

sed -i '/mykeyword/r /tmp/foo.bar' nginx.conf

rm /tmp/foo.bar

zolden ★★★★★ ()
Ответ на: комментарий от vel

Да, хороший вариант, на будущее буду иметь в виду.
Просто ниже нужно будет ещё и само логирование с этим новым форматом прописывать, что приводит к подобной же ситуации (но легче в плане спецсимволов)

zolden ★★★★★ ()