シリアル番号が2015040500のDNSゾーンがあります
今日はそこにCNAMEレコードを追加するので、シリアル番号をインクリメントする方法に興味があります。つまり、今日の日付に基づいて変更する必要があるということです。たとえば、2015042200になるか、1だけインクリメントして、 2015040501?
あなたはどんなに好きなことでもできます必須確認することは、新しいシリアル番号が古いシリアル番号より大きいことだけです。
そうは言っても、次のようなスキームに従うタイムスタンプベースのアプローチをお勧めします。
YYYYMMDDxx
ここで、xx
は00
で始まり、その日のすべての編集に対して増分されます(別の日に編集する場合は、xx
を00
にリセットします)
このスキームの主な利点は、ゾーンファイルが最後に変更された日付も一目でわかることです。
また、シリアル番号の増分をより堅牢にします。
もう1つの方法は、1
で始まり、ファイルを編集するたびにインクリメントすることです。
シリアル番号がすでにタイムスタンプに基づいている場合(および2015040500
はそのように見える場合)、おそらくその決定に固執し(たとえ自分で作成したものでなくても)、logicalサクセサを使用します2015042200
私はシリアルにUNIX時間を使うことにしました
- name: "{{ role_path|basename }} | get unix time"
Shell: echo $(date +%s)
register: unix_time_stamp
delegate_to: localhost
run_once: true
become: no
#
- name: "{{ role_path|basename }} setting execution facts"
set_fact:
__bind9_zone_serial: "{{ unix_time_stamp.stdout }}"
run_once: true
become: no
次を検索するbashスクリプト:
12345 ; Serial
ディレクトリ/etc/bind/zones
。 ; Serial
(大文字と小文字を区別)の前の任意の番号と一致する必要があります。そして、それをYYYYMMDDxx
の形式に置き換えます。
#!/bin/bash
ZONES_PATH="/etc/bind/zones"
DATE=$(date +%Y%m%d)
# we're searching for line containing this comment
NEEDLE="Serial"
for ZONE in $(ls -1 $ZONES_PATH) ; do
curr=$(/bin/grep -e "${NEEDLE}$" $ZONES_PATH/${ZONE} | /bin/sed -n "s/^\s*\([0-9]*\)\s*;\s*${NEEDLE}\s*/\1/p")
# replace if current date is shorter (possibly using different format)
if [ ${#curr} -lt ${#DATE} ]; then
serial="${DATE}00"
else
prefix=${curr::-2}
if [ "$DATE" -eq "$prefix" ]; then # same day
num=${curr: -2} # last two digits from serial number
num=$((10#$num + 1)) # force decimal representation, increment
serial="${DATE}$(printf '%02d' $num )" # format for 2 digits
else
serial="${DATE}00" # just update date
fi
fi
/bin/sed -i -e "s/^\(\s*\)[0-9]\{0,\}\(\s*;\s*${NEEDLE}\)$/\1${serial}\2/" ${ZONES_PATH}/${ZONE}
echo "${ZONE}: "
grep "; ${NEEDLE}$" $ZONES_PATH/${ZONE}
done
git
リポジトリで管理されているバインド構成の変更されたバージョン。変更されたゾーンファイルのシリアルのみを更新します。
#!/bin/bash
ZONES_PATH="$(pwd)/zones"
REPO_PATH="$(git rev-parse --show-toplevel)"
DATE=$(date +%Y%m%d)
NEEDLE="Serial"
for ZONE in $(git diff --name-only --diff-filter=AM `git merge-base Origin/master HEAD` $ZONES_PATH) ; do
curr=$(/bin/grep -e "${NEEDLE}$" ${REPO_PATH}/${ZONE} | /bin/sed -n "s/^\s*\([0-9]*\)\s*;\s*${NEEDLE}\s*/\1/p")
if [ ${#curr} -lt ${#DATE} ]; then
serial="${DATE}00"
else
prefix=${curr::-2}
if [ "$DATE" -eq "$prefix" ]; then # same day
num=${curr: -2} # last two digits from serial number
num=$((10#$num + 1)) # force decimal representation, increment
serial="${DATE}$(printf '%02d' $num )" # format for 2 digits
else
serial="${DATE}00" # just update date
fi
fi
/bin/sed -i -e "s/^\(\s*\)[0-9]\{0,\}\(\s*;\s*${NEEDLE}\)$/\1${serial}\2/" ${REPO_PATH}/${ZONE}
echo "${ZONE}: "
grep "; ${NEEDLE}$" ${REPO_PATH}/${ZONE}
done
注: 1日で99を超える変更を行うことはできません:)