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

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

[root@hd /usr/home/kulyavlob]# /etc/rsync.sh
new_ip: 193.200.173.186
old_ip: 8.8.8.8
need change
[root@hd /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 и подставилось пустое значение.