更新されたファイルが利用可能な場合にのみコマンドを実行するAnsible Playbook

更新されたファイルが利用可能な場合にのみコマンドを実行するAnsible Playbook

一部の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/「指定されたタイムスタンプファイルよりも最新のファイルがある場合にのみ再読み込みを実行してください。」と言うことができます。

ドキュメントを見ると、結果の数がゼロより大きい場合にのみリロードシーケンスを実行して実行するには、ビューおよび/またはwhenfindが必要です。しかし、以前は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 }}

おすすめ記事