web-dev-qa-db-ja.com

bind9 dnsゾーンでシリアル番号をインクリメントする方法

シリアル番号が2015040500のDNSゾーンがあります

今日はそこにCNAMEレコードを追加するので、シリアル番号をインクリメントする方法に興味があります。つまり、今日の日付に基づいて変更する必要があるということです。たとえば、2015042200になるか、1だけインクリメントして、 2015040501?

6
Shota

あなたはどんなに好きなことでもできます必須確認することは、新しいシリアル番号が古いシリアル番号より大きいことだけです。

そうは言っても、次のようなスキームに従うタイムスタンプベースのアプローチをお勧めします。

 YYYYMMDDxx

ここで、xx00で始まり、その日のすべての編集に対して増分されます(別の日に編集する場合は、xx00にリセットします)

このスキームの主な利点は、ゾーンファイルが最後に変更された日付も一目でわかることです。

また、シリアル番号の増分をより堅牢にします。

もう1つの方法は、1で始まり、ファイルを編集するたびにインクリメントすることです。

シリアル番号がすでにタイムスタンプに基づいている場合(および2015040500はそのように見える場合)、おそらくその決定に固執し(たとえ自分で作成したものでなくても)、logicalサクセサを使用します2015042200

8
umläute

私はシリアルに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
1
shcherbak

次を検索する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を超える変更を行うことはできません:)

0
Tombart