반응형
개요
윈도우 호스트에 특정 경로의 DATA를 일주일에 1번 원격지 NAS로 백업을 해야 한다.
백업 스케줄 실행 시 다음과 같은 조건을 갖는다.
- 특정 경로의 디렉토리는 백업대상에서 제외
- 원격지 NAS에 백업 날짜로 디렉토리를 생성하고 그 디렉토리에 백업
- 원격지 NAS에 접근 시 권한 필요
- 백업 실행 시 JOB, TASK 결과에 대한 Slack WebHook 알림을 받음.
- JOB 알림 설정 참조: ansible | [AWX] JOB Template 의 Schedule과 Notification
- TASK 알림 설정 참조 : ansible | AWX Playbook Task 실패 시 알림 설정
설정
환경
- 윈도우 호스트 : 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 연동과 스케줄 등록
- Gitlab 연동하여 playbook, inventory 불러오기 참조 :https://ploz.tistory.com/entry/32-AWX-Project-source-control
- AWX 스케줄 등록 참조 : https://ploz.tistory.com/entry/ansible-AWX-JOB-Template-%EC%9D%98-Schedule%EA%B3%BC-Notification
반응형
'Automation Tools > Ansible' 카테고리의 다른 글
[Ansible] [WARNING]: win_find failed to check some files, these files were ignored and will not be part of the result output(1) (0) | 2023.07.11 |
---|---|
[ansible AWX] 지나간 Jobs 삭제하기 (0) | 2023.07.10 |
ansible | [AWX] Local Script 실행 및 결과값 slack webhook 전송하기 (0) | 2022.07.04 |
ansible | inventory 내 다른 host 변수 참조 (0) | 2022.06.27 |
ansible | AWX Playbook Task 실패(or 성공) 시 알림 설정 (0) | 2022.06.22 |