Apps: "Bash", "Docker" & etc.
В этой заметке описан один из этапов реализации поставленной в вышестоящей публикации задачи автоматизации процедур развёртывания тестовых стендов из docker-контейнеров.
Дополнительный конфигурационный файл для включения поддержки использования фронтальным web-прокси выделенного IP-адреса:
# vi /usr/local/etc/devops/conf/front-nginx.conf
# Имя контейнера фронтального web-прокси
FRONTNAME="front-nginx"
# Имя сетевого интерфейса и IP-адрес для приёма трафика
# (если указаны эти два параметра, то весь трафик к Docker будет пущен через них)
# (если параметры не использовать, то трафик к Docker пойдёт через несущую систему)
WARPINT="eth0:1"
EXTERNIP="10.20.30.45/24"
FRONTNAME="front-nginx"
# Имя сетевого интерфейса и IP-адрес для приёма трафика
# (если указаны эти два параметра, то весь трафик к Docker будет пущен через них)
# (если параметры не использовать, то трафик к Docker пойдёт через несущую систему)
WARPINT="eth0:1"
EXTERNIP="10.20.30.45/24"
Библиотека функций назначения фронтальному web-прокси выделенного IP-адреса:
# vi /usr/local/etc/devops/lib/front-ip-dedicated.sh.snippet
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция активация пересылки трафика к фронтальному web-прокси
function front-ip-start() {
# Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')
# Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')
if [ ! -z "${INNERIPWOM}" ] ; then
# Проверяем возможное наличие активного IP-адреса
if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then
# Активируем дополнительный IP-адрес
ip addr add ${EXTERNIP} dev ${WARPINT}
# После активации IP-адреса добавляем правила Iptables
if [ "${?}" -eq "0" ] ; then
echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно активирован."
# Задаём правила перехвата, перенаправления и допуска трафика извне и обратно между внешним и внутренним IP
# (предварительно зачищаем возможно имеющиеся правила от предыдущего запуска)
iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I PREROUTING 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
#
iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I OUTPUT 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
#
iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I POSTROUTING 1 -s ${INNERIPWOM} -j SNAT --to-source ${EXTERNIPWOM}
#
iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done
iptables -t filter -I FORWARD 1 --source 0.0.0.0/0 --destination ${INNERIPWOM} -j ACCEPT
else
FORTH=false
echo "${DATE}: Сбой при добавлении внешнего IP-адреса \"${EXTERNIP}\"."
fi
else
echo "${DATE}: Добавление внешнего IP-адреса не требуется: заданный IP-адрес \"${EXTERNIP}\" уже активен на сетевом интерфейсе \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\"."
fi
else
FORTH=false
echo "${DATE}: Сбой при добавлении внешнего IP-адреса: не получен внутренний IP-адрес фронтального web-прокси."
fi
return ${?}
}
# Функция выключения пересылки трафика к фронтальному web-прокси
function front-ip-stop() {
# Удаляем заданный внешний IP-адрес
ip addr del ${EXTERNIP} dev ${WARPINT} 2>/dev/null
# Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')
# Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')
# Удаляем все связанные с фронтальным web-прокси правила Iptables
iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done
# Проверяем успешность удаления заданного внешнего IP-адреса
if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then
echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно удалён."
else
FORTH=false
echo "${DATE}: Сбой при удалении внешнего IP-адреса \"${EXTERNIP}\" с заданного интерфейса \"{WARPINT}\" (он всё ещё привязан к интерфейсу \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\")."
fi
return ${?}
}
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция активация пересылки трафика к фронтальному web-прокси
function front-ip-start() {
# Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')
# Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')
if [ ! -z "${INNERIPWOM}" ] ; then
# Проверяем возможное наличие активного IP-адреса
if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then
# Активируем дополнительный IP-адрес
ip addr add ${EXTERNIP} dev ${WARPINT}
# После активации IP-адреса добавляем правила Iptables
if [ "${?}" -eq "0" ] ; then
echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно активирован."
# Задаём правила перехвата, перенаправления и допуска трафика извне и обратно между внешним и внутренним IP
# (предварительно зачищаем возможно имеющиеся правила от предыдущего запуска)
iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I PREROUTING 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
#
iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I OUTPUT 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
#
iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -I POSTROUTING 1 -s ${INNERIPWOM} -j SNAT --to-source ${EXTERNIPWOM}
#
iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done
iptables -t filter -I FORWARD 1 --source 0.0.0.0/0 --destination ${INNERIPWOM} -j ACCEPT
else
FORTH=false
echo "${DATE}: Сбой при добавлении внешнего IP-адреса \"${EXTERNIP}\"."
fi
else
echo "${DATE}: Добавление внешнего IP-адреса не требуется: заданный IP-адрес \"${EXTERNIP}\" уже активен на сетевом интерфейсе \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\"."
fi
else
FORTH=false
echo "${DATE}: Сбой при добавлении внешнего IP-адреса: не получен внутренний IP-адрес фронтального web-прокси."
fi
return ${?}
}
# Функция выключения пересылки трафика к фронтальному web-прокси
function front-ip-stop() {
# Удаляем заданный внешний IP-адрес
ip addr del ${EXTERNIP} dev ${WARPINT} 2>/dev/null
# Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')
# Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')
# Удаляем все связанные с фронтальным web-прокси правила Iptables
iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done
# Проверяем успешность удаления заданного внешнего IP-адреса
if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then
echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно удалён."
else
FORTH=false
echo "${DATE}: Сбой при удалении внешнего IP-адреса \"${EXTERNIP}\" с заданного интерфейса \"{WARPINT}\" (он всё ещё привязан к интерфейсу \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\")."
fi
return ${?}
}