문제의 디렉터리가 충분히 오래된 경우(예: 30일 이상)에만 Ansible 작업을 트리거하는 방법은 무엇입니까?

문제의 디렉터리가 충분히 오래된 경우(예: 30일 이상)에만 Ansible 작업을 트리거하는 방법은 무엇입니까?

문제의 디렉터리가 충분히 오래된 경우(예: 30일 이상)에만 Ansible 작업을 트리거하는 방법은 무엇입니까?

비슷한 일을하고 싶다

- name: backup biggest files 
  #get difference between currentdate & last backup
  register: age 

문자열이나 정의된 when 절을 얻을 수 있다는 것을 알고 있지만 여기서는 어떻게 하는지 모르겠습니다.

예를 들어 , 내 목표는 /mnt/backup.YYYYMMDD30일이 넘은 경우 작업 목록을 만들어 새 날짜 디렉터리를 만들고 직접 백업하는 것입니다(동기화 방법이 좋을까요?).

이것을 어떻게 얻을 수 있나요?

획득 단계:

  • 마지막 백업 날짜 찾기
  • 현재 날짜 찾기
  • 그들 사이의 산술적 차이
  • yaml 파일의 작업에 when 문으로 차이점을 적용합니다.
 - name: Check the last backup date                                                                                                                                                          
    shell: |                                                                                                                                                                                  
      #or find module                                                                                
    register: lastone
                                                                                                                                                                        
  - name: Get current date for arithmetics                                                                                                                                                    
    shell: |                                                                                                                                                                                  
      echo $(date +%s)                                                                                                                                                                        
    register: currentdate                                                                                                                                                                     

  - name: Find ideal path to create new backup if last one is too old                                                                                                                         
    # define & create new directory if currentdate - lastone is over a numeric value (suffisant difference)                                                                                                                                                                            
    when: "{{ currentdate | int - lastone | int }}" > 40000  

여기서는 돼지 스타일 더미 시작 테스트를 위한 솔루션을 완성했습니다.

---                                                                                                                                                                                           
- hosts: localhost                                                                                                                                                                            
  become: true                                                                                                                                                                                
  become_method: sudo                                                                                                                                                                         
  become_user: francois                                                                                                                                                                       

  tasks:                                                                                                                                                                                      

  - name: Check the last backup date                                                                                                                                                          
    shell: |                                                                                                                                                                                  
      date +%s -r $(find /mnt{1,2,3}/ -type d -name "backup.*[0-9]" 2> /dev/null | sort | tail -1)                                                                                            
    args:                                                                                                                                                                                     
      executable: /bin/bash                                                                                                                                                                   
    register: lastone                                                                                                                                                                         

  - name: Get current date for arithmetics                                                                                                                                                    
    shell: |                                                                                                                                                                                  
      date +%s                                                                                                                                                                                
    register: currentdate                                                                                                                                                                     

  - set_fact:                                                                                                                                                                                 
      difference: "{{ currentdate.stdout | int - lastone.stdout | int }}"                                                                                                                   

  - name: Find ideal path to create new backup if last one is too old                                                                                                                         
    shell: |                                                                                                                                                                                  
      find /mnt{1,2,3}/ -type d -name "backup.*[0-9]" 2> /dev/null | sort -n | tail -1 | sed "s/\.[0-9].*/\.$(date +%Y%m%d)/"                                                                 
    args:                                                                                                                                                                                     
      executable: /bin/bash                                                                                                                                                                   
    register: rep                                                                                                                                                                             
    when:                                                                                                                                                                                     
      - difference | int > 4000                                                                                                                                                               

  - name: Create path                                                                                                                                                                         
    file:                                                                                                                                                                                     
      path: "{{ rep.stdout }}"                                                                                                                                                                
      state: directory                                                                                                                                                                        
      mode: "0755"                                                                                                                                                                            
    when:                                                                                                                                                                                     
      - rep is defined                                                                                                                                                                        
      - difference | int > 4000   

이렇게 하면 디렉토리가 설치 backup.20210630되어 있든 /mnt1(23여기 3).

답변1

주요 질문에 대해

관련 디렉토리가 충분히 오래된 경우에만 Ansible 작업을 트리거하는 방법은 무엇입니까? ...내 목표는 backup.YYYYMMDD30일 이상이면...

주어진 명명 규칙에 따라 작은 디렉터리 테스트를 설정했습니다.

$ ls -l
drwxr-xr-x. 2 user group     4096 Jan  2 00:00 backup.20220102
drwxr-xr-x. 2 user group     4096 Jan  9 00:00 backup.20220109
drwxr-xr-x. 2 user group     4096 Jan 16 00:00 backup.20220116
drwxr-xr-x. 2 user group     4096 Jan 23 00:00 backup.20220123
drwxr-xr-x. 2 user group     4096 Jan 30 00:00 backup.20220130
drwxr-xr-x. 2 user group     4096 Feb  6 00:00 backup.20220206

게다가mtime디렉토리 변경통과하다 touch -t YYMMDDHHMM.SS backup.YYYYMMDD.

$ stat backup.20220102/
  File: ‘backup.20220102/’
  Size: 4096            Blocks: 8          IO Block: 4096   directory
...
Access: (0755/drwxr-xr-x)  Uid: (1234/user)   Gid: (1234/group)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-01-02 00:00:00.000000000 +0100
Modify: 2022-01-02 00:00:00.000000000 +0100
Change: 2022-02-06 09:00:00.000000000 +0100
 Birth: -

[am]time속성이나 이름 접미사를 기준으로 비교가 가능합니다 YYYYMMDD. 당신은부터 시작할 수 있습니다find기준 치수.

---
- hosts: test
  become: false
  gather_facts: false

  tasks:

  - name: Find directories older than 30 days
    find:
      paths: "/home/{{ ansible_user }}"
      file_type: directory
      age: 30d
    register: result

  - name: Show result
    debug:
      msg: "{{ item[0] }}"
    loop:
      - "{{ result.files | flatten(levels=1) }}"
    loop_control:
      extended: yes
      label: "{{ ansible_loop.index0 }}"

그 다음에loop결과를 초과하다변하기 쉬운그리고데이터 필터링. 이 stat모듈을 확인해 볼 수도 있습니다.파일 또는 파일 시스템 상태 검색.

현재 날짜를 "찾으려면" 다음을 볼 수 있습니다.Ansible 사실.

---
- hosts: test
  become: false
  gather_facts: true

  tasks:

  - name: Show Gathered Facts
    debug:
      msg: "{{ ansible_facts }}"

왜냐하면 일반적으로 이미 수집되어 있기 때문입니다.

TASK [Show Gathered Facts] ******
ok: [test.example.com] =>
  msg:
    ...
    date_time:
      date: '2022-02-06'
      day: '06'
      epoch: '1644142041'
      hour: '11'
      iso8601: '2022-02-06T10:07:21Z'
      iso8601_basic: 20220206T110721823347
      iso8601_basic_short: 20220206T110721
      iso8601_micro: '2022-02-06T10:07:21.823347Z'
      minute: '07'
      month: '02'
      second: '21'
      time: '11:07:21'
      tz: CET
      tz_offset: '+0100'
      weekday: Sunday
      weekday_number: '0'
      weeknumber: '05'
      year: '2022'
    ...

당신은 할 수블록으로 작업 그룹화기반으로조건문.

관련 정보