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

Сценарий Bash для восстановления Nginx с использованием / пользовательских модулей

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

То, что у меня есть, выглядит так:

sudo mkdir -p /opt && cd /opt

# Fetch Module(s)
sudo git clone https://github.com/AirisX/nginx_cookie_flag_module.git

# Update Apt Repositories
sudo add-apt-repository -y ppa:nginx/stable
sudo sed -i "s/# deb-src/deb-src/" /etc/apt/sources.list.d/nginx-ubuntu-stable-xenial.list
sudo apt-get update

# Fetch Nginx Sources/Dependencies
sudo mkdir -p /opt/rebuildnginx && cd /opt/rebuildnginx
sudo apt-get dpkg-dev
sudo apt-get source -y nginx
sudo apt-get build-dep -y nginx

# Add Module(s) To Nginx Rules
sudo perl -p0i -e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n                        --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' /opt/rebuildnginx/nginx-1.12.1/debian/rules

В настоящее время у меня есть две проблемы с этим, обе относятся к последней строке.

  1. Функциональность: у него есть жестко запрограммированная версия в пути ... как я могу переписать это, чтобы автоматически получить путь?
  2. Эстетика: последняя строка довольно длинная ... как бы ее сократить? Я попытался разбить его на переменные, но я не очень хорошо разбираюсь в BASH или Perl и не смог заставить его работать ни в одной из моих нескольких попыток.

много судо

Чтобы избавиться от sudo в каждой строке учтите просит рут.

не повторяйся

Ваш /opt/rebuildnginx Каталог используется в 3-х разных местах. Это должна быть переменная. Я бы использовал BUILDBASE для имени переменной или чего-то подобного.

жестко запрограммированный путь

Я думал, ты сможешь найти это в apt-cache но эти версии выглядят иначе, чем ваша. Если вы раньше не запускали этот скрипт для предыдущих версий nginx, это должно сработать:

VERSION=`ls -d nginx*`                                                            
RULES="/opt/rebuildnginx/$VERSION/debian/rules"

Вот пример этого:

$ VERSION=`ls -d nginx*`
$ echo $VERSION
nginx-1.12.1
$ RULES="/opt/rebuildnginx/$VERSION/debian/rules"
$ echo $RULES
/opt/rebuildnginx/nginx-1.12.1/debian/rules

Чтобы сделать это надежным, вы можете rm -rf /opt/rebuildnginx каждый раз. Возможно, вам также необходимо проверить наличие git cloned до клонирования, чтобы ваш скрипт можно было повторно запустить.

сокращение последней строки

Есть несколько вещей, которые мы можем сделать для вашей последней строчки. Для начала разделим его на несколько строк:

sudo perl -p0i \
  -e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n                        --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' \
  /opt/rebuildnginx/nginx-1.12.1/debian/rules

Затем мы можем использовать переменную имени файла из предыдущего раздела:

sudo perl -p0i \
  -e 's/^(full_configure_flags(?:.*?\\\n)+.*)/$1 \\\n                        --add-dynamic-module=\/opt\/nginx_cookie_flag_module\n/m' \
  "$RULES"

Вы также можете превратить выражение Perl в строку с двойными кавычками и построить ее с помощью переменных, но я думаю, что это будет сложнее отлаживать. Придерживаться строки в одинарных кавычках для этого - хорошая ставка, и, по крайней мере, теперь имя файла не скрывается за краем вашего экрана.

Я сомневаюсь, что вам понадобятся все эти пробелы раньше --add-dynamic-module. В противном случае необходимо избавиться от нескольких пробелов. Или, может быть, использовать \t\t\t\t вместо длинных пробелов, если табуляция допустима.