У меня есть два 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. Все красиво 🙂
 
                                                                            