Сценарий 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 и не смог заставить его работать ни в одной из моих нескольких попыток.
0
задан 23 December 2017 в 12:12
1 ответ

много sudo

Чтобы избавиться от sudo в каждой строке, подумайте о , запрашивающем root .

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

Your Каталог / opt / rebuildnginx используется в трех разных местах. Это должна быть переменная. Я бы использовал 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 clone d перед клонированием, чтобы сделать ваш скрипт повторно запускаемым.

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

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

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- модуль . Если нет, то необходимо избавиться от нескольких пробелов. Или, может быть, используйте \ t \ t \ t \ t вместо длинного набора пробелов, если табуляция допустима.

0
ответ дан 5 December 2019 в 07:00

Теги

Похожие вопросы