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