Инструкция: перевод подключений к БД на единое имя хоста infrascopedb
1. Цель
Во всех конфигурационных файлах комплекса Infrascope/Netright подключение к PostgreSQL задано по-разному:
| Файл | Текущий хост БД | Порт | БД | Формат |
|---|---|---|---|---|
/u01/netright-tomcat/netright/netright.properties | 127.0.0.1 | 5444 | aioc | netright.jdbc.url=jdbc:postgresql://... |
/u01/auth-service/config/application.properties | 127.0.0.1 | 5444 | aioc | spring.datasource.url=jdbc:postgresql://... |
/u01/http-proxy/conf/application.properties | 127.0.0.1 | 5444 | aioc | spring.datasource.url=jdbc:postgresql://... |
/u01/sql-proxy/config/application.properties | 127.0.0.1 | 5444 | aioc | spring.datasource.url=jdbc:postgresql://... |
/u01/nssoapp/conf/nsso.properties | 127.0.0.1 | 5444 | aioc | nsso.postgredef.jdbc.url=jdbc:postgresql://... |
/u01/sftp-proxy/conf/nsso.properties | 127.0.0.1 | 5444 | aioc | то же |
/u01/pam-tacacs/conf/kron_tacacs.conf | 10.20.30.41 | 5444 | aioc | db_host = "..." (отдельные поля) |
/etc/freeradius/3.0/mods-enabled/sql | hostname | 5444 | aioc | server = "...", radius_db = "host=..." (PG-строка подключения) |
Необходимо заменить все адреса хоста БД на единое имя infrascopedb и зафиксировать это имя в /etc/hosts.
Важно: меняется только имя хоста. Имена базы, пользователь, пароль и порт не затрагиваются
2. Фиксация имени infrascopedb через /etc/hosts
На каждом сервере, где установлены компоненты (или на сервере БД, если всё на одном хосте):
# Узнать реальный IP сервера БД
DB_IP=10.20.30.41 # подставить актуальный IP сервера PostgreSQL
grep -q infrascopedb /etc/hosts || echo "${DB_IP} infrascopedb" >> /etc/hosts
Проверка:
getent hosts infrascopedb
# должно вернуть: 10.20.30.41 infrascopedb
# Проверка доступности БД по новому имени
pg_isready -h infrascopedb -p 5444 -U aioc
psql "host=infrascopedb port=5444 dbname=aioc user=aioc sslmode=allow sslkey=/u01/kron/db-certs/aioc.pk8 sslcert=/u01/kron/db-certs/aioc.crt sslrootcert=/u01/kron/db-certs/root.crt" -c 'select 1'
3. Автоматическое изменение файлов
Ниже представлен скрипт который позволяет заменить адрес базы и/или пароль во всех конфигурационных файлах.
#!/usr/bin/env bash
set -Eeuo pipefail
set +x
VERSION_FILE="/u01/netright-tomcat/netright/netright.properties"
NETRIGHT_VERSION=$(awk -F '=' '
/^[[:space:]]*#/ { next }
/^[[:space:]]*netright\.version[[:space:]]*=/ {
value = $2
sub(/^[[:space:]]+/, "", value)
sub(/[[:space:]]+$/, "", value)
print value
}
' "$VERSION_FILE")
if [[ -z "$NETRIGHT_VERSION" ]]; then
echo "Ошибка: параметр netright.version не найден."
exit 1
fi
if [[ "$NETRIGHT_VERSION" != 25* && "$NETRIGHT_VERSION" != 26* ]]; then
echo "Ошибка: версия Netright $NETRIGHT_VERSION не поддерживается."
echo "Допустимые версии: 25.x и 26.x."
exit 1
fi
BACKUP_ROOT="/u01/backups"
FR_FILE="/etc/freeradius/3.0/mods-enabled/sql"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
CHANGE_ADDRESS=false
CHANGE_PASSWORD=false
NEW_ADDRESS=""
NEW_PASSWORD=""
ENCRYPTED_PASSWORD=""
FILES=(
"/u01/auth-service/config/application.properties"
"/u01/http-proxy/conf/application.properties"
"/u01/netright-tomcat/netright/netright.properties"
"/u01/nssoapp/conf/nsso.properties"
"/u01/pam-tacacs/conf/kron_tacacs.conf"
"/u01/sftp-proxy/conf/nsso.properties"
"/u01/sql-proxy/config/application.properties"
)
TMP_FILE=""
cleanup() {
[[ -n "$TMP_FILE" ]] && rm -f "$TMP_FILE"
unset NEW_PASSWORD ENCRYPTED_PASSWORD
}
trap cleanup EXIT
# ------------------------------------------------------------
# Help
# ------------------------------------------------------------
usage() {
cat <<EOF
Использование:
$0 --address
$0 --password
$0 --address --password
Параметры:
--address Изменить адрес PostgreSQL
--password Изменить пароль PostgreSQL
-h, --help Справка
EOF
}
# ------------------------------------------------------------
# Arguments
# ------------------------------------------------------------
while [[ $# -gt 0 ]]; do
case "$1" in
--address)
CHANGE_ADDRESS=true
;;
--password)
CHANGE_PASSWORD=true
;;
-h|--help)
usage
exit 0
;;
*)
echo "Неизвестный параметр: $1"
exit 1
;;
esac
shift
done
if [[ "$CHANGE_ADDRESS" == false && "$CHANGE_PASSWORD" == false ]]; then
usage
exit 1
fi
# ------------------------------------------------------------
# Check sudo
# ------------------------------------------------------------
echo "Проверка привилегий sudo..."
sudo -v || {
echo "Ошибка получения sudo."
exit 1
}
# ------------------------------------------------------------
# Input address
# ------------------------------------------------------------
if [[ "$CHANGE_ADDRESS" == true ]]; then
read -rp "Новый адрес PostgreSQL: " NEW_ADDRESS
if [[ ! "$NEW_ADDRESS" =~ ^[a-zA-Z0-9.-]+$ ]]; then
echo "Некорректный адрес."
exit 1
fi
if [[ -z "$NEW_ADDRESS" ]]; then
echo "Адрес не может быть пустым."
exit 1
fi
fi
# ------------------------------------------------------------
# Input password
# ------------------------------------------------------------
if [[ "$CHANGE_PASSWORD" == true ]]; then
echo
read -rsp "Новый пароль PostgreSQL: " NEW_PASSWORD
echo
read -rsp "Повторите пароль: " PASSWORD_CONFIRM
echo
if [[ "$NEW_PASSWORD" != "$PASSWORD_CONFIRM" ]]; then
echo "Пароли не совпадают."
exit 1
fi
if [[ -z "$NEW_PASSWORD" ]]; then
echo "Пароль не может быть пустым."
exit 1
fi
unset PASSWORD_CONFIRM
echo "Подготовка пароля..."
ENCRYPTED_PASSWORD="ENC($(eval "$(echo "c3VkbyAtdSBwYW11c2VyIGtlZHRvb2wgLWUgIiRORVdfUEFTU1dPUkQi" | base64 -d)"))" || {
echo "Ошибка шифрования пароля."
exit 1
}
if [[ ! "$ENCRYPTED_PASSWORD" =~ ^ENC\([^[:space:]]+\)$ ]]; then
echo "Некорректный результат шифрования."
exit 1
fi
fi
# ------------------------------------------------------------
# Prepare application backup
# ------------------------------------------------------------
APP_BACKUP="$BACKUP_ROOT/$TIMESTAMP"
mkdir -p "$APP_BACKUP"
chmod 700 "$APP_BACKUP"
echo
echo "Создание резервных копий приложений..."
for file in "${FILES[@]}"; do
[[ -f "$file" ]] || {
echo "Пропуск отсутствующего файла: $file"
continue
}
mkdir -p "$APP_BACKUP$(dirname "$file")"
cp -a "$file" "$APP_BACKUP$file"
echo "Backup: $file"
done
# ------------------------------------------------------------
# FreeRADIUS backup
# ------------------------------------------------------------
FR_REAL=$(readlink -f "$FR_FILE") || {
echo "Не удалось определить файл FreeRADIUS."
exit 1
}
if ! sudo test -f "$FR_REAL"; then
echo "Не найден файл FreeRADIUS: $FR_REAL"
exit 1
fi
FR_BACKUP="$BACKUP_ROOT/$TIMESTAMP/sql"
echo
echo "Создание отдельной резервной копии FreeRADIUS..."
sudo install -d -m 700 "$BACKUP_ROOT/$TIMESTAMP"
sudo cp -a "$FR_REAL" "$FR_BACKUP"
echo "Backup: $FR_BACKUP"
echo "Целевой файл: $FR_REAL"
# ------------------------------------------------------------
# Update application files
# ------------------------------------------------------------
echo
echo "Обновление конфигураций приложений..."
for file in "${FILES[@]}"; do
[[ -f "$file" ]] || continue
if [[ "$CHANGE_ADDRESS" == true ]]; then
case "$file" in
*/kron_tacacs.conf)
sed -i -E \
"s#(^[[:space:]]*db_host[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_ADDRESS}\2#" \
"$file"
;;
*)
sed -i -E \
"s#(jdbc:postgresql://)[^:/?]+#\1${NEW_ADDRESS}#" \
"$file"
;;
esac
fi
if [[ "$CHANGE_PASSWORD" == true ]]; then
case "$file" in
*/kron_tacacs.conf)
sed -i -E \
"s#(^[[:space:]]*db_pass[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${ENCRYPTED_PASSWORD}\2#" \
"$file"
;;
*)
sed -i -E \
"s#(^[[:space:]]*[^=]*password[[:space:]]*=[[:space:]]*\"?)[^\"]*(\"?[[:space:]]*)\$#\1${ENCRYPTED_PASSWORD}\2#" \
"$file"
;;
esac
fi
echo "Обновлён: $file"
done
# ------------------------------------------------------------
# Update FreeRADIUS using sudo
# ------------------------------------------------------------
echo
echo "Обновление FreeRADIUS..."
TMP_FILE=$(mktemp)
sudo cat "$FR_REAL" > "$TMP_FILE"
if [[ "$CHANGE_ADDRESS" == true ]]; then
sed -i -E \
-e "s#(host=)[^[:space:]]+#\1${NEW_ADDRESS}#g" \
-e "s#(^[[:space:]]*server[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_ADDRESS}\2#" \
"$TMP_FILE"
fi
if [[ "$CHANGE_PASSWORD" == true ]]; then
sed -i -E \
"s#(^[[:space:]]*password[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_PASSWORD}\2#" \
"$TMP_FILE"
fi
# Сохраняем исходные права, владельца и группу
read -r FR_UID FR_GID FR_MODE < <(
sudo stat -c '%u %g %a' "$FR_REAL"
)
# Установка изменённого файла через sudo
sudo install \
-o "$FR_UID" \
-g "$FR_GID" \
-m "$FR_MODE" \
"$TMP_FILE" \
"$FR_REAL"
rm -f "$TMP_FILE"
TMP_FILE=""
echo "FreeRADIUS обновлён."
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
unset ENCRYPTED_PASSWORD
echo
echo "============================================"
echo "Изменение конфигурации завершено."
echo "============================================"
echo
echo "Резервные копии приложений:"
echo "$APP_BACKUP"
echo
echo "Резервная копия FreeRADIUS:"
echo "$FR_BACKUP"
echo
echo "Проверка символической ссылки:"
ls -l "$FR_FILE"
echo
echo "Готово."
4. Перезапуск сервисов
infrascope -r all
После перезапуска проверить логи каждого сервиса на предмет ошибок подключения к БД.
5. Итоговая сводка изменений
| Файл | Параметр | Было | Стало |
|---|---|---|---|
| netright.properties | netright.jdbc.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| auth-service application.properties | spring.datasource.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| http-proxy application.properties | spring.datasource.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| sql-proxy application.properties | spring.datasource.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| nssoapp nsso.properties | nsso.postgredef.jdbc.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| nssoapp nsso.properties | nsso.default.jdbc.url | jdbc\:postgresql\://localhost:5444/nsso | jdbc\:postgresql\://infrascopedb:5444/nsso |
| sftp-proxy nsso.properties | nsso.postgredef.jdbc.url | jdbc:postgresql://127.0.0.1:5444/aioc?... | jdbc:postgresql://infrascopedb:5444/aioc?... |
| sftp-proxy nsso.properties | nsso.default.jdbc.url | jdbc\:postgresql\://localhost:5444/nsso | jdbc\:postgresql\://infrascopedb:5444/nsso |
| kron_tacacs.conf | db_host | 10.20.30.41 | infrascopedb |
| freeradius mods-enabled/sql | server, radius_db | hostname | infrascopedb |
| /etc/hosts | — | — | <DB_IP> infrascopedb |
Данные действия необходимо проделать на каждом узле единожды, дальнейшее изменение адреса базы происходит через редактирование /etc/hosts и перезапуск служб