일부 DNS 영역은 데이터베이스 기반이 아닌 파일 기반이며 변경할 수 없는 일부 이전 설정으로 인해 rsync를 통해 기본에서 보조로 전송됩니다.
최근에는 Ansible 플레이북을 통해 다양한 유지 관리 작업을 자동화하는 방법을 배웠으며 다음 플레이북을 사용하면 모든 인증 서버를 자동으로 다시 로드할 수 있습니다.
---
- hosts: auth
name: Reload PDNS auth servers
become: no
tasks:
- name: Check if PDNS is running
service:
name: pdns
state: started
- name: Execute reload command.
command: /usr/bin/pdns_control reload
이것은 잘 작동하며 reload 명령이 서버의 로드를 거의 증가시키지 않는다는 점을 고려하면 "충분히 좋은" 것으로 간주됩니다. 그러나 가벼운 OCD가 경련을 일으키고진짜/etc/powerdns/bindbackend/zones/
" 지정된 타임스탬프 파일보다 최신 파일이 있는 경우에만 다시 로드를 수행하십시오."라고 말할 수 있기를 원합니다.
문서에서 본 바에 따르면 결과 수가 0보다 큰 경우에만 다시 로드 시퀀스를 실행하고 수행하려면 보기 when
및/또는 find
절이 필요합니다. 그러나 이전에 find
"모든"을 공식화하는 방법을 잘 모르겠습니다. /tmp/timestamp
파일의 ansible 플레이북 구문에 있습니다.
어떤 충고?
답변1
내 생각엔 이것이 당신이 찾고 있는 것 같아요
- name: Find timestamp
find:
paths: /tmp
patterns: timestamp
register: my_timestamp
- name: Timestamp not found. End of host.
block:
- debug:
msg: /tmp/timestamp not found. End of host.
- meta: end_host
when: my_timestamp.matched == 0
- name: Find all zone files
find:
paths: "{{ zones_dir }}"
register: my_zones
- name: Find zone files newer than timestamp
set_fact:
my_zones_newer: "{{ my_zones.files|json_query(query)
map('basename')|
list }}"
vars:
query: "[?mtime > to_number('{{ my_timestamp.files.0.mtime }}')].path"
- block:
- name: "Reload {{ my_zones_newer|join(',') }}"
command: /usr/bin/pdns_control reload
- name: Touch timestamp
file:
state: touch
path: /tmp/timestamp
when: my_zones_newer|length > 0
"모든 영역 파일 찾기"와 "타임스탬프 터치" 사이의 중요한 부분
이 임계 섹션에 영역 파일이 기록되면 다시 로드가 트리거되지 않습니다. 이 문제를 해결하려면 잠재적인 위험을 피하기 위해 발견된 최신 영역 파일의 값으로 mtime
파일을 설정하십시오 . /tmp/timestamp
블록 변경
- block:
- name: "Reload {{ my_zones_newer|join(',') }}"
command: /usr/bin/pdns_control reload
- set_fact:
my_mtime_max: "{{ my_zones.files|json_query('[].mtime')|max }}"
- file:
state: touch
modification_time: "{{ '%Y%m%d%H%M.%S'|
strftime(my_mtime_max|
float|
round(precision=0, method='ceil')|
int) }}"
path: /tmp/timestamp
when: my_zones_newer|length > 0
세분화가 된 것 같습니다.시간 형식 수정두 번째입니다. 바라보다시간.strf시간. 따라서 my_mtime_max
변수를 반올림해야 하며 method='ceil'
초의 반올림된 부분에는 위험이 남습니다.
mtime을 타임스탬프에 저장
강력한 솔루션은 mtime
파일에 저장하는 것입니다 timestamp
. 예를 들어,
- name: Read modification time from /tmp/timestamp (default=0)
set_fact:
my_mtime_max: "{{ lookup('pipe', my_command) }}"
vars:
my_command: sh -c '[ -e /tmp/timestamp ] && cat /tmp/timestamp || echo 0'
- name: Find all zone files
find:
paths: "{{ zones_dir }}"
register: my_zones
- name: Find zone files newer than timestamp
set_fact:
my_zones_newer: "{{ my_zones.files|json_query(query)|
map('basename')|
list }}"
vars:
query: "[?mtime > to_number('{{ my_mtime_max }}')].path"
- block:
- name: "Reload {{ my_zones_newer|join(',') }}"
command: /usr/bin/pdns_control reload
- name: Set mtime of newest zone file to my_mtime_max
set_fact:
my_mtime_max: "{{ my_zones.files|json_query('[].mtime')|max }}"
- name: Store my_mtime_max in /tmp/timestamp
template:
src: timestamp.j2
dest: /tmp/timestamp
when: my_zones_newer|length > 0
shell> cat timestamp.j2
{{ my_mtime_max }}