본문 바로가기

Automation Tools/Ansible

ansible | [playbook] AWX에 windows data backup 스케줄 등록하기(win_copy+win_find+win_file)

반응형

개요


윈도우 호스트에 특정 경로의 DATA를 일주일에 1번 원격지 NAS로 백업을 해야 한다.

백업 스케줄 실행 시 다음과 같은 조건을 갖는다.

 

 

설정


환경

  • 윈도우 호스트 : 172.16.10.32
  • backup src : E:\test 아래 모든 디렉토리 및 파일
  • exclude path : E:\test\plo1
  • 원격지 NAS : 172.16.10.32
  • backup dest : Backup_Path

 

 

Inventory 작성

  • ansible_user, ansible_password 는 AWX에 Job Template 생성시 Credential에 정의 하였다.
  • 원격지 NAS에 접근하기 위한 계정은 Inventory 변수 내에 정의(nrm_backup_target_user, nrm_backup_target_password) 하였다.
  • 백업 제외 경로는 여러 경로가 있을 수 있어 list로 정의(nrm_backup_file_src_exclude) 하였다.
cat test_host.ini 
[test_host]
172.16.10.27 

[test_host:vars]

ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

nrm_backup_file_src=E:\\test
nrm_backup_file_src_exclude=["E:\\test\plo1"]
nrm_backup_file_dest="\\\\172.16.10.32\\Backup_Path"
nrm_backup_target_user=admin
nrm_backup_target_password=********

 

 

Playbook 작성

원격지 NAS에 백업 날짜로 디렉토리 생성

  • win_file 모듈 사용
  • 백업 날짜는 "gather_facts" 에 "ansible_date_time.date" 를 사용
  • 원격지 NAS 에 접근 계정은 become을 사용하여 정의
---
- hosts: all
  gather_facts: yes
  ignore_unreachable: yes
  become: yes
  become_method: runas
  become_flags: logon_type=new_credentials logon_flags=netcredentials_only
  vars:
    ansible_become_user: "{{ nrm_backup_target_user }}"
    ansible_become_pass: "{{ nrm_backup_target_password }}"

  tasks:
  - name: Create Directory
    win_file:
      path: "{{ nrm_backup_file_dest }}\\{{ansible_date_time.date }}"
      state: directory

 

  • 참고 : gather_facts의 ansible_date_time.date
    • "date": "2022-07-07"
            "tasks": [
                {
                    "hosts": {
                        "172.16.10.27": {
								...
                                "ansible_date_time": {
                                    "date": "2022-07-07", 
                                    "day": "07", 
                                    "epoch": "1657208555.22195", 
                                    "hour": "15", 
                                    "iso8601": "2022-07-07T06:42:35Z", 
                                    "iso8601_basic": "20220707T154235206340", 
                                    "iso8601_basic_short": "20220707T154235", 
                                    "iso8601_micro": "2022-07-07T06:42:35.206340Z", 
                                    "minute": "42", 
                                    "month": "07", 
                                    "second": "35", 
                                    "time": "15:42:35", 
                                    "tz": "Korea Standard Time", 
                                    "tz_offset": "+09:00", 
                                    "weekday": "Thursday", 
                                    "weekday_number": "4", 
                                    "weeknumber": "26", 
                                    "year": "2022"
                                },
                                ...

 

exclude 경로를 제외한 백업 실행

  • win_copy 모듈을 사용하여 복사 실행 시 exclude 옵션이 없어 win_find로 경로를 나열하고 when으로 exclude path를 비교하여 조건에 맞는 경로만 복사를 실행한다.
  • win_find에 결과 값을 "backup_dir"로 register.
  • win_find 결과
    • backup src인 E:\test 아래에는 plo1,plo2,plo3이라는 총 3개의 디렉토리가 있다.
					...
					"hosts": {
                        "172.16.10.27": {
                            "_ansible_no_log": false, 
                            "action": "win_find", 
                            "changed": false, 
                            "examined": 3, 
                            "files": [
                                {
                                    ...
                                    "path": "E:\\test\\plo1", 
                                    "size": 6
                                }, 
                                {
                                    ...
                                    "path": "E:\\test\\plo2", 
                                    "size": 6
                                }, 
                                {
                                    ...
                                    "path": "E:\\test\\plo3", 
                                    "size": 6
                                }
                            ], 
                            "matched": 3
                        }

 

  • win_find task
  - name: find directory
    win_find:
      paths: "{{ nrm_backup_file_src }}"
      file_type: directory
    register: backup_dir

 

 

  • win_copy 모듈을 사용하여 복사 실행
    • src : 소스 파일 경로
    • dest : 복사할 목적지 경로
    • remote_src(boolean)
      • no : ansible local 경로를 참조
      • yes : inventory 원격지 host의 경로를 참조
    • force(boolean)
      • yes : checksum 을 사용하여 수정된 파일 여부를 판단하고 복사할 지 여부를 결정
      • no : 목적지에 없는 파일이면 복사. checksum을 사용 하지 않음.
  • when : win_find register "backup_dir" files내에 path 값을 exclude path 와 비교
  - name: Run Windows Copy without exclude path
    win_copy:
      src: "{{ item.path }}"
      dest: "{{ nrm_backup_file_dest }}\\{{ ansible_date_time.date }}"
      remote_src: True
    when: item.path not in nrm_backup_file_src_exclude
    loop: "{{ backup_dir.files }}"

 

 

PlayBook 

> 10.windows_copy_to_backup.yml
---
- hosts: all
  gather_facts: yes
  ignore_unreachable: yes
  become: yes
  become_method: runas
  become_flags: logon_type=new_credentials logon_flags=netcredentials_only
  vars:
    ansible_become_user: "{{ nrm_backup_target_user }}"
    ansible_become_pass: "{{ nrm_backup_target_password }}"

  tasks:
  - name: Create Directory
    win_file:
      path: "{{ nrm_backup_file_dest }}\\{{ansible_date_time.date }}"
      state: directory

  - name: find directory
    win_find:
      paths: "{{ nrm_backup_file_src }}"
      file_type: directory
    register: backup_dir

  - name: Run Windows Copy without exclude path
    win_copy:
      src: "{{ item.path }}"
      dest: "{{ nrm_backup_file_dest }}\\{{ ansible_date_time.date }}"
      remote_src: True
    when: item.path not in nrm_backup_file_src_exclude
    loop: "{{ backup_dir.files }}"

 

 

Playbook 실행 결과

  • plo1 경로는 skipping 되었다.
...
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.16.10.27]
TASK [Create Directory] ********************************************************
ok: [172.16.10.27]
TASK [find directory] **********************************************************
ok: [172.16.10.27]
TASK [Run Windows Copy without exclude path] ***********************************
skipping: [172.16.10.27] => (item={'creationtime': 1657203579.7870688, 'filename': 'plo1', 'isshared': False, 'isarchive': False, 'isreadonly': False, 'ishidden': False, 'isdir': True, 'lastwritetime': 1657203646.7084227, 'size': 6, 'owner': '*****', 'attributes': 'Directory', 'lastaccesstime': 1657203646.7084227, 'path': 'E:\\test\\plo1', 'islnk': False}) 
changed: [172.16.10.27] => (item={'creationtime': 1657203588.3026268, 'filename': 'plo2', 'isshared': False, 'isarchive': False, 'isreadonly': False, 'ishidden': False, 'isdir': True, 'lastwritetime': 1657203638.0365472, 'size': 6, 'owner': '*****', 'attributes': 'Directory', 'lastaccesstime': 1657203638.0365472, 'path': 'E:\\test\\plo2', 'islnk': False})
changed: [172.16.10.27] => (item={'creationtime': 1657203597.9117823, 'filename': 'plo3', 'isshared': False, 'isarchive': False, 'isreadonly': False, 'ishidden': False, 'isdir': True, 'lastwritetime': 1657203631.317655, 'size': 6, 'owner': '*****', 'attributes': 'Directory', 'lastaccesstime': 1657203631.317655, 'path': 'E:\\test\\plo3', 'islnk': False})
PLAY RECAP *********************************************************************
172.16.10.27               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

 

AWX Gitlab 연동과 스케줄 등록

 

 

반응형