30
Сен

Скрипт смены динамического ip в /etc/hosts

Предыстория. Есть необходимость удалённой репликации посредством rsync, но конфигурационный файл не принимает разрешенные хосты по доменному имени, если они не прописаны в /etc/hosts. Но как быть если ip периодически меняется, из-за чего необходимо снова и снова лезть в конфиг rsync и менять в /usr/local/etc/rsyncd.conf параметр hosts allow = 91.195.184.9

Пример конфигурационного файла rsyncd.conf на FreeDSD:

[back]
path = /usr/local/backup/
uid = root
read only = yes
list = yes
comment = ETC directory
hosts allow = hd.zp.ua — наш домен сервера, которому разрешена авторизация
auth users = hd
secrets file = /usr/local/etc/rsyncd.scrt

1. Добавляем в /etc/hosts запись :

8.8.8.8 hd.zp.ua

Сам скрипт /etc/rsync.sh :

#!/usr/local/bin/bash
hostname=hd.zp.ua
ip_new=`dig +short $hostname`
if [ -n "$ip_new" ]; then
echo new_ip: $ip_new
else
echo Could not resolve hostname.
fi
ip_old=`cat /etc/hosts | grep " $hostname" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`
echo old_ip: $ip_old

if [ "$ip_old" = "" ]; then
echo "old ip not read"
sed -i -e "s/ $hostname/$ip_new $hostname/g" /etc/hosts
else
echo "old ip read"
fi

if [ "$ip_old" != "$ip_new" ]
then
echo "need change"
sed -i -e "s/$ip_old/$ip_new/g" /etc/hosts
else
echo "same"
exit 1
fi

Делаем исполняемым chmod 755 /etc/rsync.sh

Добавляем в cron на выполнение, например раз в час.

nano /etc/crontab

*       */1     *       *       *       root    /etc/rsync.sh > /dev/null 2> /dev/null

Работа скрипта

[[email protected] /usr/home/kulyavlob]# /etc/rsync.sh
new_ip: 193.200.173.186
old_ip: 8.8.8.8
need change
[[email protected] /usr/home/kulyavlob]# /etc/rsync.sh
new_ip: 193.200.173.186
old_ip: 193.200.173.186
same

Теперь нет необходимости каждый раз изменять конфиг rsync.

Для работы на Centos необходимо установить yum install bind-utils

upd 1.11.2015 добавлена часть скрипта, на случай если не был отрезолвлен hostname и подставилось пустое значение.