업데이트된 파일을 사용할 수 있는 경우에만 명령을 실행하는 Ansible 플레이북

업데이트된 파일을 사용할 수 있는 경우에만 명령을 실행하는 Ansible 플레이북

일부 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 }}

관련 정보