일련번호가 2015040500인 DNS 영역이 있습니다.
오늘은 거기에 몇 가지 CNAME 레코드를 추가할 예정이므로 일련 번호를 늘리는 방법에 관심이 있습니다. 즉, 오늘 날짜를 기준으로 변경해야 한다는 뜻입니다. 예를 들어 2015042200이거나 1씩 늘려야 합니다. 2015040501이겠지?
답변1
당신은 당신이 원하는 무엇이든 할 수 있습니다~ 해야 하다새 일련 번호가 이전 일련 번호보다 큰지 확인하십시오.
그렇긴 하지만, 나는 다음 구성표에 따라 타임스탬프 기반 접근 방식을 권장합니다.
YYYYMMDDxx
여기서는 특정 날짜의 모든 편집 내용 xx
으로 시작 하고 증가합니다(다른 날짜에 편집할 경우 로 재설정 됨 ).00
xx
00
이 체계의 가장 큰 장점은 영역 파일이 마지막으로 수정된 날짜를 한 눈에 알 수 있다는 것입니다.
또한 시퀀스 번호 증가를 더욱 강력하게 만듭니다.
1
또 다른 방법은 파일을 편집하는 동안 시작하여 증가시키는 것입니다.
시퀀스 번호가 이미 타임스탬프 기반인 경우(그리고 2015040500
매우 유사해 보이는 경우) 해당 결정을 고수하고(귀하가 결정하지 않은 경우에도) 다음을 사용해야 합니다.논리적후임2015042200
답변2
시리얼에 유닉스 시간을 사용하기로 결정했습니다
- 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
답변3
다른 답변 참조안시푸르. 이 접근 방식은 완전히 유효합니다. 영역 구성은 템플릿에서 생성되고 간단한 표현식을 사용하여 시퀀스가 업데이트됩니다.진자 2주형. 내가 사용하는 방법은 현재 영역 파일에 현재 값이 있다는 것입니다. 추출해서 늘려보세요.
- name: get current bind9 serial
block:
- ansible.builtin.slurp:
path: "/etc/bind/zones/db.{{ vw_tld }}"
register: bind9_current
- ansible.builtin.set_fact:
bind9_serial_concat: "{{ (bind9_current.content | b64decode | regex_search('[0-9]+[ ]+; Serial'))[0:10] }}"
rescue:
- ansible.builtin.set_fact:
bind9_serial_concat: "1970010100"
- ansible.builtin.set_fact:
bind9_serial_date: "{{ bind9_serial_concat[0:8] }}"
bind9_serial_counter: "{{ bind9_serial_concat[8:10] }}"
- ansible.builtin.set_fact:
bind9_serial_new: "{{ now(fmt= '%Y%m%d') }}{{ '%02d' | format(bind9_serial_counter | int + 1) }}"
when: bind9_serial_date == now(fmt= "%Y%m%d")
- ansible.builtin.set_fact:
bind9_serial_new: "{{ now(fmt= '%Y%m%d') }}00"
when: bind9_serial_date != now(fmt= "%Y%m%d")
- name: bind9 database
ansible.builtin.template:
src: bind9.db.j2
dest: "/etc/bind/zones/db.{{ vw_tld }}"
- name: bind9 reverse database
ansible.builtin.template:
src: bind9.db.reverse.j2
dest: /etc/bind/zones/db.192.168
답변4
@tombart 답변이 작동하며 소스 제어가 아닌 모든 영역이 업데이트되는 소규모 연구실 환경에서 더 간단하고 쉽습니다.
#!/usr/bin/env bash
set -euo pipefail
: ${1?"Usage: $0 <zone file>"}
IFILE=$1
if [ ! -w "${IFILE}" ]; then
echo "Error cannot write to ${IFILE}"
exit
fi
if [ ! -w $(pwd) ]; then
echo "Error, sed needs write permission for temp file, add w to current directory"
exit
fi
PREV_SERIAL=$(grep -i Serial "${IFILE}" | awk '{print $1}')
TODAY=$(date +%Y%m%d00)
if [ "$PREV_SERIAL" -ge "${TODAY}" ]; then
NEW_SERIAL=$((PREV_SERIAL+1))
else
NEW_SERIAL=${TODAY}
fi
sed -i "s/${PREV_SERIAL}/${NEW_SERIAL}/" "${IFILE}"
printf "Zone: %s [%d -> %d]\n" "${IFILE}" "${PREV_SERIAL}" "${NEW_SERIAL}"