一部のDNSゾーンはデータベースベースではなくファイルベースであり、変更できないいくつかの以前の設定のため、rsyncを介してプライマリからセカンダリに送信されます。
最近では、Ansible PlayBookを使用してさまざまなメンテナンスタスクを自動化する方法を学び、次のPlayBookを使用してすべての認証サーバーを自動的に再ロードできます。
---
- 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/
「指定されたタイムスタンプファイルよりも最新のファイルがある場合にのみ再読み込みを実行してください。」と言うことができます。
ドキュメントを見ると、結果の数がゼロより大きい場合にのみリロードシーケンスを実行して実行するには、ビューおよび/または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
セグメンテーションになったようです。時間形式の変更2回目です。バラより時間.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 }}