Bash как быстро сформировать локальный hosts файл из конфигов nginx

В процессе разработки многие вручную резолвят домен на ip сервера, прописывая соответствие IP hostname в локальный hosts файл, чтобы видеть изменения на сайтах без всяких кешей, либо домены вообще ещё могут не указывать A записями на сервер и отсутствовать как таковые. Но что делать, если на сервере несколько десятков хостов и они могут удаляться/добавляться? Предположим конфиги сайтов лежат в /etc/nginx/username/domainname.conf Для получения списка всех доменов, который мы положим в наш hosts

ls /etc/nginx/vhosts/*/* | cut -d/ -f6 | sed 's/.conf//' | awk -v ip=$(ip route get 1.1.1.1 | grep src | awk '{print $NF}') '{print ip " " $0}' | sort

Конфиги могут располагаться и по другому в /etc/nginx/sites-enabled/* и не иметь расширения, также не обязательно файл конфига может быть подписан именем домена. Хотя это плохая практика и так обычно не делается. Тогда может помочь команда:

nginx -T

или перебор всех директив server_name в каталоге nginx

grep -RiI server_name /etc/nginx/*

Распарс выдачи nginx -T на предмет директивы server_name наиболее предпочтителен, потому как конфиг файлы могут включаться не только ссылками, но и самими конфиг файлами и не обязательно могут присутствовать в каталоге /etc/nginx. В данном случае nginx выдаст нам абсолютно всё что у него есть.

Например так:

sudo nginx -T 2>/dev/null | grep -E "^[[:space:]]+server_name[[:space:]]+[a-z0-9\.\-]+" | sed -r 's/^[[:space:]]+server_name[[:space:]]+([a-z0-9\.\-]+).*/\1/g' | sed 's/^www\.//' | sed '/^localhost$/d' | sort | uniq | awk -v ip=$(ip route get 1.1.1.1 | grep src | awk '{print $NF}') '{print ip " " $0}'

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *