У меня есть два DNS сервера на BIND9 (master & slave). Изредка необходимо во всех зонах (около 15) менять направление на другой сервер. Однако, нужно исключить А запись с именем 3-его уровня, которое содержит слово radio. Реализовано это следующим скриптом с использованием sed.
#!/bin/bash serial=`date '+%y%m%d%M%S'` bindpath=/etc/bind find $bindpath/db.* -exec sed -i 's/\(.*\); Serial/\t\t\t\t'$serial' ; Serial/g' {} \; find $bindpath/db.* -exec sed -i '/radio/!s/'$1'/'$2'/g' {} \; service bind9 restart
Вторая строка получает текущую дату и время вида 1605181417, которое используется, как Serial (четвертая строка), значение по которому bind понимает, что данные в зоне изменены. В пятой строке мы меняем один IP на другой.
Допустим у нас есть зона domain.com, данные о которой хранятся в фалйе /etc/bind/db.domain.com
$TTL 3600 domain.com. IN SOA ns1.domain.com admin.gmail.com. ( 1605182042 ; Serial 600 ; Refresh 3600 ; Retry 1w ; Expire 300 ; Minimum TTL ) IN NS ns1.domain.com. IN NS ns2.domain.com. IN A 111.111.111.111 www IN A 111.111.111.111 radio IN A 777.777.777.777
И вот мы запускаем наш скрипт
# ./change_ip 111.111.111.111 222.222.222.222
И в итоге наш файл приобретает вид
$TTL 3600 domain.com. IN SOA ns1.domain.com admin.gmail.com. ( 1605182143 ; Serial 600 ; Refresh 3600 ; Retry 1w ; Expire 300 ; Minimum TTL ) IN NS ns1.domain.com. IN NS ns2.domain.com. IN A 222.222.222.222 www IN A 222.222.222.222 radio IN A 777.777.777.777
Bind перезагружается, данные реплицируются на slave dns. Имя radio.domain.com доступно по старому IP. Все красиво 🙂