Предыстория. Есть необходимость удалённой репликации посредством 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 и подставилось пустое значение.